取消订单总览
TWS API 有两种常见撤单方式:
| 接口 | 作用 | 适用场景 |
|---|---|---|
cancelOrder(orderId, OrderCancel()) | 取消指定 orderId 的订单 | 取消自己刚提交的某张订单。 |
reqGlobalCancel(OrderCancel()) | 请求取消所有未完成订单 | 测试脚本结束时清理模拟挂单。 |
撤单也不是同步返回。调用撤单接口后,要看 orderStatus()、openOrder() 和 error() 回调。
两种撤单的区别
Section titled “两种撤单的区别”cancelOrder() 面向单张订单。它最适合取消同一个 API 客户端刚刚提交的订单,或者取消 openOrder() 回调中能看到的订单。
reqGlobalCancel() 范围更大,会请求取消所有未完成订单,不管订单最初来自哪里。这个接口适合模拟测试兜底清理,不适合在真实交易系统里随便暴露给普通用户。
撤单结果示例
Section titled “撤单结果示例”提交 AAPL 限价单后调用 cancelOrder(),返回:
ORDER_STATUS=orderId=26;status=Cancelled;filled=0;remaining=1有些环境还会通过 error() 回调返回 202,表示订单被取消。它是撤单路径的一部分,不要简单地把所有 error() 回调都当作程序失败。
重复撤单提示
Section titled “重复撤单提示”如果订单已经取消,后续又收到一次取消请求,TWS 可能返回 161,提示订单不处于可取消状态。这通常表示重复撤单或清理阶段兜底撤单,不等于订单重新失败。
- 单个订单用
cancelOrder()。 - 测试脚本优先取消指定订单;只有无法确认是否仍有测试挂单时,才用
reqGlobalCancel()做兜底清理。 - 真实账户系统不应随便暴露“取消全部订单”按钮。
- 订单已经成交时,撤单不会把成交撤回,只能取消剩余未成交数量。
- 批量撤单前应先展示活动订单列表,让用户确认要取消哪些订单。