使用Python-TWS Api的reqMktData获取延迟期权行情报200错误求助
问题背景
调用reqMktData获取延迟期权报价时持续报错:
Error 200,reqId 108: No security definition has been found for the request
涉及合约信息:Contract(secType='OPT', symbol='qqq', lastTradeDateOrContractMonth='20220916', strike=292.5, right='C', exchange='SMART', currency='USD')
使用的代码片段:
ib.reqMarketDataType(3) op_contract = Contract() op_contract.symbol = asset_ticker op_contract.secType = 'OPT' op_contract.exchange = option_exchange op_contract.currency = currency op_contract.right = 'C' op_contract.lastTradeDateOrContractMonth = date op_contract.strike = strike ib.qualifyContracts(op_contract) #it does find a conID, unique per strike. mkt_data_op = ib.reqMktData(op_contract)
补充信息:未订阅数据,股票延迟行情正常,仅期权延迟行情报错,且该合约可正常查询历史数据。
可能的解决方案
1. 补充合约的primaryExchange字段
qualifyContracts返回conID不代表所有字段都已完善,期权合约的实时行情请求通常需要明确primaryExchange。可以在合约验证后手动设置,或先打印验证后的合约确认该字段是否存在:
ib.qualifyContracts(op_contract) # 打印合约查看所有字段 print(op_contract) # 如果primaryExchange为空,手动设置(QQQ期权的primaryExchange通常为'PHLX') if not op_contract.primaryExchange: op_contract.primaryExchange = 'PHLX' mkt_data_op = ib.reqMktData(op_contract)
2. 替换SMART路由为具体交易所
SMART路由对延迟期权数据可能存在限制,尝试直接指定期权的实际交易场所,比如QQQ期权主要在NASDAQ PHLX(代码PHLX)交易:
op_contract.exchange = 'PHLX' # 再执行qualify和行情请求 ib.qualifyContracts(op_contract) mkt_data_op = ib.reqMktData(op_contract)
3. 确认reqMarketDataType的调用时机
确保reqMarketDataType(3)(延迟数据)在连接建立后、所有行情请求前调用,避免因设置未生效导致的权限问题。建议将该调用放在IB连接初始化的代码段中,而非每次请求前临时调用。
4. 验证合约的有效性
在IB客户端的「合约搜索」功能中手动查找该期权合约,确认合约参数(到期日、行权价、权利类型)完全匹配,且该合约确实提供延迟行情服务。
为什么历史数据正常但实时行情报错?
历史数据的合约匹配逻辑相对宽松,即使部分字段缺失也能匹配到对应数据;但实时行情请求对合约参数的精确性要求更高,尤其是交易所、primaryExchange这类路由相关字段,缺失或错误会直接导致合约定义无法识别。
内容的提问来源于stack exchange,提问作者José Antonio Navarro Navarro

