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>
Почему так смешно и как это сделать правильно? Я просто хочу получить действительный идентификатор заказа на заказ. Я не очень хороший программист, я не знаю, как работает слушатель. Пожалуйста, объясните это как можно проще. Большое спасибо!
2 ответа
Ответ прост: при первом вызове conn.placeOrder() вы использовали начальное значение oid=0. Вы не можете использовать его снова - сервер IB назначил его вашему заказу, когда он был принят, - поэтому вы получили ошибку, когда пытаетесь использовать его во второй попытке. Это не имеет никакого отношения к обмену строк.
Кстати, удивительно, что ваша первая попытка была успешной, потому что oid=0 не всегда является действительным идентификатором заказа. Если вы хотите получить действительный идентификатор заказа, вы должны вызвать conn.reqIds() и поймать ответ в обратном вызове get_valid_order_id(msg). Обратный вызов подготовлен, но я не вижу вызова reqIds. Вы можете вызывать conn.placeOrder() только после получения ответа и правильного значения oid.
Просто замечание: ваш вызов print(1) был выполнен нормально в середине обработки ошибок. Обратите внимание на символ '1' в 3-й строке: Ошибка сервера: 1...
Согласно вашему результату, отказ от размещения второго или более поздних заказов будет решен путем отключения и повторного подключения, добавьте приведенный ниже код в ваш существующий.
# disconnect
conn.disconnect()
Каждый раз, когда вы подключаетесь к IB для получения данных, размещения заказов, получения собственного портфеля и т. Д., Вам необходимо запустить while loop
или другие виды подобной логики и продолжайте повторное подключение IB.