跳转到内容

未完成订单

未完成订单指还没有完全结束的订单,例如已提交、等待触发、部分成交、等待撤单等状态的订单。TWS API 通过 openOrder() 返回订单结构,通过 orderStatus() 返回状态变化,通过 openOrderEnd() 表示一批未完成订单已经返回完毕。

官方参考:TWS API Documentation

回调作用更适合保存什么
openOrder()返回订单、合约和订单状态对象合约、方向、数量、订单类型、限价、TIF、what-if、风险提示
orderStatus()返回订单执行进度状态、已成交数量、剩余数量、平均成交价、永久订单编号
openOrderEnd()表示未完成订单批次结束用来判断列表刷新完成

openOrder() 更像“订单详情快照”,orderStatus() 更像“订单进度更新”。实际交易系统通常要把两者合并展示。

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)
字段中文说明
orderIdAPI 客户端订单编号。同一个 clientId 内递增。
contract.symbol合约代码,例如 AAPL
contract.secType证券类型,例如 STKOPTFUT
contract.exchange下单交易所或路由,例如 SMART
order.action买卖方向,常见值为 BUYSELL
order.orderType订单类型,例如 LMTMKTSTP
order.totalQuantity订单总数量。
order.lmtPrice限价单价格。市价单通常不用这个字段。
order.auxPrice辅助价格,止损单、止损限价单等会用到。
order.tif有效期,例如 DAYGTC
order.whatIf是否为保证金预估订单。为 True 时不会真实提交到市场。
order.transmit是否发送订单。括号单等组合订单会用它控制最终发送时机。
order.orderRef自定义订单引用,适合写策略名、业务单号或来源模块。
orderState.status订单状态,例如 PreSubmittedSubmittedCancelled
orderState.warningText风险、价格偏离、权限等提示文本。不要忽略这个字段。
orderState.initMarginChange订单对初始保证金的影响,what-if 订单常用。
orderState.equityWithLoanChange订单对含贷款权益的影响,what-if 订单常用。
WHATIF_SEEN=True
LIVE_ORDER_SEEN=True
CANCEL_SEEN=True
OPEN_ORDER_ROWS=7
OPEN_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=PreSubmitted
OPEN_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() 中,因为订单提交、改价、状态变化都会触发新的订单快照。

OPEN_ORDERS_END=True
ALL_OPEN_ORDERS_END=True
OPEN_ORDER_ROWS=0
ORDER_STATUS_ROWS=0

这个返回不代表连接失败。它表示 TWS 已经返回结束信号,只是可见范围里没有未完成订单。

  • orderId + clientId 作为 API 订单的本地识别键,再保存 permId 做跨客户端追踪。
  • openOrder() 可能重复返回同一个订单,不要简单追加成多条业务订单。
  • what-if 订单也会触发 openOrder(),但它不是实际市场订单。
  • warningText 很重要,价格偏离、保证金、风险检查等提示都可能出现在这里。
  • 判断订单是否成交,仍然要看 execDetails(),不要只看 openOrder()