【问题标题】:IbPy cant send order - must specify an accountIbPy 无法发送订单 - 必须指定一个帐户
【发布时间】:2016-03-15 10:01:59
【问题描述】:

我正在尝试使用以下代码尝试向 TWS 发送订单以放置在谷歌股票上。我不明白为什么它一直要求一个帐户,我打开了 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 账户中运行代码,订单就会下达并执行,所以一切正常!但是当我在模拟交易账户中运行相同的代码时,就会收到上述错误消息。

有谁知道“指定一个帐户”,即在某处输入我的帐号?

【问题讨论】:

  • 您有子账号吗?你可以指定 order.m_account 但我从来没有。 interactivebrokers.com/en/software/api/apiguide/java/order.htm
  • 没有子账号。我确实看到了 order.m_account,但它说“仅限机构客户”。顺便说一句,我将如何使用该 order.m_account ?我对所有 python/ibpy/IB api 的东西都很陌生。
  • 您只需要尝试不同的帐号。我听说 FA 帐户也使用它。
  • 什么是 FA 账户?
  • 财务顾问或者朋友和家人。它可能是特定于国家/地区的。如果你有 IRA 和普通账户怎么办?

标签: python ibpy


【解决方案1】:

感谢 Brian,我现在有工作代码,请参阅上面原始问题的 cmets。我想我会发布整个脚本,以防其他人在尝试实现来自 Quantstart 网站的文章“使用 PYTHON、IBPY 和交互式经纪人 API 自动化交易”中的代码时遇到同样的问题,顺便说一句,这是一个很棒的网站.

所以它只是通过在订单定义中添加一个额外的参数来输入一个命令来为订单提供一个帐号。该参数允许在提交订单时指定帐号。在下面的脚本中,我没有提供我的真实帐号,而只是写了“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 引用,因此如果使用上面的代码或添加一些东西来增加它,则需要手动更改它。

祝交易愉快!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 2018-05-15
    • 2020-03-27
    • 1970-01-01
    • 2023-04-01
    • 2020-09-07
    • 2017-10-12
    相关资源
    最近更新 更多