请求逐笔数据
reqTickByTickData() 用来订阅实时逐笔数据。它不是普通一档行情,也不是历史逐笔数据。
官方参考:Tick-by-Tick Data
app.reqTickByTickData( reqId, contract, tickType, numberOfTicks, ignoreSize,)| 参数 | 示例 | 中文说明 |
|---|---|---|
reqId | 97901 | 请求编号,用来匹配回调和取消订阅。 |
contract | aapl_stock() | 合约对象。 |
tickType | "Last" | 逐笔类型,可用 Last、AllLast、BidAsk、MidPoint。 |
numberOfTicks | 0 | 0 表示直接进入实时订阅;大于 0 时,TWS 会先返回一段近期逐笔数据,再继续实时推送。 |
ignoreSize | False | 主要用于 BidAsk。设为 True 时,只有 bid size / ask size 变化而价格不变的更新会被忽略。 |
tickType 必须按官方大小写填写。Last 和 AllLast 都进入 tickByTickAllLast(),区别在于 AllLast 包含更多特殊成交类型。
同一个合约不要在 15 秒内连续发起多个逐笔请求。程序里如果需要依次测试 Last、BidAsk、MidPoint、AllLast,应在每次请求和取消之间留出间隔。
请求 Last 成交
Section titled “请求 Last 成交”app.reqTickByTickData( 97901, aapl_stock(), "Last", 0, False,)请求 AllLast 成交
Section titled “请求 AllLast 成交”app.reqTickByTickData( 97904, aapl_stock(), "AllLast", 0, False,)AllLast 适合做更完整的成交记录。它可能包含 Last 不包含的成交类型,因此策略里要根据 tickAttribLast、exchange 和 specialConditions 再做过滤。
请求 BidAsk 报价
Section titled “请求 BidAsk 报价”app.reqTickByTickData( 97902, aapl_stock(), "BidAsk", 0, True,)ignoreSize=True 表示忽略只有 bid/ask size 变化的更新,适合减少无用回调。需要完整盘口变化时可以设为 False。
请求 MidPoint
Section titled “请求 MidPoint”app.reqTickByTickData( 97903, aapl_stock(), "MidPoint", 0, False,)参考边界样例
Section titled “参考边界样例”AAPL 三类逐笔请求已经成功发送到 TWS;在缺少对应实时行情权限时,会进入 error() 回调:
ERROR=reqId=97901;type=Last;code=10089;msg=请求的市场数据对于API来说需要额外订阅。ERROR=reqId=97902;type=BidAsk;code=10089;msg=请求的市场数据对于API来说需要额外订阅ERROR=reqId=97903;type=MidPoint;code=10089;msg=请求的市场数据对于API来说需要额外订阅ERROR=reqId=97904;type=AllLast;code=10089;msg=请求的市场数据对于API来说需要额外订阅如果看到 10189 或 10089,优先检查 IBKR 市场数据订阅、模拟账户行情共享、产品是否支持该逐笔类型,以及是否被其他登录会话占用,不要先改 Python 代码。
逐笔数据量大,订阅前要明确用途。不要对大量股票同时开逐笔订阅;先用 1 个合约确认权限、回调和取消逻辑,再扩展到更多标的。