0

当使用 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>

知道我们如何关闭它们吗?谢谢你。

4

1 回答 1

0

您必须将订单“绑定”到新客户。使用这种方法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.

于 2016-12-22T17:14:12.953 回答