繁体   English   中英

在Java中使用Interactive Broker API的IOrderHandler接口的正确方法是什么?

[英]What is the proper way to use Interactive Broker API's IOrderHandler interface in Java?

我目前正在开发一个用于使用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提供的示例代码中确认了此行为。

任何帮助将不胜感激。

您是否获得到orderState()的回调?

你打电话时

m_controller.removeOrderHandler(this);

您可以有效地从ApiController的处理程序列表中删除处理程序,这意味着您将不再获得有关此order-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);
    }

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM