跳转到内容

事件合约行情

事件合约行情仍然使用 reqMktData()。它和股票行情的调用形式相同,但前置条件更严格:合约必须先能被 reqContractDetails() 识别。

reqContractDetails() 验证合约
-> 确认返回 conId 或 localSymbol
-> reqMktData() 订阅行情
-> 从 tickPrice()、tickSize()、tickString() 读取报价
-> cancelMktData() 取消订阅

如果合约详情都返回 0 条,就不要继续订阅行情。行情接口不会帮你修正合约字段。

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 行情类型被切换为延迟。

开发时建议同时保存合约详情结果、行情错误、请求时间和关键合约字段,便于排查是代码问题、权限问题还是合约状态问题。