事件交易介绍
事件交易不是一套单独的新 API。它仍然通过 TWS API 里的 Contract、reqContractDetails()、reqMktData()、placeOrder() 等常规接口完成,只是交易标的变成了事件结果相关的合约。
可以把事件合约理解成一种特殊金融工具:它有合约定义、报价、买卖价、到期或结算规则,也可能有交易权限、地区限制、产品适当性和账户类型限制。开发时最重要的不是先写下单代码,而是先确认你拿到的合约字段能被 TWS 唯一识别。
两类事件合约
Section titled “两类事件合约”| 类型 | 常见 secType | 常见 exchange | 说明 |
|---|---|---|---|
| ForecastEx 预测合约 | OPT | FORECASTX | 以事件结果为标的的预测合约,字段形式接近期权。 |
| CME 事件合约 | FOP | CME、CBOT、COMEX、NYMEX | 以期货期权形式暴露,交易所取决于底层期货市场。 |
事件合约的关键点是:不要只凭一个自然语言事件名称去请求。事件类产品更新快,同一个主题下可能有多个到期日、结果方向和行权价;更稳的流程是先用 reqContractDetails() 或 TWS 合约详情确认可见合约,再保存 conId、localSymbol、tradingClass、到期日、行权价和方向字段。
打开 TWS 并确认事件合约权限 -> 在 TWS 中找到可交易或可查看的事件合约 -> 用 reqContractDetails() 验证合约字段 -> 用 reqMktData() 订阅报价 -> 在模拟账户里用极小规模订单验证订单回调 -> 再考虑封装成策略或自建交易系统事件合约不要从下单开始写。只要合约定义不唯一,后面的行情和订单都可能返回错误码 200,也就是 TWS 找不到证券定义。
TWS 模拟账户连接正常时,使用 ForecastEx 的 GCE 示例合约请求详情,可以返回一条明确合约:
CONNECTED=TrueREQ_SENT=FORECAST_GCE_FULL;reqId=95191;symbol=GCE;secType=OPT;exchange=FORECASTX;expiry=20251231;strike=40500;right=CDETAIL_END_FORECAST_GCE_FULL=TrueDETAIL_ROWS_FORECAST_GCE_FULL=1DETAIL=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=150DETAIL=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 EmissionsDETAIL=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 这样的合约定义可以用于理解字段结构,但正式行情或下单前,应选择仍处于可交易或可查看状态的合约,并再次用合约详情确认。
最容易踩的坑
Section titled “最容易踩的坑”| 问题 | 原因 | 处理方式 |
|---|---|---|
No security definition has been found / 未找到证券定义 | 合约字段不完整或合约已经过期 | 先在 TWS 搜索合约,再用更完整字段请求详情。 |
| 看不到 ForecastEx 或 CME 事件产品 | 账户地区、权限、产品开通状态不同 | 在 TWS 里确认产品入口和交易权限。 |
| 行情没有返回 | 没有行情权限、合约不可见或市场关闭 | 先用 reqContractDetails(),再订阅行情。 |
| 下单被拒 | 产品权限、订单保护、价格或合约状态不满足 | 读取 error()、orderStatus()、openOrder() 回调。 |