Python – 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 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)

1-й результат: (заказ выполнен)

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)

2-й результат: (заказ не выполнен)

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>

Почему так смешно и как это сделать правильно? Я просто хочу получить действительный идентификатор заказа для заказа. Я не очень хороший программист, я не знаю, как работает слушатель. Пожалуйста, объясните это как можно проще. Большое спасибо!

Ibpy: https://github.com/blampe/IbPy


person onon99buynoodle    schedule 31.10.2017    source источник
comment
С вероятностью 99% любые различия, которые вы получаете, связаны не с тем, что вы поменяли местами эти две строки, а с чем-то другим. В любом случае, похоже, что вам нужно создать действительный идентификатор заказа каким-то другим способом (проверьте документ), прежде чем вызывать placeOrder, который ожидает получить этот идентификатор в своем первом параметре. В настоящее время вы передаете 0 в качестве идентификатора заказа.   -  person SantiBailors    schedule 01.11.2017
comment
Вам удалось решить проблему?   -  person Janos    schedule 14.11.2017


Ответы (2)


Ответ прост: в первом вызове conn.placeOrder() вы использовали исходное значение oid=0. Вы не можете использовать его снова - сервер IB присвоил его вашему заказу, когда он был принят, поэтому вы получили ошибку при попытке повторного использования во второй попытке. Это не имеет ничего общего с перестановкой строк.

Кстати, удивительно, что ваша первая попытка оказалась успешной, потому что oid=0 не всегда является корректным идентификатором заказа. Если вы хотите получить действительный идентификатор заказа, вам нужно вызвать conn.reqIds() и получить ответ в обратном вызове get_valid_order_id(msg). Обратный вызов подготовлен, но я не вижу вызова reqIds. Вы можете вызывать conn.placeOrder() только после того, как получен ответ и oid имеет правильное значение.

Простое замечание: ваш вызов print(1) был нормально выполнен в середине обработки ошибки. Обратите внимание на символ «1» в 3-й строке: Ошибка сервера: 1...

person Janos    schedule 01.11.2017

В зависимости от вашего результата, сбой при размещении 2-го или более поздних заказов будет решен путем отключения и последующего повторного подключения. Пожалуйста, добавьте приведенный ниже код в свой существующий.

# disconnect
conn.disconnect()  

Каждый раз, когда вы подключаетесь к IB для получения данных, размещения ордеров, получения сводки по своему портфелю и т. д., вам необходимо запускать while loop или другую подобную логику и продолжать повторное подключение к IB.

person Aqueous Carlos    schedule 14.11.2018