跳转到内容

API 客户端订单

reqOpenOrders() 查询这个连接的 clientId 自己提交、且仍未完成的订单。它是普通策略程序最常用的订单恢复接口。

app.reqOpenOrders()

这个接口不需要 reqId。返回结果通过 openOrder()orderStatus()openOrderEnd() 回调推送。

场景是否适合原因
策略程序启动后恢复自己的订单适合只关心这个 clientId 提交的未完成订单。
查询其它 API 客户端订单不适合应使用 reqAllOpenOrders()
查询 TWS 手工订单不适合需要理解 clientId=0 和自动绑定。
查询已撤单或已成交订单不适合应使用 reqCompletedOrders()
OPEN_ORDERS_END=True
OPEN_ORDER_ROWS=0

这个返回表示该 API 客户端没有未完成订单,但接口已经正常结束。

如果该客户端刚提交过一笔仍在活动中的订单,则可能收到类似结果:

OPEN_ORDER=orderId=16;symbol=AAPL;action=BUY;orderType=LMT;totalQuantity=1;lmtPrice=100.01;status=Submitted

同一个订单可能因为提交、改价、撤单等变化被推送多次,程序应该用 orderId + clientIdpermId 更新同一条订单记录。

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()

这类恢复逻辑适合放在策略程序启动后执行,避免程序重启后忘记仍在市场中的订单。