跳转到内容

事件合约订单提交

事件合约订单仍然使用 placeOrder(),但不建议把它当成普通股票订单直接复制。事件合约的标的、结算和风险边界更特殊,下单前必须确认合约、行情和账户权限。

检查项为什么重要
合约详情能返回说明 TWS 能识别该事件合约。
行情能返回买卖价说明合约对账户可见,价格参考更可靠。
账户有交易权限事件合约可能有地区、资格和产品权限限制。
模拟账户先验证可以观察 openOrder()orderStatus()error() 回调。
价格使用限价单避免事件类产品流动性不足时产生不可控成交。

事件合约测试应从限价单开始。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 与合约详情中确认。

连接 TWS
-> 等待 nextValidId(orderId)
-> 验证合约详情
-> 订阅并观察行情
-> 构造限价单
-> placeOrder(orderId, contract, order)
-> 读取 openOrder/orderStatus/error 回调

nextValidId() 返回的订单编号不能随便写死。多客户端同时连接 TWS 时,订单编号冲突会导致下单失败或状态混乱。

回调中文含义用途
openOrder()打开的订单查看 TWS 接收后的完整订单结构。
orderStatus()订单状态读取 SubmittedFilledCancelled 等状态。
error()错误或拒单信息读取权限、价格、合约、订单保护等问题。
execDetails()成交明细订单成交后才会返回。

事件合约订单页面的核心不是“怎么最快下单”,而是“如何确定订单发到了你以为的那个合约上,并且能解释每个回调”。