TWS IB Gateway (версия 972/974) Клиент продолжает отключаться

Я пытаюсь подключиться к IB Api, чтобы загрузить некоторые исторические данные. Я заметил, что мой клиент подключается к API, но затем автоматически отключается через очень короткий промежуток времени (~ несколько секунд).

Вот лог на сервере:

socket connection for client{10} has closed.
Connection terminated.

Вот мой основной код для запуска приложения:

class TestApp(TestWrapper, TestClient):
 def __init__(self):
    TestWrapper.__init__(self)
    TestClient.__init__(self, wrapper=self)
    self.connect(config.ib_hostname, config.ib_port, config.ib_session_id)
    self.session_id = int(config.ib_session_id)
    self.thread = Thread(target = self.run)
    self.thread.start()
    setattr(self, "_thread", self.thread)
    self.init_error()

 def reset_connection(self):
    pass

 def check_contract(self, name, exchange_name, security_type, currency):
    self.reset_connection()
    ibcontract = IBcontract()
    ibcontract.secType = security_type
    ibcontract.symbol = name
    ibcontract.exchange = exchange_name
    ibcontract.currency = currency
    return self.resolve_ib_contract(ibcontract)

def resolve_contract(self, security):
    self.reset_connection()
    ibcontract = IBcontract()
    ibcontract.secType = security.security_type()
    ibcontract.symbol=security.name()
    ibcontract.exchange=security.exchange()
    ibcontract.currency = security.currency()
    return self.resolve_ib_contract(ibcontract)

 def get_historical_data(self, security, duration, bar_size, what_to_show):
    self.reset_connection()
    resolved_ibcontract=self.resolve_contract(security)
    data = test_app.get_IB_historical_data(resolved_ibcontract.contract, duration, bar_size, what_to_show)
    return data



def create_app():
 test_app = TestApp()
 return test_app

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

2 ответа

Решение

Установка последней версии TWS API (v 9.76) решила проблему.

https://interactivebrokers.github.io/

Если вы можете подключиться без проблем, только изменив идентификатор клиента, обычно это означает, что предыдущее соединение не было закрыто должным образом, и TWS считает, что оно все еще открыто. Чтобы отключить клиент API, вы должны вызвать явную функцию EClient.disconnect, переопределенную в вашем примере как:

test_app.disconnect()

Хотя нет необходимости отключать / повторно подключаться после каждой задачи, и вы можете просто оставить соединение открытым на длительное время.

Иногда могут возникнуть проблемы, если функция API, такая как reqHistoricalData, вызывается сразу после подключения. Лучше всего иметь небольшую паузу после установления соединения, чтобы дождаться обратного вызова, напримерnextValidID чтобы убедиться, что соединение установлено, прежде чем продолжить.

http://interactivebrokers.github.io/tws-api/connection.html

Я не уверен, что это за функция init_error() предназначен для в вашем примере, поскольку он всегда будет вызываться при создании объекта TestApp (независимо от того, есть ли ошибка).

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