跳转到内容

实时行情

实时行情是通过 TWS 或 IB Gateway 持续订阅市场数据。程序发出请求后,TWS 会在行情变化时不断通过回调推送价格、数量、盘口、逐笔成交或 5 秒线。

项目实时行情历史行情
典型接口reqMktData()reqRealTimeBars()reqTickByTickData()reqHistoricalData()reqHeadTimeStamp()
数据方式持续订阅,直到取消一次请求,返回一批数据
主要限制行情权限、订阅行数、市场数据类型历史数据限频、时间范围、barSize
常见错误4201008930016220010187
主题说明
实时行情限制行情权限、订阅行数、实时/延迟差异
5 秒线reqRealTimeBars() 请求、接收和取消
一档行情reqMktData()、通用 tick、快照和取消
二档行情深度盘口交易所、请求、接收和取消
逐笔数据实时逐笔成交、bid/ask、midpoint
期权希腊值期权价格、隐含波动率和希腊值回调

先用一个高流动性合约做最小请求,例如 AAPL。收到权限错误时,不要先怀疑代码;先确认账户是否有对应交易所的实时或延迟行情权限。实时行情开发最重要的是:请求要能取消,错误要能解释,订阅数量要能控制。

同一个 AAPL 合约,在账户没有实时 API 行情订阅时,reqMktData() 可能出现这样的结果:

CONNECTED=True
CONTRACT=AAPL STK SMART NASDAQ USD
PRICE_ROWS=0
SIZE_ROWS=0
NON_INFO_ERROR_COUNT=6
ERROR=reqId=97701;name=streaming;code=10089;msg=请求的市场数据对于API来说需要额外订阅...
ERROR=reqId=97701;name=streaming;code=300;msg=无法使用tickerId找到EId::97701

这里的关键错误是 10089,表示合约可以识别,但账户缺少对应 API 行情权限。后面的 300 往往是因为订阅没有成功建立,程序又调用了取消请求;它不是根因。

如果切换到延迟行情模式,同一账户可能仍能收到 marketDataType=3 和延迟价格 tick。也就是说:

结果含义
合约详情能返回合约定义正确。
历史 K 线能返回历史数据权限或延迟历史数据可用。
实时一档返回 10089实时 API 行情权限不足。
延迟行情有返回可以先用延迟行情做展示或教学,但不能当作实时交易报价。