0

我目前正在开发一个使用 Interactive Broker 的 API 进行交易的 Java 应用程序。我遇到了一个问题,我不确定我做错了什么或者这是否是 API 中的错误。

此时,我目前可以使用以下调用提交我的订单:

m_controller.placeOrModifyOrder( m_contract, m_order, new IOrderHandler() {

        @Override
        public void orderStatus(OrderStatus status, int filled, int remaining, double avgFillPrice, long permId, int parentId, double lastFillPrice, int clientId, String whyHeld) {
            /*dbgMsg(String.format("Status: %s - Filled: %d - Remaining: %d - Avg F px: %f - Permid: %d - Parentid: %d - Last Fill Px: %f - Client id: %d - WhyHeld: %d", 
                    status.toString(), 
                    filled, 
                    remaining,
                    avgFillPrice,
                    permId,
                    parentId,
                    lastFillPrice,
                    clientId,
                    whyHeld));*/

            System.out.println("Order Status");

        }

        @Override
        public void orderState(NewOrderState orderState) {
            m_controller.removeOrderHandler( this);
            System.out.println("Order state "+orderState.toString());

            // TODO Auto-generated method stub
            //dbgMsg(orderState.toString());
        }

        @Override
        public void handle(int errorCode, String errorMsg) {
            //dbgMsg(String.format("ORDER ERROR [%d]: %s", errorCode, errorMsg));
            System.out.println("Order Error: "+errorMsg);
        }
    });

我遇到的问题是,虽然订单通过 API 在 Trader Workstation 上传输和填写,但我没有收到已创建订单的任何更新。

我还验证了我实际上是通过 ILiveOrdersHandler 接收订单更新,它基本上提供了所有订单的状态更新。

我不知道这是我的编程问题还是底层 API 的问题;我还通过将 System.out.println() 调用添加到其程序中的相应处理程序,在 IB 提供的示例代码上确认了这种行为。

任何帮助将不胜感激。

4

2 回答 2

0

您是否收到对 orderState() 的回调?

你打电话时

m_controller.removeOrderHandler(this);

您有效地从 ApiController 的处理程序列表中删除了您的处理程序,这意味着您将不会再收到有关此订单 ID 的任何回调。

如果您检查源代码,您可以看到 ApiController 回调您的处理程序(因为它与订单 ID 相关联),然后是所有实时订单处理程序。

查看 orderStatus 代码,例如:

    IOrderHandler handler = m_orderHandlers.get( orderId);
    if (handler != null) {
        handler.orderStatus( OrderStatus.valueOf( status), filled, remaining, avgFillPrice, permId, parentId, lastFillPrice, clientId, whyHeld);
    }

    for (ILiveOrderHandler liveOrderHandler : m_liveOrderHandlers) {
        liveOrderHandler.orderStatus(orderId, OrderStatus.valueOf( status), filled, remaining, avgFillPrice, permId, parentId, lastFillPrice, clientId, whyHeld);
    }
于 2015-06-19T21:56:53.813 回答
0

通过删除“m_controller.removeOrderHandler(this);” 您有效地从回调函数(EReader 线程)获得反馈。

但是,对于立即执行的订单(以卖价购买,以卖价出售),orderStatus 方法似乎无效,因为订单不再有效。因此,还应该通过 reqExecutions 方法检查订单状态。

于 2015-06-25T07:51:18.507 回答