跳转到内容

事件交易介绍

事件交易不是一套单独的新 API。它仍然通过 TWS API 里的 ContractreqContractDetails()reqMktData()placeOrder() 等常规接口完成,只是交易标的变成了事件结果相关的合约。

可以把事件合约理解成一种特殊金融工具:它有合约定义、报价、买卖价、到期或结算规则,也可能有交易权限、地区限制、产品适当性和账户类型限制。开发时最重要的不是先写下单代码,而是先确认你拿到的合约字段能被 TWS 唯一识别。

类型常见 secType常见 exchange说明
ForecastEx 预测合约OPTFORECASTX以事件结果为标的的预测合约,字段形式接近期权。
CME 事件合约FOPCMECBOTCOMEXNYMEX以期货期权形式暴露,交易所取决于底层期货市场。

事件合约的关键点是:不要只凭一个自然语言事件名称去请求。事件类产品更新快,同一个主题下可能有多个到期日、结果方向和行权价;更稳的流程是先用 reqContractDetails() 或 TWS 合约详情确认可见合约,再保存 conIdlocalSymboltradingClass、到期日、行权价和方向字段。

打开 TWS 并确认事件合约权限
-> 在 TWS 中找到可交易或可查看的事件合约
-> 用 reqContractDetails() 验证合约字段
-> 用 reqMktData() 订阅报价
-> 在模拟账户里用极小规模订单验证订单回调
-> 再考虑封装成策略或自建交易系统

事件合约不要从下单开始写。只要合约定义不唯一,后面的行情和订单都可能返回错误码 200,也就是 TWS 找不到证券定义。

TWS 模拟账户连接正常时,使用 ForecastEx 的 GCE 示例合约请求详情,可以返回一条明确合约:

CONNECTED=True
REQ_SENT=FORECAST_GCE_FULL;reqId=95191;symbol=GCE;secType=OPT;exchange=FORECASTX;expiry=20251231;strike=40500;right=C
DETAIL_END_FORECAST_GCE_FULL=True
DETAIL_ROWS_FORECAST_GCE_FULL=1
DETAIL=reqId=95191;conId=753279929;symbol=GCE;secType=OPT;exchange=FORECASTX;localSymbol=GCE_1225_40500_YES;tradingClass=GCE;lastTradeDateOrContractMonth=20251231;strike=40500.0;right=C;multiplier=1;longName=Global Carbon Dioxide Emissions

同一个 GCE/OPT/FORECASTX 宽泛请求也可以返回多条候选:

DETAIL_ROWS_FORECAST_GCE_BROAD=150
DETAIL=reqId=95192;conId=732957119;symbol=GCE;secType=OPT;exchange=FORECASTX;localSymbol=GCE_1226_43000_YES;tradingClass=GCE;lastTradeDateOrContractMonth=20261231;strike=43000.0;right=C;multiplier=1;longName=Global Carbon Dioxide Emissions
DETAIL=reqId=95192;conId=732957127;symbol=GCE;secType=OPT;exchange=FORECASTX;localSymbol=GCE_1230_46000_YES;tradingClass=GCE;lastTradeDateOrContractMonth=20301231;strike=46000.0;right=C;multiplier=1;longName=Global Carbon Dioxide Emissions

这说明事件合约既可以被 TWS API 查询到,也需要认真筛选具体合约。20251231 这样的合约定义可以用于理解字段结构,但正式行情或下单前,应选择仍处于可交易或可查看状态的合约,并再次用合约详情确认。

问题原因处理方式
No security definition has been found / 未找到证券定义合约字段不完整或合约已经过期先在 TWS 搜索合约,再用更完整字段请求详情。
看不到 ForecastEx 或 CME 事件产品账户地区、权限、产品开通状态不同在 TWS 里确认产品入口和交易权限。
行情没有返回没有行情权限、合约不可见或市场关闭先用 reqContractDetails(),再订阅行情。
下单被拒产品权限、订单保护、价格或合约状态不满足读取 error()orderStatus()openOrder() 回调。