跳转到内容

接收已完成订单

completedOrder() 每次返回一条已完成订单,completedOrdersEnd() 表示这批结果结束。

def completedOrder(self, contract, order, orderState) -> None:
row = {
"symbol": contract.symbol,
"security_type": contract.secType,
"exchange": contract.exchange,
"currency": contract.currency,
"action": order.action,
"order_type": order.orderType,
"total_quantity": float(order.totalQuantity),
"limit_price": order.lmtPrice,
"time_in_force": order.tif,
"permanent_id": order.permId,
"order_ref": order.orderRef,
"status": orderState.status,
"warning_text": orderState.warningText,
}
archive_completed_order(row)
def completedOrdersEnd(self) -> None:
mark_completed_order_sync_done()
字段中文说明
contract.symbol合约代码。
contract.secType证券类型。
contract.exchange下单交易所或路由。
contract.currency合约币种。
order.action买卖方向。
order.orderType订单类型。
order.totalQuantity订单数量。
order.lmtPrice限价价格。市价单可能不使用。
order.tif订单有效期。
order.permIdIBKR 永久订单编号。
order.orderRef自定义订单引用。
orderState.status完成状态,例如 CancelledFilledInactive
orderState.warningText订单风险或状态提示。
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

这类记录是已取消的 API 订单归档,不代表有真实成交。返回 0 行时,completedOrder() 不会被调用;收到 completedOrdersEnd() 才表示这次同步已经结束。

订单管理系统可以把 completed orders 写入订单归档表,但不要用它替代成交表。成交和佣金仍应来自 execDetails()commissionAndFeesReport()

如果同一订单已经在活动订单表中存在,可以用 permIdorderId + clientId 把它迁移到归档状态,而不是新建一个完全无关联的订单。