Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-Ibpy返回有效的订单id_Python_Trading_Interactive Brokers_Ibpy - Fatal编程技术网

Python-Ibpy返回有效的订单id

Python-Ibpy返回有效的订单id,python,trading,interactive-brokers,ibpy,Python,Trading,Interactive Brokers,Ibpy,我的代码: 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 Er

我的代码:

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>
第二个结果:订单失败

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。 我不是一个很好的程序员,我不知道听众是如何工作的。 请尽可能简单地解释一下。非常感谢


Ibpy:

答案很简单:在第一次conn.placeOrder调用中,您使用了初始oid=0值。您不能再次使用它-IB服务器在接受订单时将其分配给您的订单-因此,当您尝试在第二次尝试中重新使用它时,会出现错误。这与换行无关

顺便说一句,您的第一次尝试成功是一个奇迹,因为oid=0并不总是一个有效的订单id。如果您想获得一个有效的订单id,您必须调用conn.reqIds并在get\u valid\u order\u idmsg回调中获取答案。回调已准备好,但我没有看到ReqID调用。只有在答案到达并且oid具有正确的值后,才能调用conn.placeOrder


只是一句话:您的Prt1调用在错误处理的中间正常执行。观察第三行中的字符“1”:服务器错误:1…

根据您的结果,第二次或以后的订单发布失败将通过断开连接,然后再次重新连接来解决,请将以下代码添加到现有代码中

# disconnect
conn.disconnect()  

每当您连接到IB以检索数据、下订单、获取您自己的投资组合摘要e.t.c时,您都需要运行while loop或其他类似的逻辑,并不断重新连接IB。

99%的概率是,您得到的任何差异都不是由于交换了这两行,而是由于其他原因。无论如何,看起来您需要以其他方式创建一个有效的订单id。在调用placeOrder之前,请检查文档,placeOrder希望在其第一个参数中接收该id。当前您正在传递0作为订单id。您是否成功解决了此问题?
# disconnect
conn.disconnect()