0

我正在使用纸质交易 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()
4

2 回答 2

3

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

  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::secType: FUT, 符号: NQ; 到期:20161216::action: BUY, 数量: 1, at price: 4500.0::Status: PendingCancel order_status: 2::Status: PendingCancel Filled: 0 Remaining: 1 avgFillPrice: 0.0

于 2016-10-30T00:08:04.923 回答
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()。它是异步的,这意味着您必须等待回复。

于 2016-06-10T19:34:00.240 回答