我正在使用模拟交易IB账户,交易处理得很好。我有许多未完成的订单。"updateAccountValue"按预期执行,而"con.register(acct_update,message.reqAllOpenOrders())"什么也不做,"con.reqOpenOrders()"也不执行任何操作。两者都不会引发错误。IB文档告诉我,所有三种方法都是"无效的",我理解这意味着不应该返回任何值。然而,如前所述,"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()
我试图弄清楚如何打印出所有未结订单。以下是我发现的内容,可以帮助您解决第一个问题。
- 为 Order.py 和 Contract.py 的原始IBpy文档添加打印功能。
在 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
您可以修改字段以显示要查看的内容。
- 在您自己的 python 文件中:
''
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::秒类型: FUT, 符号: NQ;到期:20161216::行动:买入,数量:1,价格:4500.0::状态:待定取消order_status: 2::状态: 待定取消 已填写: 0 剩余: 1 平均填充价格: 0.0
注意到区别了吗?
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()。 它是异步的,这意味着您必须等待回复。