跳转到内容

总览

一档行情是 TWS 观察列表里最常见的行情数据,包括买一、卖一、最新价、成交量、收盘价等。TWS API 使用 reqMktData() 请求一档行情,数据通过 tickPrice()tickSize()tickString()tickGeneric() 等回调返回。

一档行情不是逐笔成交,也不是二档盘口。它是适合多数行情展示、策略过滤和基础报价检查的顶层行情。

官方参考:Top Market Data

步骤接口 / 回调说明
1Contract()构造股票、期权、期货、外汇等合约。
2reqMktData()请求一档行情,可选择流式订阅或快照。
3tickPrice()接收价格类字段,例如买价、卖价、最新价。
4tickSize()接收数量类字段,例如买量、卖量、成交量。
5tickString() / tickGeneric()接收字符串或通用 tick 字段。
6tickReqParams()接收最小价格变动、BBO 交易所映射等请求参数。
7cancelMktData()取消流式行情订阅。
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,
[],
)
参数示例中文说明
tickerId97701请求编号,回调时用来识别是哪次行情请求。
contractaapl_stock()合约对象。
genericTickList""额外 tick 类型列表,普通报价可留空。
snapshotFalseFalse 是流式订阅,True 是快照。
regulatorySnapshotFalse是否请求监管快照。
mktDataOptions[]通常留空。

AAPL 合约请求可以到达 TWS,并返回 tickReqParams()

CONNECTED=True
CONTRACT=AAPL STK SMART NASDAQ USD
TICK_REQ_PARAMS=tickerId=97701;name=streaming;minTick=0.01;bboExchange=EMPTY;snapshotPermissions=0

但账户没有对应 API 顶层行情订阅,所以没有收到价格或数量回调:

PRICE_ROWS=0
SIZE_ROWS=0
ERROR=reqId=97701;name=streaming;code=10089;msg=请求的市场数据对于API来说需要额外订阅...:AAPL NASDAQ.NMS/TOP/ALL
ERROR=reqId=97701;name=streaming;code=300;msg=无法使用tickerId找到EId::97701

这说明连接、合约和请求结构是通的,问题在市场数据权限。程序应把 10089 当作行情权限错误处理。

  • 观察列表报价展示。
  • 策略启动前检查标的是否有实时行情。
  • 风控系统读取最新价、买一卖一和成交量。
  • 下单前估算价格范围。
  • 与历史行情、逐笔数据、二档行情配合做更完整的行情分析。

先用 reqCurrentTime() 确认 API 连接,再用 reqMktData() 请求一个熟悉的股票。如果收到 tickReqParams() 但没有价格,多数情况下不是 Python 代码错,而是行情权限或订阅状态问题。