跳转到内容

请求已完成订单

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=True
COMPLETED_ORDER_ROWS=4
COMPLETED_ORDER=symbol=AAPL;secType=STK;action=BUY;orderType=LMT;totalQuantity=1;status=Cancelled;permId=1466795661
COMPLETED_ORDER=symbol=AAPL;secType=STK;action=BUY;orderType=LMT;totalQuantity=1;status=Cancelled;permId=1466795662

如果返回 0 行,也可能只是没有已完成 API 订单,不代表接口失败。是否收到 completedOrdersEnd() 更能说明请求是否正常结束。

  • 在策略程序启动时,可以先查活动订单,再查已完成订单,恢复订单状态。
  • apiOnly=False 可能带来更宽的可见范围,使用前要明确是否会读到手工订单。
  • 已完成订单只说明订单生命周期结束,不说明一定有成交。