跳转到内容

ForecastEx 合约示例

下面示例演示 ForecastEx 合约查询的基本写法:连接 TWS、发送 reqContractDetails()、接收合约详情或错误信息。示例使用 GCE ForecastEx 合约说明字段结构;实际开发应先在 TWS 或宽泛合约详情查询中找到仍可用的到期日、行权价和方向。

import threading
import time
from ibapi.client import EClient
from ibapi.contract import Contract
from ibapi.wrapper import EWrapper
INFO_CODES = {2104, 2106, 2158, 2107, 2108}
class ForecastExContractApp(EWrapper, EClient):
def __init__(self):
EClient.__init__(self, self)
self.ready = threading.Event()
self.finished = threading.Event()
self.rows = []
self.errors = []
def nextValidId(self, orderId):
# 收到 nextValidId 表示 API 握手完成,可以发送请求
self.ready.set()
def contractDetails(self, reqId, contractDetails):
contract = contractDetails.contract
self.rows.append({
"conId": contract.conId,
"localSymbol": contract.localSymbol,
"tradingClass": contract.tradingClass,
"longName": contractDetails.longName,
})
def contractDetailsEnd(self, reqId):
self.finished.set()
def error(self, reqId, errorTime, errorCode, errorString, advancedOrderRejectJson=""):
if errorCode not in INFO_CODES:
self.errors.append((reqId, errorCode, errorString))
def build_contract():
contract = Contract()
contract.symbol = "GCE"
contract.secType = "OPT"
contract.exchange = "FORECASTX"
contract.currency = "USD"
contract.lastTradeDateOrContractMonth = "20251231"
contract.strike = 40500
contract.right = "C"
return contract
app = ForecastExContractApp()
app.connect("127.0.0.1", 7497, clientId=151)
thread = threading.Thread(target=app.run, daemon=True)
thread.start()
if not app.ready.wait(8):
raise RuntimeError("等待 TWS API 握手超时")
app.reqContractDetails(1001, build_contract())
app.finished.wait(8)
time.sleep(1)
print("合约详情数量:", len(app.rows))
print("错误:", app.errors)
app.disconnect()
结果含义下一步
rows 有数据TWS 能识别这组字段保存 conIdlocalSymboltradingClass
rows 为 0 且错误码 200合约定义不够准确或合约不可用回到 TWS 查找目标合约,补全字段。
连接超时TWS API 未开启、端口不对或客户端 ID 冲突先解决连接问题。
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

这个结果说明:合约详情返回后,应保存 conIdlocalSymboltradingClass、到期日、行权价、方向和乘数,再进入行情或订单测试。

注意:事件合约会随到期日和产品状态变化。示例里的 20251231 适合理解字段结构;正式请求行情或下单前,应重新查询并确认仍可交易或可查看的合约。