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

Я пытаюсь связаться с 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 ]

1 голос
/ 12 апреля 2020

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

test_app.disconnect()

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

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

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

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

0 голосов
/ 12 апреля 2020

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

https://interactivebrokers.github.io/#

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...