跳转到内容

取消订单总览

TWS API 有两种常见撤单方式:

接口作用适用场景
cancelOrder(orderId, OrderCancel())取消指定 orderId 的订单取消自己刚提交的某张订单。
reqGlobalCancel(OrderCancel())请求取消所有未完成订单测试脚本结束时清理模拟挂单。

撤单也不是同步返回。调用撤单接口后,要看 orderStatus()openOrder()error() 回调。

官方参考:TWS API Documentation

cancelOrder() 面向单张订单。它最适合取消同一个 API 客户端刚刚提交的订单,或者取消 openOrder() 回调中能看到的订单。

reqGlobalCancel() 范围更大,会请求取消所有未完成订单,不管订单最初来自哪里。这个接口适合模拟测试兜底清理,不适合在真实交易系统里随便暴露给普通用户。

提交 AAPL 限价单后调用 cancelOrder(),返回:

ORDER_STATUS=orderId=26;status=Cancelled;filled=0;remaining=1

有些环境还会通过 error() 回调返回 202,表示订单被取消。它是撤单路径的一部分,不要简单地把所有 error() 回调都当作程序失败。

如果订单已经取消,后续又收到一次取消请求,TWS 可能返回 161,提示订单不处于可取消状态。这通常表示重复撤单或清理阶段兜底撤单,不等于订单重新失败。

  • 单个订单用 cancelOrder()
  • 测试脚本优先取消指定订单;只有无法确认是否仍有测试挂单时,才用 reqGlobalCancel() 做兜底清理。
  • 真实账户系统不应随便暴露“取消全部订单”按钮。
  • 订单已经成交时,撤单不会把成交撤回,只能取消剩余未成交数量。
  • 批量撤单前应先展示活动订单列表,让用户确认要取消哪些订单。