使用ibpy试图关闭TWS上的某些位置时,我们无法做到这一点。具体而言,执行时:
self._tws.reqAllOpenOrders()
sleep(0.2)
我们获得具有ID 0的订单(可能是因为我在TWS上手动放置它)
<openOrder orderId=0, contract=<ib.ext.Contract.Contract object at 0x103b78ad0>, order=<ib.ext.Order.Order object at 0x103b78a50>, orderState=<ib.ext.OrderState.OrderState object at 0x103b78b10>>
<orderStatus orderId=0, status=Submitted, filled=0, remaining=100, avgFillPrice=0.0, permId=134994568, parentId=0, lastFillPrice=0.0, clientId=0, whyHeld=None>
<openOrder orderId=0, contract=<ib.ext.Contract.Contract object at 0x103b78c90>, order=<ib.ext.Order.Order object at 0x103b78c50>, orderState=<ib.ext.OrderState.OrderState object at 0x103b78cd0>>
<orderStatus orderId=0, status=Submitted, filled=0, remaining=1, avgFillPrice=0.0, permId=134994562, parentId=0, lastFillPrice=0.0, clientId=0, whyHeld=None>
<openOrderEnd>
试图通过以下方式关闭它时:
self._tws.cancelOrder(0)
或
self._tws.cancelOrder(134994568)
我得到错误:
<error id=0, errorCode=135, errorMsg=Can't find order with id =0>
<error id=134994562, errorCode=135, errorMsg=Can't find order with id =134994562>
我们如何关闭它们?谢谢。
您必须将订单'绑定到新客户端。使用此方法tws.reqAutoOpenOrders(True)
。从文档中,
最后,ibapi.eclient.reqautoopenorders将允许获得这些 使用TWS本身手动放置订单。此方法还允许 客户应用程序接管这些订单并通过 将AutobInd参数设置为true。如果成功绑定, 订单将被分配(即绑定到)API订单ID,因此 有资格进行修改。
client.reqautoopEnorders(true);重要:只有那些与客户ID 0连接的应用程序能够接管 手动提交的订单
通过TWS的API设置,可以配置此 方法的行为在某种程度上。如下图所示, 手动下订单可以给出一个负订单ID,可以 用来轻松从API提交的订单中告诉手册。TWS 工具提示进一步详细说明:
回调看起来像<openOrder orderId=-3,...
,然后您只需致电tws.cancelOrder(-3)
请注意,您以前没有在TWS中下达订单,只有在致电reqAutoOpenOrders
之后放置的订单。