2016-03-15 33 views
2

我試圖使用下面的代碼嘗試發送訂單到TWS放置在谷歌共享。我不明白爲什麼它不斷要求一個帳戶,我有TWS打開,並已檢查啓用ActiveX等。我也檢查了插座號碼和客戶端ID是正確的。IbPy無法發送訂單 - 必須指定一個賬戶

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賬戶的順序被放置和填充,所以一切正常!但是當我在我的紙幣交易賬戶中運行相同的代碼時,那就是當我收到上述錯誤消息時。

是否有人知道要「指定一個帳戶」,即在某處輸入我的帳號?

+0

你有子賬戶嗎?你可以指定order.m_account,但我從來沒有。 https://www.interactivebrokers.com/en/software/api/apiguide/java/order.htm – brian

+0

沒有子帳戶。我確實看到了order.m_account,但它的內容是「僅適用於機構客戶」。順便說一句,我將如何使用該order.m_account?即時通訊蟒蛇/ ibpy/IB api的東西很新。 –

+0

你只需要嘗試不同的帳號。我讀過FA賬戶也使用它。 – brian

回答

2

我現在有工作代碼,感謝Brian,請參閱上述原始問題的評論。我想我會發布整個腳本,以防萬一任何其他人遇到同樣的問題時試圖從文章「使用PYTHON,IBPY和互動經紀人API自動化交易」的代碼從Quantstart網站,這是一個偉大的網站。

因此,它只是歸結爲通過向訂單定義添加額外參數來向訂單輸入帳號的命令。此參數允許在提交訂單時指定帳號。在下面的腳本中,我沒有提供真實的帳號,只是寫了'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() 

另外一兩件事要注意這可能是obvoius一些,但並不是我的TA第一是,ORDER_ID具有每一次改變。每個訂單都是唯一的,並由order_id引用,所以如果使用上面的代碼或添加了一些東西來增加它,它需要手動更改。

快樂交易!

相關問題