事件合约行情
事件合约行情仍然使用 reqMktData()。它和股票行情的调用形式相同,但前置条件更严格:合约必须先能被 reqContractDetails() 识别。
reqContractDetails() 验证合约 -> 确认返回 conId 或 localSymbol -> reqMktData() 订阅行情 -> 从 tickPrice()、tickSize()、tickString() 读取报价 -> cancelMktData() 取消订阅如果合约详情都返回 0 条,就不要继续订阅行情。行情接口不会帮你修正合约字段。
行情订阅示例
Section titled “行情订阅示例”def subscribe_event_market_data(app, contract): req_id = 2001
# genericTickList 为空表示订阅常规报价字段 # snapshot=False 表示持续订阅 # regulatorySnapshot=False 表示不是监管快照 # mktDataOptions 一般传空列表 app.reqMktData( req_id, contract, "", False, False, [] )
return req_id回调示例:
def tickPrice(self, reqId, tickType, price, attrib): print("价格字段:", reqId, tickType, price)
def tickSize(self, reqId, tickType, size): print("数量字段:", reqId, tickType, size)| 字段 | 中文含义 | 说明 |
|---|---|---|
reqId | 行情请求编号 | 自己分配,用来区分多个订阅。 |
contract | 事件合约对象 | 使用已通过合约详情验证的字段。 |
genericTickList | 附加行情字段 | 常规报价可先传空字符串。 |
snapshot | 是否只取一次快照 | 调试时可以先用 False 持续观察。 |
regulatorySnapshot | 是否监管快照 | 普通事件合约调试通常为 False。 |
事件合约行情最常见的问题不是代码语法,而是合约和权限:
| 错误现象 | 常见原因 |
|---|---|
错误码 200 | 合约字段无法定位证券定义。 |
| 没有价格回调 | 市场关闭、没有行情权限或合约不可见。 |
| 返回延迟行情 | 账户没有实时行情权限,或 TWS 行情类型被切换为延迟。 |
开发时建议同时保存合约详情结果、行情错误、请求时间和关键合约字段,便于排查是代码问题、权限问题还是合约状态问题。