总览
一档行情是 TWS 观察列表里最常见的行情数据,包括买一、卖一、最新价、成交量、收盘价等。TWS API 使用 reqMktData() 请求一档行情,数据通过 tickPrice()、tickSize()、tickString()、tickGeneric() 等回调返回。
一档行情不是逐笔成交,也不是二档盘口。它是适合多数行情展示、策略过滤和基础报价检查的顶层行情。
官方参考:Top Market Data
| 步骤 | 接口 / 回调 | 说明 |
|---|---|---|
| 1 | Contract() | 构造股票、期权、期货、外汇等合约。 |
| 2 | reqMktData() | 请求一档行情,可选择流式订阅或快照。 |
| 3 | tickPrice() | 接收价格类字段,例如买价、卖价、最新价。 |
| 4 | tickSize() | 接收数量类字段,例如买量、卖量、成交量。 |
| 5 | tickString() / tickGeneric() | 接收字符串或通用 tick 字段。 |
| 6 | tickReqParams() | 接收最小价格变动、BBO 交易所映射等请求参数。 |
| 7 | cancelMktData() | 取消流式行情订阅。 |
AAPL 合约示例
Section titled “AAPL 合约示例”from ibapi.contract import Contract
def aapl_stock() -> Contract: """AAPL 股票合约,一档行情常用 SMART 路由并指定 primaryExchange。""" contract = Contract() contract.symbol = "AAPL" contract.secType = "STK" contract.exchange = "SMART" contract.currency = "USD" contract.primaryExchange = "NASDAQ" return contract# 请求 AAPL 流式一档行情。app.reqMktData( 97701, aapl_stock(), "", False, False, [],)| 参数 | 示例 | 中文说明 |
|---|---|---|
tickerId | 97701 | 请求编号,回调时用来识别是哪次行情请求。 |
contract | aapl_stock() | 合约对象。 |
genericTickList | "" | 额外 tick 类型列表,普通报价可留空。 |
snapshot | False | False 是流式订阅,True 是快照。 |
regulatorySnapshot | False | 是否请求监管快照。 |
mktDataOptions | [] | 通常留空。 |
参考边界样例
Section titled “参考边界样例”AAPL 合约请求可以到达 TWS,并返回 tickReqParams():
CONNECTED=TrueCONTRACT=AAPL STK SMART NASDAQ USDTICK_REQ_PARAMS=tickerId=97701;name=streaming;minTick=0.01;bboExchange=EMPTY;snapshotPermissions=0但账户没有对应 API 顶层行情订阅,所以没有收到价格或数量回调:
PRICE_ROWS=0SIZE_ROWS=0ERROR=reqId=97701;name=streaming;code=10089;msg=请求的市场数据对于API来说需要额外订阅...:AAPL NASDAQ.NMS/TOP/ALLERROR=reqId=97701;name=streaming;code=300;msg=无法使用tickerId找到EId::97701这说明连接、合约和请求结构是通的,问题在市场数据权限。程序应把 10089 当作行情权限错误处理。
- 观察列表报价展示。
- 策略启动前检查标的是否有实时行情。
- 风控系统读取最新价、买一卖一和成交量。
- 下单前估算价格范围。
- 与历史行情、逐笔数据、二档行情配合做更完整的行情分析。
先用 reqCurrentTime() 确认 API 连接,再用 reqMktData() 请求一个熟悉的股票。如果收到 tickReqParams() 但没有价格,多数情况下不是 Python 代码错,而是行情权限或订阅状态问题。