0

私は、取引が問題なく処理される紙の取引 IB アカウントを使用しています。満たされていない注文がいくつかあります。「updateAccountValue」は期待どおりに機能しますが、「con.register(acct_update, message.reqAllOpenOrders())」は何もせず、「con.reqOpenOrders()」も行いません。どちらもエラーを発生させません。IB ドキュメントによると、3 つすべてがメソッドは '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()
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、価格: 4500.0::Status: PendingCancel order_status: 2::Status: PendingCancel Filled: 0 残り: 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 に答える