取消单个订单
取消单个订单使用:
from ibapi.order_cancel import OrderCancel
app.cancelOrder(order_id, OrderCancel())order_id 必须是该 API 客户端可识别的订单编号。最常见来源是:
- 你刚刚用
placeOrder()提交的orderId。 openOrder()回调里返回的orderId。- 订单恢复时从本地订单表读取出的活动订单 ID。
from ibapi.order_cancel import OrderCancel
def cancel_one_order(app, order_id: int) -> None: # OrderCancel 可以为空;高级场景才需要填写人工撤单时间等字段。 app.cancelOrder(order_id, OrderCancel())新版 Python API 的 cancelOrder() 需要传 OrderCancel() 对象。旧资料里只写 cancelOrder(orderId),在新版本里可能会报参数数量错误。
撤单后常见回调:
ORDER_STATUS=orderId=26;status=Cancelled;filled=0;remaining=1判断撤单结果可以看:
orderStatus()中的status=Cancelled或status=ApiCancelled。error()中的code=202,部分环境会把主动撤单也作为这个提示返回。- 活动订单列表里不再出现该订单。
- 已完成订单里出现对应
permId,状态为Cancelled。
实际系统最好把这些信息都记录下来,因为不同订单状态、产品和 TWS 版本可能先后顺序不同。
| 情况 | 说明 |
|---|---|
| 订单已经成交 | 撤单只能取消剩余未成交数量,已经成交的部分不会被撤回。 |
| 订单已经取消 | 再次撤单可能出现 161,提示订单不处于可取消状态。 |
| 订单不是本客户端提交 | 普通 cancelOrder() 可能无法取消,需要理解 Master Client、clientId=0 或全局撤单。 |
| 订单正在提交中 | 可能先看到 PendingCancel,再看到 Cancelled。 |