Методы IBpy Ewrapper не работают только EClientSocket

Привет, я пытаюсь использовать IBPy как здесь: https://github.com/blampe/IbPy и это реагирует очень странно. Методы, вызывающие класс EClientSocket, возвращают данные, но любой метод EClientSocket, вызывающий методы EWrapper или EWrapper, возвращает None и / или имеет проблемы. Я понимаю, что API-интерфейс IB является асинхронным в его источнике в Java, но я не могу понять, где он ломается. У меня в TWS включены соединения DDE/Socket и даже указан clientId(100).

Я использую демонстрацию IB TWS по этой ссылке: https://www.interactivebrokers.com/en/index.php?f=553&twsdemo=1 и Python 3.4. Моя версия IBpy устанавливается с помощью pip install ib-api.

Вот мой код:

from ib.opt import ibConnection, Connection, message
from ib.ext.Contract import Contract
from ib.ext.EWrapper import EWrapper
from ib.ext.EClientSocket import EClientSocket
from ib.ext.ExecutionFilter import ExecutionFilter
from ib.ext.Order import Order
import time
from time import sleep

def reply_handler(msg):
print("Reply:", msg)

def create_contract(symbol, sec_type, exch, prim_exch, curr):
contract = Contract()
contract.m_symbol = symbol
contract.m_sec_type = sec_type
contract.m_exch = exch
contract.m_prim_exch = prim_exch
contract.m_curr = curr
return contract

if __name__ == "__main__":
tws_conn = ibConnection(host='localhost', port=7496, clientId=100)
tws_conn.connect()

tws_conn.registerAll(reply_handler)

contract = Contract()
contract.m_symbol = 'GE'
contract.m_exchange = 'SMART'
contract.m_localSymbol = 'GE'
contract.m_primaryExch = 'SMART'
contract.m_currency = 'USD'
contract.m_secType = 'STK'

#EClientSocket only methods
reply_handler(tws_conn.isConnected())
reply_handler(tws_conn.serverVersion())
reply_handler(tws_conn.TwsConnectionTime())

#EWrapper methods or calls to EWrapper methods
reply_handler(tws_conn.reqCurrentTime())
reply_handler(tws_conn.reqAccountUpdates(1, ''))
reply_handler(tws_conn.currentTime())
reply_handler(tws_conn.reqMktData(1, contract, '', False))
reply_handler(tws_conn.contractDetails(1, contract))

Вот вывод консоли при запуске скрипта:

Версия сервера: 76

TWS Время на соединение:20150529 23:29:54 PST

Ответ: правда

Ответ: 76

Ответ:20150529 23:29:54 PST

Ответ: нет

Ответ: нет

Ответ: текущее время = нет

Ответ: нет

Ответ: нет

Ответ: contractDetails reqId=1, contractDetails=ib.ext.Contract.Contract объект в 0x000000000287FB70

Ответ: нет

Вы можете видеть, что после 3-го метода последний вызов EClientSocket перестает работать. Я просмотрел документацию IB и IBpy, и эта конкретная проблема нигде не упоминается в Stackru. Спасибо за любую помощь!

2 ответа

Решение

Это немного сбивает вас с толку, чтобы обернуть ваши звонки в reply_handler(), Он зарегистрирован в tws_conn возражать, чтобы получить все ответы, это все, что вам нужно сделать. Все, что не является запросом сокета, как tws_conn.isConnected() просто должен быть в печати (), что все reply_handler does, но это выглядит как ответ от EReader - это не.

Также в tws_conn.contractDetails... ты забыл req,

from ib.opt import ibConnection, Connection, message
from ib.ext.Contract import Contract
from ib.ext.EWrapper import EWrapper
from ib.ext.EClientSocket import EClientSocket

def reply_handler(msg):
    print("Reply:", msg)

tws_conn = ibConnection(host='localhost', port=7496, clientId=1)
tws_conn.registerAll(reply_handler)
tws_conn.connect()


contract = Contract()
contract.m_symbol = 'GE'
contract.m_exchange = 'SMART'
contract.m_currency = 'USD'
contract.m_secType = 'STK'

#EClientSocket only methods
reply_handler(tws_conn.isConnected())
reply_handler(tws_conn.serverVersion())
reply_handler(tws_conn.TwsConnectionTime())

#EWrapper methods or calls to EWrapper methods
tws_conn.reqCurrentTime()
tws_conn.reqContractDetails(1, contract)
#tws_conn.disconnect()#don't forget at some point

Хорошо, так что я понял это. Это было смехотворно просто и тупо до предела.

Очевидно, что если вы вызываете API IB и не ставите паузу после каждого вызова, обработчик ничего не возвращает. Это не то, что я мог найти в документации по API.

Поэтому time.sleep(1) в качестве последней строки метода или следующей строки после вызова метода работает отлично.

Другие вопросы по тегам