我正在使用纸质交易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()
答案 0 :(得分:3)
我试图找出如何打印所有未结订单。以下是我发现的可以帮助您解决第一个问题。
在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
您可以修改字段以显示您想要查看的内容。
``
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()。它是异步的,这意味着你必须等待回复。