2

次のコードを使用して、TWS に注文を送信して Google 共有に配置しようとしています。アカウントを要求し続ける理由がわかりません。TWS を開き、ActiveX などを有効にすることを確認しました。また、ソケット番号とクライアント ID が正しいことも確認しました。

from ib.ext.Contract import Contract
from ib.ext.Order import Order
from ib.opt import Connection, message
import time

def error_handler(msg):
    print "Server Error: %s" % msg

def reply_handler(msg):
    print "Server Response: %s, %s" % (msg.typeName, msg)

def create_contract(symbol, sec_type, exch, prim_exch, curr):
    contract = Contract()
    contract.m_symbol = symbol
    contract.m_secType = sec_type
    contract.m_exchange = exch
    contract.m_primaryExch = prim_exch
    contract.m_currency = curr
    return contract

def create_order(order_type, quantity, action):
    order = Order()
    order.m_orderType = order_type
    order.m_totalQuantity = quantity
    order.m_action = action
    return order

if __name__ == "__main__":
    tws_conn = Connection.create(port=7496, clientId=100)
    tws_conn.connect()

    tws_conn.register(error_handler, 'Error')

    tws_conn.registerAll(reply_handler)

    order_id = 200

    goog_contract = create_contract('GOOG', 'STK', 'SMART', 'SMART', 'USD')

    goog_order = create_order('MKT', 5, 'BUY')

    tws_conn.placeOrder(order_id, goog_contract, goog_order)

    time.sleep(1)

    tws_conn.disconnect()

次のエラーが表示されます

Server Response: error, <error id=200, errorCode=321, errorMsg=Error validating request:-'ie' : cause - You must specify an account.

デモ IB アカウントでコードを実行すると、注文が行われて約定されるので、すべてが機能します。しかし、紙の取引口座で同じコードを実行すると、上記のエラー メッセージが表示されます。

「アカウントを指定する」こと、つまりアカウント番号をどこかに入力することを知っている人はいますか?

4

1 に答える 1

2

ブライアンのおかげで、私は今、作業中のコードを持っています。上記の元の質問に対するコメントを参照してください。Quantstart Web サイトの記事「USING PYTHON, IBPY AND THE INTERACTIVE BROKERS API TO AUTOMATE TRADES」のコードを実装しようとしたときに、他の誰かが同じ問題を抱えた場合に備えて、スクリプト全体を投稿すると思いました。 .

そのため、注文の定義に追加の引数を追加して、注文に口座番号を与えるコマンドを挿入することになりました。この引数を使用すると、注文を送信するときにアカウント番号を指定できます。以下のスクリプトでは、実際の口座番号を提供していませんが、「DUxxxxxx」と書きました。「x」は数値です。この口座番号は、TWS GUI の右上隅にはっきりと表示されます。

from ib.ext.Contract import Contract
from ib.ext.Order import Order
from ib.opt import Connection, message
import time

def error_handler(msg):
    print "Server Error: %s" % msg

def reply_handler(msg):
    print "Server Response: %s, %s" % (msg.typeName, msg)

def create_contract(symbol, sec_type, exch, prim_exch, curr):
    contract = Contract()
    contract.m_symbol = symbol
    contract.m_secType = sec_type
    contract.m_exchange = exch
    contract.m_primaryExch = prim_exch
    contract.m_currency = curr
    return contract

def create_order(order_type, quantity, action, account):
    order = Order()
    order.m_orderType = order_type
    order.m_totalQuantity = quantity
    order.m_action = action
    order.m_account = account
    return order

if __name__ == "__main__":
    tws_conn = Connection.create(port=7496, clientId=100)
    tws_conn.connect()

    tws_conn.register(error_handler, 'Error')

    tws_conn.registerAll(reply_handler)

    order_id = 200

    goog_contract = create_contract('GOOG', 'STK', 'SMART', 'SMART', 'USD')

    goog_order = create_order('MKT', 5, 'BUY', 'DUxxxxxx')

    tws_conn.placeOrder(order_id, goog_contract, goog_order)

    time.sleep(1)

    tws_conn.disconnect()

また、一部の人にとってはわかりにくいかもしれませんが、最初はそうではなかったことに注意してください。 order_id は毎回変更する必要があるということです。各注文は一意であり、order_id によって参照されるため、上記のコードまたはそれをインクリメントするために追加されたものを使用する場合は、手動で変更する必要があります。

ハッピー取引!

于 2016-03-16T01:19:33.227 に答える