未完成订单
未完成订单指还没有完全结束的订单,例如已提交、等待触发、部分成交、等待撤单等状态的订单。TWS API 通过 openOrder() 返回订单结构,通过 orderStatus() 返回状态变化,通过 openOrderEnd() 表示一批未完成订单已经返回完毕。
三个回调的分工
Section titled “三个回调的分工”| 回调 | 作用 | 更适合保存什么 |
|---|---|---|
openOrder() | 返回订单、合约和订单状态对象 | 合约、方向、数量、订单类型、限价、TIF、what-if、风险提示 |
orderStatus() | 返回订单执行进度 | 状态、已成交数量、剩余数量、平均成交价、永久订单编号 |
openOrderEnd() | 表示未完成订单批次结束 | 用来判断列表刷新完成 |
openOrder() 更像“订单详情快照”,orderStatus() 更像“订单进度更新”。实际交易系统通常要把两者合并展示。
openOrder 回调
Section titled “openOrder 回调”def openOrder(self, orderId, contract, order, orderState) -> None: row = { "order_id": orderId, "symbol": contract.symbol, "security_type": contract.secType, "action": order.action, "order_type": order.orderType, "total_quantity": float(order.totalQuantity), "limit_price": order.lmtPrice, "time_in_force": order.tif, "what_if": order.whatIf, "transmit": order.transmit, "status": orderState.status, "warning_text": orderState.warningText, }
save_open_order(row)| 字段 | 中文说明 |
|---|---|
orderId | API 客户端订单编号。同一个 clientId 内递增。 |
contract.symbol | 合约代码,例如 AAPL。 |
contract.secType | 证券类型,例如 STK、OPT、FUT。 |
contract.exchange | 下单交易所或路由,例如 SMART。 |
order.action | 买卖方向,常见值为 BUY、SELL。 |
order.orderType | 订单类型,例如 LMT、MKT、STP。 |
order.totalQuantity | 订单总数量。 |
order.lmtPrice | 限价单价格。市价单通常不用这个字段。 |
order.auxPrice | 辅助价格,止损单、止损限价单等会用到。 |
order.tif | 有效期,例如 DAY、GTC。 |
order.whatIf | 是否为保证金预估订单。为 True 时不会真实提交到市场。 |
order.transmit | 是否发送订单。括号单等组合订单会用它控制最终发送时机。 |
order.orderRef | 自定义订单引用,适合写策略名、业务单号或来源模块。 |
orderState.status | 订单状态,例如 PreSubmitted、Submitted、Cancelled。 |
orderState.warningText | 风险、价格偏离、权限等提示文本。不要忽略这个字段。 |
orderState.initMarginChange | 订单对初始保证金的影响,what-if 订单常用。 |
orderState.equityWithLoanChange | 订单对含贷款权益的影响,what-if 订单常用。 |
模拟账户返回示例
Section titled “模拟账户返回示例”WHATIF_SEEN=TrueLIVE_ORDER_SEEN=TrueCANCEL_SEEN=TrueOPEN_ORDER_ROWS=7OPEN_ORDER=orderId=21;symbol=AAPL;action=BUY;orderType=LMT;totalQuantity=1;lmtPrice=100.0;whatIf=True;transmit=True;status=PreSubmitted;warningText=[价格偏离参考价提示]OPEN_ORDER=orderId=22;symbol=AAPL;action=BUY;orderType=LMT;totalQuantity=1;lmtPrice=100.0;whatIf=False;transmit=True;status=PreSubmittedOPEN_ORDER=orderId=22;symbol=AAPL;action=BUY;orderType=LMT;totalQuantity=1;lmtPrice=100.01;whatIf=False;transmit=True;status=Submitted这个流程先发送一笔 what-if 限价单,再发送一笔 1 股 AAPL 低价限价单,随后改价并撤单。你会看到同一个 orderId=22 多次出现在 openOrder() 中,因为订单提交、改价、状态变化都会触发新的订单快照。
没有未完成订单时
Section titled “没有未完成订单时”OPEN_ORDERS_END=TrueALL_OPEN_ORDERS_END=TrueOPEN_ORDER_ROWS=0ORDER_STATUS_ROWS=0这个返回不代表连接失败。它表示 TWS 已经返回结束信号,只是可见范围里没有未完成订单。
- 以
orderId + clientId作为 API 订单的本地识别键,再保存permId做跨客户端追踪。 openOrder()可能重复返回同一个订单,不要简单追加成多条业务订单。- what-if 订单也会触发
openOrder(),但它不是实际市场订单。 warningText很重要,价格偏离、保证金、风险检查等提示都可能出现在这里。- 判断订单是否成交,仍然要看
execDetails(),不要只看openOrder()。