API 客户端订单
reqOpenOrders() 查询这个连接的 clientId 自己提交、且仍未完成的订单。它是普通策略程序最常用的订单恢复接口。
app.reqOpenOrders()这个接口不需要 reqId。返回结果通过 openOrder()、orderStatus() 和 openOrderEnd() 回调推送。
| 场景 | 是否适合 | 原因 |
|---|---|---|
| 策略程序启动后恢复自己的订单 | 适合 | 只关心这个 clientId 提交的未完成订单。 |
| 查询其它 API 客户端订单 | 不适合 | 应使用 reqAllOpenOrders()。 |
| 查询 TWS 手工订单 | 不适合 | 需要理解 clientId=0 和自动绑定。 |
| 查询已撤单或已成交订单 | 不适合 | 应使用 reqCompletedOrders()。 |
OPEN_ORDERS_END=TrueOPEN_ORDER_ROWS=0这个返回表示该 API 客户端没有未完成订单,但接口已经正常结束。
如果该客户端刚提交过一笔仍在活动中的订单,则可能收到类似结果:
OPEN_ORDER=orderId=16;symbol=AAPL;action=BUY;orderType=LMT;totalQuantity=1;lmtPrice=100.01;status=Submitted同一个订单可能因为提交、改价、撤单等变化被推送多次,程序应该用 orderId + clientId 或 permId 更新同一条订单记录。
启动恢复流程
Section titled “启动恢复流程”class App(EWrapper, EClient): def openOrder(self, orderId, contract, order, orderState): upsert_order_snapshot(orderId, contract, order, orderState)
def orderStatus( self, orderId, status, filled, remaining, avgFillPrice, permId, parentId, lastFillPrice, clientId, whyHeld, mktCapPrice, ): update_order_progress(orderId, status, filled, remaining, avgFillPrice, permId)
def openOrderEnd(self): mark_order_recovery_done()
app.reqOpenOrders()这类恢复逻辑适合放在策略程序启动后执行,避免程序重启后忘记仍在市场中的订单。