跳转到内容

行情更新频率

一档行情是聚合行情。TWS API 会在报价字段变化时推送更新,但它不保证每一笔成交、每一次报价变化都逐条发送。

如果你的需求是逐笔成交或逐笔报价,应使用逐笔数据接口,而不是普通 reqMktData()

官方参考:Top Market Data

场景说明
价格变化可能触发 tickPrice()
数量变化可能触发 tickSize()
特殊字段变化可能触发 tickString()tickGeneric()
没有字段变化不一定有回调。
缺少行情权限请求可能被拒绝,完全没有价格回调。
数据类型接口特点
一档行情reqMktData()适合观察列表报价,聚合更新。
逐笔数据reqTickByTickData()更接近逐笔成交或逐笔买卖报价。
5 秒线reqRealTimeBars()固定 5 秒聚合 bar。
二档行情reqMktDepth()多档盘口。

一档行情回调不是固定时间间隔。程序不要假设每秒一定收到 N 次更新。更稳妥的做法是:

last_price_by_req_id = {}
def tickPrice(self, reqId, tickType, price, attrib):
"""只在收到价格更新时刷新缓存。"""
last_price_by_req_id[(reqId, tickType)] = price

前端或策略可以从缓存读取最新值,而不是等待某个固定频率的回调。

请求 AAPL 一档行情时,因为缺少 API 行情订阅,价格和数量回调都是 0 行:

PRICE_ROWS=0
SIZE_ROWS=0
ERROR=reqId=97701;name=streaming;code=10089;msg=请求的市场数据对于API来说需要额外订阅...:延迟市场数据可用。:AAPL NASDAQ.NMS/TOP/ALL

这种情况下无法用本次请求判断真实更新频率。它只能证明权限不足时不会收到可用报价。

reqMktData() 返回的是一档行情流,不是 HTTP 请求那种“调用一次立刻返回完整 JSON”。它需要程序保持 socket 连接、运行消息线程,并在多个回调中逐步接收字段。