请求已完成订单
reqCompletedOrders(apiOnly) 用来请求已完成订单。这个接口不需要 reqId,返回结果通过 completedOrder() 和 completedOrdersEnd() 接收。
# 只请求 API 订单的已完成记录。app.reqCompletedOrders(True)
# 请求更广范围的已完成记录。app.reqCompletedOrders(False)参数 apiOnly 控制查询范围:
| 参数 | 中文说明 | 适合场景 |
|---|---|---|
True | 只请求 API 订单 | 策略程序、API 订单归档、减少误读手工订单。 |
False | 请求更广范围的已完成订单 | 账户级监控或人工订单同步,具体可见范围受 TWS 和账户设置影响。 |
普通策略程序建议先使用 True。如果你要做账户级订单归档,再评估是否使用 False。
def completedOrder(self, contract, order, orderState) -> None: print( contract.symbol, contract.secType, order.action, order.orderType, order.totalQuantity, orderState.status, order.permId, )
def completedOrdersEnd(self) -> None: print("已完成订单返回结束")
app.reqCompletedOrders(True)COMPLETED_ORDERS_END=TrueCOMPLETED_ORDER_ROWS=4COMPLETED_ORDER=symbol=AAPL;secType=STK;action=BUY;orderType=LMT;totalQuantity=1;status=Cancelled;permId=1466795661COMPLETED_ORDER=symbol=AAPL;secType=STK;action=BUY;orderType=LMT;totalQuantity=1;status=Cancelled;permId=1466795662如果返回 0 行,也可能只是没有已完成 API 订单,不代表接口失败。是否收到 completedOrdersEnd() 更能说明请求是否正常结束。
- 在策略程序启动时,可以先查活动订单,再查已完成订单,恢复订单状态。
apiOnly=False可能带来更宽的可见范围,使用前要明确是否会读到手工订单。- 已完成订单只说明订单生命周期结束,不说明一定有成交。