我的代码:
from ib.opt import Connection
from ib.ext.Contract import Contract
from ib.ext.Order import Order
from time import sleep
def get_valid_order_id(msg):
global oid
oid = msg.orderId
def error_handler(msg):
print ("Server Error:", 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(action, quantity):
order = Order()
order.m_orderType = 'MKT'
order.m_totalQuantity = quantity
order.m_action = action
return order
oid = 0
cid = 100
port = 7498
conn = None
# connection
conn = Connection.create(port=port,clientId=cid)
conn.connect()
# register
conn.register(get_valid_order_id, 'NextValidId')
conn.register(error_handler, 'Error')
#order
contract = create_contract('TSLA','STK','SMART','SMART','USD')
order = create_order('buy', 1)
print(1)
conn.placeOrder(oid, contract, order)
第一个结果:(订单已完成)
Server Version: 76
TWS Time at connection:20171101 02:07:03 CST
1Server Error:
<error id=-1, errorCode=2104, errorMsg=Market data farm connection is OK:usfuture>
Server Error: <error id=-1, errorCode=2104, errorMsg=Market data farm connection is OK:cashfarm>
Server Error: <error id=-1, errorCode=2104, errorMsg=Market data farm connection is OK:usfarm.us>
Server Error: <error id=-1, errorCode=2104, errorMsg=Market data farm connection is OK:usfarm>
Server Error: <error id=-1, errorCode=2106, errorMsg=HMDS data farm connection is OK:ushmds>
如果交换了最后两个代码:
conn.placeOrder(oid, contract, order)
print(1)
第二个结果:(订单失败)
Server Version: 76
TWS Time at connection:20171101 02:11:20 CST
Server Error: 1<error id=-1, errorCode=2104, errorMsg=Market data farm connection is OK:usfuture>
Server Error: <error id=-1, errorCode=2104, errorMsg=Market data farm connection is OK:cashfarm>
Server Error: <error id=-1, errorCode=2104, errorMsg=Market data farm connection is OK:usfarm.us>
Server Error: <error id=-1, errorCode=2104, errorMsg=Market data farm connection is OK:usfarm>
Server Error: <error id=-1, errorCode=2106, errorMsg=HMDS data farm connection is OK:ushmds>
Server Error: <error id=0, errorCode=10149, errorMsg=Invalid order id: 0>
为什么这么好笑以及如何正确地做到这一点? 我只想获得一个有效的订单ID来订购。 我不是一个非常优秀的程序员,我不知道听众是如何工作的。 请尽可能简单地解释。非常感谢!
答案 0 :(得分:0)
答案很简单:在第一个 conn.placeOrder()调用中,您使用了初始的 oid = 0 值。您无法再次使用它 - IB服务器在接受订单时将其分配给您的订单 - 因此当您尝试在第二次尝试中重复使用时会出现错误。它与线路交换无关。
顺便说一下,您的第一次尝试成功是一个奇迹,因为 oid = 0 并不总是有效的订单ID。如果您想获得有效的订单ID,则必须调用 conn.reqIds()并在 get_valid_order_id(msg)回调中捕获答案。回调已准备好,但我没有看到 reqIds 调用。只有在答案到达且 oid 具有正确的值后,您才能调用 conn.placeOrder()。
请注意:您的 print(1)调用在错误处理过程中正常执行。观察第3行中的字符“1”:服务器错误:1 ...
答案 1 :(得分:0)
根据您的结果,可以通过断开连接再重新连接来解决第二次或以后的下单失败,请在您现有的代码中添加以下代码。
# disconnect
conn.disconnect()
每次连接到IB来检索数据,下订单,获取自己的投资组合摘要等时,都需要运行while loop
或其他类似的逻辑,并保持重新连接IB。