跳转到内容

请求逐笔数据

reqTickByTickData() 用来订阅实时逐笔数据。它不是普通一档行情,也不是历史逐笔数据。

官方参考:Tick-by-Tick Data

app.reqTickByTickData(
reqId,
contract,
tickType,
numberOfTicks,
ignoreSize,
)
参数示例中文说明
reqId97901请求编号,用来匹配回调和取消订阅。
contractaapl_stock()合约对象。
tickType"Last"逐笔类型,可用 LastAllLastBidAskMidPoint
numberOfTicks00 表示直接进入实时订阅;大于 0 时,TWS 会先返回一段近期逐笔数据,再继续实时推送。
ignoreSizeFalse主要用于 BidAsk。设为 True 时,只有 bid size / ask size 变化而价格不变的更新会被忽略。

tickType 必须按官方大小写填写。LastAllLast 都进入 tickByTickAllLast(),区别在于 AllLast 包含更多特殊成交类型。

同一个合约不要在 15 秒内连续发起多个逐笔请求。程序里如果需要依次测试 LastBidAskMidPointAllLast,应在每次请求和取消之间留出间隔。

app.reqTickByTickData(
97901,
aapl_stock(),
"Last",
0,
False,
)
app.reqTickByTickData(
97904,
aapl_stock(),
"AllLast",
0,
False,
)

AllLast 适合做更完整的成交记录。它可能包含 Last 不包含的成交类型,因此策略里要根据 tickAttribLastexchangespecialConditions 再做过滤。

app.reqTickByTickData(
97902,
aapl_stock(),
"BidAsk",
0,
True,
)

ignoreSize=True 表示忽略只有 bid/ask size 变化的更新,适合减少无用回调。需要完整盘口变化时可以设为 False

app.reqTickByTickData(
97903,
aapl_stock(),
"MidPoint",
0,
False,
)

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来说需要额外订阅

如果看到 1018910089,优先检查 IBKR 市场数据订阅、模拟账户行情共享、产品是否支持该逐笔类型,以及是否被其他登录会话占用,不要先改 Python 代码。

逐笔数据量大,订阅前要明确用途。不要对大量股票同时开逐笔订阅;先用 1 个合约确认权限、回调和取消逻辑,再扩展到更多标的。