请求实时 5 秒线
reqRealTimeBars() 用来订阅实时 5 秒 K 线。它不是任意周期 K 线接口,barSize 必须传 5。
app.reqRealTimeBars(reqId, contract, barSize, whatToShow, useRTH, realTimeBarsOptions)这行代码本身不会直接返回数据。请求发送后,数据从 realtimeBar() 回调进入程序;如果失败,原因从 error() 回调进入程序。
Python 示例
Section titled “Python 示例”from ibapi.contract import Contract
def stock_contract(symbol: str) -> Contract: """创建美股股票合约。""" contract = Contract() contract.symbol = symbol # 股票代码,例如 AAPL contract.secType = "STK" # STK 表示股票 contract.exchange = "SMART" # SMART 让 IBKR 自动路由 contract.currency = "USD" # 美股常用 USD return contract
contract = stock_contract("AAPL")
app.reqRealTimeBars( 97201, # reqId:请求编号,取消时也要用这个编号 contract, # contract:合约对象,例如 AAPL 股票 5, # barSize:固定为 5 秒 "TRADES", # whatToShow:TRADES / MIDPOINT / BID / ASK True, # useRTH:是否只使用常规交易时段 [], # realTimeBarsOptions:普通请求为空)| 参数 | 中文解释 | 注意事项 |
|---|---|---|
reqId | 请求编号 | 必须在程序内唯一。后续 realtimeBar()、error()、cancelRealTimeBars() 都靠它关联同一个订阅。 |
contract | 合约对象 | 必须能被 TWS 唯一识别。不确定时先用 reqContractDetails() 查 conId、交易所和币种。 |
barSize | bar 周期 | 只能传 5。传其他数值通常不会得到想要的周期。 |
whatToShow | 数据类型 | 常用 TRADES、MIDPOINT、BID、ASK。它会影响价格和成交量字段的含义。 |
useRTH | 是否只看常规交易时段 | True 只看常规交易时段;False 包含盘前盘后。策略、图表和回测口径要保持一致。 |
realTimeBarsOptions | 额外选项 | 普通请求传空列表 []。只有官方或 IBKR 支持指定 TagValue 时才填写。 |
whatToShow 怎么选
Section titled “whatToShow 怎么选”| 值 | 含义 | 适合场景 |
|---|---|---|
TRADES | 成交聚合 | 需要成交价、成交量、成交笔数时使用。 |
MIDPOINT | 买卖价中间价 | 外汇、价差观察或不想只看成交价时使用。 |
BID | 买价聚合 | 关注买一侧报价变化时使用。 |
ASK | 卖价聚合 | 关注卖一侧报价变化时使用。 |
不要把 MIDPOINT、BID、ASK 的 volume 当作真实成交量来用。只有 TRADES 更接近成交聚合的语义。
| 检查项 | 为什么 |
|---|---|
| TWS API 已启用 | 没有 API 连接,请求根本到不了 TWS。 |
收到 nextValidId() | 说明 Socket 连接已完成,可以开始发请求。 |
| 合约能唯一识别 | 合约错误会先触发 200 或无有效数据。 |
| 有行情权限或可接受权限错误 | 5 秒线通常需要对应交易所、品种和 API 场景的数据权限。 |
| 订阅数量受控 | 5 秒线是持续订阅,会占用行情行数。 |
AAPL 参考输出
Section titled “AAPL 参考输出”请求 AAPL 5 秒线时,连接、请求和取消动作都能到达 TWS;账户没有对应 API 实时行情权限时,会收到权限错误而不是 5 秒 bar:
CONNECTED=TrueREQUEST_SENT=TrueCANCEL_SENT=TrueBAR_ROWS=0ERROR=reqId=97201;code=420;msg=实时查询无效:No market data permissions for ISLAND STK. 请求的市场数据对于API来说需要额外订阅。点击“市场数据连接”对话框中的链接获取更多详情。ERROR=reqId=97201;code=300;msg=无法使用tickerId找到EId::97201这表示调用格式和连接链路没有问题,真正挡住数据的是市场数据权限。遇到这种结果时,应先检查账户的行情订阅、合约交易所和数据源,不要盲目改端口、重装 API 或重写连接代码。
| 错误 | 含义 | 处理 |
|---|---|---|
420 | 没有对应市场数据权限,或数据源不可用。 | 检查市场数据订阅、交易所和合约字段。 |
10089 | API 行情需要额外订阅。 | 补齐行情权限,或改用可用的延迟行情/其他接口。 |
200 | 合约找不到或不唯一。 | 先跑合约详情,补 primaryExchange、conId 或本地代码。 |
300 | 取消时找不到对应 ticker。 | 如果前面权限失败,说明订阅未建立,记录即可。 |