跳转到内容

请求实时 5 秒线

reqRealTimeBars() 用来订阅实时 5 秒 K 线。它不是任意周期 K 线接口,barSize 必须传 5

官方参考:5 Second Real Time Bars

app.reqRealTimeBars(reqId, contract, barSize, whatToShow, useRTH, realTimeBarsOptions)

这行代码本身不会直接返回数据。请求发送后,数据从 realtimeBar() 回调进入程序;如果失败,原因从 error() 回调进入程序。

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、交易所和币种。
barSizebar 周期只能传 5。传其他数值通常不会得到想要的周期。
whatToShow数据类型常用 TRADESMIDPOINTBIDASK。它会影响价格和成交量字段的含义。
useRTH是否只看常规交易时段True 只看常规交易时段;False 包含盘前盘后。策略、图表和回测口径要保持一致。
realTimeBarsOptions额外选项普通请求传空列表 []。只有官方或 IBKR 支持指定 TagValue 时才填写。
含义适合场景
TRADES成交聚合需要成交价、成交量、成交笔数时使用。
MIDPOINT买卖价中间价外汇、价差观察或不想只看成交价时使用。
BID买价聚合关注买一侧报价变化时使用。
ASK卖价聚合关注卖一侧报价变化时使用。

不要把 MIDPOINTBIDASKvolume 当作真实成交量来用。只有 TRADES 更接近成交聚合的语义。

检查项为什么
TWS API 已启用没有 API 连接,请求根本到不了 TWS。
收到 nextValidId()说明 Socket 连接已完成,可以开始发请求。
合约能唯一识别合约错误会先触发 200 或无有效数据。
有行情权限或可接受权限错误5 秒线通常需要对应交易所、品种和 API 场景的数据权限。
订阅数量受控5 秒线是持续订阅,会占用行情行数。

请求 AAPL 5 秒线时,连接、请求和取消动作都能到达 TWS;账户没有对应 API 实时行情权限时,会收到权限错误而不是 5 秒 bar:

CONNECTED=True
REQUEST_SENT=True
CANCEL_SENT=True
BAR_ROWS=0
ERROR=reqId=97201;code=420;msg=实时查询无效:No market data permissions for ISLAND STK. 请求的市场数据对于API来说需要额外订阅。点击“市场数据连接”对话框中的链接获取更多详情。
ERROR=reqId=97201;code=300;msg=无法使用tickerId找到EId::97201

这表示调用格式和连接链路没有问题,真正挡住数据的是市场数据权限。遇到这种结果时,应先检查账户的行情订阅、合约交易所和数据源,不要盲目改端口、重装 API 或重写连接代码。

错误含义处理
420没有对应市场数据权限,或数据源不可用。检查市场数据订阅、交易所和合约字段。
10089API 行情需要额外订阅。补齐行情权限,或改用可用的延迟行情/其他接口。
200合约找不到或不唯一。先跑合约详情,补 primaryExchangeconId 或本地代码。
300取消时找不到对应 ticker。如果前面权限失败,说明订阅未建立,记录即可。