事件合约订单提交
事件合约订单仍然使用 placeOrder(),但不建议把它当成普通股票订单直接复制。事件合约的标的、结算和风险边界更特殊,下单前必须确认合约、行情和账户权限。
| 检查项 | 为什么重要 |
|---|---|
| 合约详情能返回 | 说明 TWS 能识别该事件合约。 |
| 行情能返回买卖价 | 说明合约对账户可见,价格参考更可靠。 |
| 账户有交易权限 | 事件合约可能有地区、资格和产品权限限制。 |
| 模拟账户先验证 | 可以观察 openOrder()、orderStatus() 和 error() 回调。 |
| 价格使用限价单 | 避免事件类产品流动性不足时产生不可控成交。 |
推荐订单类型
Section titled “推荐订单类型”事件合约测试应从限价单开始。ForecastEx 预测合约尤其要注意:退出或反向表达观点时,常见方式不是卖出原方向合约,而是买入相反结果方向的合约;具体规则以 TWS 合约和官方说明为准。
from ibapi.order import Order
def limit_order(action, quantity, limit_price): order = Order() order.action = action # 通常从 "BUY" 开始验证,方向含义取决于事件合约 order.orderType = "LMT" # 限价单 order.totalQuantity = quantity # 数量 order.lmtPrice = limit_price # 限价价格 order.tif = "DAY" # 事件合约常用 DAY,也可能支持 GTC 或 IOC return order不要在不熟悉合约规则时使用市价单。事件合约的价格、最小变动单位和可交易状态都应先从 TWS 与合约详情中确认。
placeOrder 调用顺序
Section titled “placeOrder 调用顺序”连接 TWS -> 等待 nextValidId(orderId) -> 验证合约详情 -> 订阅并观察行情 -> 构造限价单 -> placeOrder(orderId, contract, order) -> 读取 openOrder/orderStatus/error 回调nextValidId() 返回的订单编号不能随便写死。多客户端同时连接 TWS 时,订单编号冲突会导致下单失败或状态混乱。
| 回调 | 中文含义 | 用途 |
|---|---|---|
openOrder() | 打开的订单 | 查看 TWS 接收后的完整订单结构。 |
orderStatus() | 订单状态 | 读取 Submitted、Filled、Cancelled 等状态。 |
error() | 错误或拒单信息 | 读取权限、价格、合约、订单保护等问题。 |
execDetails() | 成交明细 | 订单成交后才会返回。 |
事件合约订单页面的核心不是“怎么最快下单”,而是“如何确定订单发到了你以为的那个合约上,并且能解释每个回调”。