跳转到内容

取消单个订单

取消单个订单使用:

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=Cancelledstatus=ApiCancelled
  • error() 中的 code=202,部分环境会把主动撤单也作为这个提示返回。
  • 活动订单列表里不再出现该订单。
  • 已完成订单里出现对应 permId,状态为 Cancelled

实际系统最好把这些信息都记录下来,因为不同订单状态、产品和 TWS 版本可能先后顺序不同。

情况说明
订单已经成交撤单只能取消剩余未成交数量,已经成交的部分不会被撤回。
订单已经取消再次撤单可能出现 161,提示订单不处于可取消状态。
订单不是本客户端提交普通 cancelOrder() 可能无法取消,需要理解 Master Client、clientId=0 或全局撤单。
订单正在提交中可能先看到 PendingCancel,再看到 Cancelled