接收已完成订单
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.permId | IBKR 永久订单编号。 |
order.orderRef | 自定义订单引用。 |
orderState.status | 完成状态,例如 Cancelled、Filled、Inactive。 |
orderState.warningText | 订单风险或状态提示。 |
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这类记录是已取消的 API 订单归档,不代表有真实成交。返回 0 行时,completedOrder() 不会被调用;收到 completedOrdersEnd() 才表示这次同步已经结束。
订单管理系统可以把 completed orders 写入订单归档表,但不要用它替代成交表。成交和佣金仍应来自 execDetails() 与 commissionAndFeesReport()。
如果同一订单已经在活动订单表中存在,可以用 permId 或 orderId + clientId 把它迁移到归档状态,而不是新建一个完全无关联的订单。