跳转到内容

请求观察列表行情

观察列表行情就是 TWS Watchlist 中显示的一档报价。TWS API 用 reqMktData() 请求这类数据。

官方参考:Requesting Watchlist Data

app.reqMktData(tickerId, contract, genericTickList, snapshot, regulatorySnapshot, mktDataOptions)
参数常见值中文说明
tickerId97701请求编号,必须由程序自己管理。
contractContract()股票、期权、期货、外汇等合约。
genericTickList""额外 tick 类型列表,多个用逗号分隔。
snapshotFalseFalse 表示持续订阅,True 表示快照。
regulatorySnapshotFalse是否请求美国监管快照。
mktDataOptions[]预留参数,一般留空。
from ibapi.contract import Contract
def aapl_stock() -> Contract:
"""构造 AAPL 股票合约。"""
contract = Contract()
contract.symbol = "AAPL"
contract.secType = "STK"
contract.exchange = "SMART"
contract.currency = "USD"
contract.primaryExchange = "NASDAQ"
return contract
# 请求流式一档行情。
app.reqMktData(97701, aapl_stock(), "", False, False, [])

primaryExchange 对美股很有帮助。它可以减少同名合约歧义,例如 AAPL 使用 NASDAQ

成功订阅后,TWS 会按字段变化推送不同回调:

回调说明
tickPrice()价格更新。
tickSize()数量更新。
tickString()字符串类行情。
tickGeneric()通用 tick 数值。
tickReqParams()请求参数和交易所映射信息。

请求 AAPL 流式一档行情,TWS 返回了请求参数:

TICK_REQ_PARAMS=tickerId=97701;name=streaming;minTick=0.01;bboExchange=EMPTY;snapshotPermissions=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

这种结果表示合约和 API 连接正常,但账户没有对应 API 行情权限。

把连接错误、合约错误和行情权限错误分开处理:

  • 连接失败通常收不到 nextValidId()
  • 合约错误常见为 200
  • 行情权限不足常见为 10089354

这样用户看到错误时,能直接知道下一步应该检查端口、合约字段还是市场数据订阅。