如何使用IBpy检索未结订单的状态?

时间:2016-06-10 10:53:19

标签: python-2.7 ibpy

我正在使用纸质交易IB账户,交易处理得很好。我有很多未完成的订单。 “updateAccountValue”按预期执行,而“con.register(acct_update,message.reqAllOpenOrders())”什么都不做,“con.reqOpenOrders()”也没有。也没有引发错误.IBM文档告诉我所有三个方法是'void',我理解这意味着不应该返回任何值。但是,如上所述,“updateAccountValue”方法完全正常,提供正确的输出。

问题1:如何检索有关(未填充)未结订单的数据?

我还注意到代码并不总是运行,但它总是在(重新)启动TWS工作站应用程序后正常运行。

问题2:为什么每次启动时都不会运行此代码?

from ib.opt import ibConnection, message
import sys

def acct_update(msg):
    print msg   

con = ibConnection(clientId=100)
con.register(acct_update,
        message.updateAccountValue)
con.register(acct_update,
        message.reqAllOpenOrders())

con.connect()
con.reqAccountUpdates(True,'DU000000')
con.reqAllOpenOrders()
con.reqOpenOrders()

sys.exit()

2 个答案:

答案 0 :(得分:3)

我试图找出如何打印所有未结订单。以下是我发现的可以帮助您解决第一个问题。

  1. 将打印功能添加到Order.py和Contract.py的原始IBpy文档中。
  2. 在Order.py中添加:

    def __str__(self):
        return "Action: " + self.m_action + ", Quantity: " + str(self.m_totalQuantity) + ", at price: " + str(self.m_lmtPrice)
    

    在Contract.py中添加:

    def __str__(self):
        return "secType: " + self.m_secType + ", symbol: " + self.m_symbol + "; expiry: " + self.m_expiry
    

    您可以修改字段以显示您想要查看的内容。

    1. 在您自己的python文件中:
    2. ``

      from ib.opt import Connection, message
      from ib.ext.Contract import Contract
      from ib.ext.Order import Order
      
      def print_open_order_messege(msg):
          print ("open_order: " + str(msg.orderId) + "::" + str(msg.contract) + "::" + str(msg.order) + "::"+str(msg.orderState))
      
      def print_order_status_messege(msg):
          print ("order_status: " + str(msg.orderId) + "::" + "Status: " + msg.status + ", Filled: " + str(msg.filled) + ", Remaining: " + str(msg.remaining) + ", avgFillPrice: " + str(msg.avgFillPrice))
      
      con.register(print_open_order_messege, message.openOrder)
      con.register(print_order_status_messege, message.orderStatus)
      con.reqAllOpenOrders()
      

      它打印出我的测试订单如下:

      ... open_order:2 :: secType:FUT,symbol:NQ;到期日:2016-1216 ::诉讼:购买,数量:1,价格:4500.0 ::状态:PendingCancel order_status:2 ::状态:PendingCancel已填充:0剩余:1 avgFillPrice:0.0

答案 1 :(得分:1)

注意区别?

con.register(acct_update,
        message.updateAccountValue)
con.register(acct_update,
        message.reqAllOpenOrders())

您应该使用message.openOrder

另外,你将它发送到acct_update回调,但由于它只是打印,所以没什么大不了的。但是,如果您需要来自回调的信息,则此处是它到达的格式。

<openOrder orderId=123469, contract=<ib.ext.Contract.Contract object at 0x7f68daeff6a0>, order=<ib.ext.Order.Order object at 0x7f68e80d2668>, orderState=<ib.ext.OrderState.OrderState object at 0x7f68daf39240>>

在程序可能有机会完成之前,您也可以调用exit()。它是异步的,这意味着你必须等待回复。