行情更新频率
一档行情是聚合行情。TWS API 会在报价字段变化时推送更新,但它不保证每一笔成交、每一次报价变化都逐条发送。
如果你的需求是逐笔成交或逐笔报价,应使用逐笔数据接口,而不是普通 reqMktData()。
官方参考:Top Market Data
更新频率的含义
Section titled “更新频率的含义”| 场景 | 说明 |
|---|---|
| 价格变化 | 可能触发 tickPrice()。 |
| 数量变化 | 可能触发 tickSize()。 |
| 特殊字段变化 | 可能触发 tickString() 或 tickGeneric()。 |
| 没有字段变化 | 不一定有回调。 |
| 缺少行情权限 | 请求可能被拒绝,完全没有价格回调。 |
它不是逐笔数据
Section titled “它不是逐笔数据”| 数据类型 | 接口 | 特点 |
|---|---|---|
| 一档行情 | reqMktData() | 适合观察列表报价,聚合更新。 |
| 逐笔数据 | reqTickByTickData() | 更接近逐笔成交或逐笔买卖报价。 |
| 5 秒线 | reqRealTimeBars() | 固定 5 秒聚合 bar。 |
| 二档行情 | reqMktDepth() | 多档盘口。 |
程序设计建议
Section titled “程序设计建议”一档行情回调不是固定时间间隔。程序不要假设每秒一定收到 N 次更新。更稳妥的做法是:
last_price_by_req_id = {}
def tickPrice(self, reqId, tickType, price, attrib): """只在收到价格更新时刷新缓存。""" last_price_by_req_id[(reqId, tickType)] = price前端或策略可以从缓存读取最新值,而不是等待某个固定频率的回调。
参考边界样例
Section titled “参考边界样例”请求 AAPL 一档行情时,因为缺少 API 行情订阅,价格和数量回调都是 0 行:
PRICE_ROWS=0SIZE_ROWS=0ERROR=reqId=97701;name=streaming;code=10089;msg=请求的市场数据对于API来说需要额外订阅...:延迟市场数据可用。:AAPL NASDAQ.NMS/TOP/ALL这种情况下无法用本次请求判断真实更新频率。它只能证明权限不足时不会收到可用报价。
新手容易误解的点
Section titled “新手容易误解的点”reqMktData() 返回的是一档行情流,不是 HTTP 请求那种“调用一次立刻返回完整 JSON”。它需要程序保持 socket 连接、运行消息线程,并在多个回调中逐步接收字段。