ForecastEx 合约示例
下面示例演示 ForecastEx 合约查询的基本写法:连接 TWS、发送 reqContractDetails()、接收合约详情或错误信息。示例使用 GCE ForecastEx 合约说明字段结构;实际开发应先在 TWS 或宽泛合约详情查询中找到仍可用的到期日、行权价和方向。
import threadingimport time
from ibapi.client import EClientfrom ibapi.contract import Contractfrom 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()返回结果怎么读
Section titled “返回结果怎么读”| 结果 | 含义 | 下一步 |
|---|---|---|
rows 有数据 | TWS 能识别这组字段 | 保存 conId、localSymbol、tradingClass。 |
rows 为 0 且错误码 200 | 合约定义不够准确或合约不可用 | 回到 TWS 查找目标合约,补全字段。 |
| 连接超时 | TWS API 未开启、端口不对或客户端 ID 冲突 | 先解决连接问题。 |
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这个结果说明:合约详情返回后,应保存 conId、localSymbol、tradingClass、到期日、行权价、方向和乘数,再进入行情或订单测试。
注意:事件合约会随到期日和产品状态变化。示例里的 20251231 适合理解字段结构;正式请求行情或下单前,应重新查询并确认仍可交易或可查看的合约。