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



我正在使用模拟交易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()

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

  1. 为 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

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

  1. 在您自己的 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()。 它是异步的,这意味着您必须等待回复。

相关内容

  • 没有找到相关文章

最新更新