跳转到内容

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

不要把 MIDPOINT、BID、ASK 的 volume 当作真实成交量来用。只有 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合约找不到或不唯一。先跑合约详情,补 primaryExchange、conId 或本地代码。
300取消时找不到对应 ticker。如果前面权限失败,说明订阅未建立,记录即可。