实时行情
实时行情是通过 TWS 或 IB Gateway 持续订阅市场数据。程序发出请求后,TWS 会在行情变化时不断通过回调推送价格、数量、盘口、逐笔成交或 5 秒线。
实时行情和历史行情的区别
Section titled “实时行情和历史行情的区别”| 项目 | 实时行情 | 历史行情 |
|---|---|---|
| 典型接口 | reqMktData()、reqRealTimeBars()、reqTickByTickData() | reqHistoricalData()、reqHeadTimeStamp() |
| 数据方式 | 持续订阅,直到取消 | 一次请求,返回一批数据 |
| 主要限制 | 行情权限、订阅行数、市场数据类型 | 历史数据限频、时间范围、barSize |
| 常见错误 | 420、10089、300 | 162、200、10187 |
本章覆盖内容
Section titled “本章覆盖内容”| 主题 | 说明 |
|---|---|
| 实时行情限制 | 行情权限、订阅行数、实时/延迟差异 |
| 5 秒线 | reqRealTimeBars() 请求、接收和取消 |
| 一档行情 | reqMktData()、通用 tick、快照和取消 |
| 二档行情 | 深度盘口交易所、请求、接收和取消 |
| 逐笔数据 | 实时逐笔成交、bid/ask、midpoint |
| 期权希腊值 | 期权价格、隐含波动率和希腊值回调 |
先用一个高流动性合约做最小请求,例如 AAPL。收到权限错误时,不要先怀疑代码;先确认账户是否有对应交易所的实时或延迟行情权限。实时行情开发最重要的是:请求要能取消,错误要能解释,订阅数量要能控制。
同一个 AAPL 合约,在账户没有实时 API 行情订阅时,reqMktData() 可能出现这样的结果:
CONNECTED=TrueCONTRACT=AAPL STK SMART NASDAQ USDPRICE_ROWS=0SIZE_ROWS=0NON_INFO_ERROR_COUNT=6ERROR=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 行情权限不足。 |
| 延迟行情有返回 | 可以先用延迟行情做展示或教学,但不能当作实时交易报价。 |