TWS IB网关(版本972/974)客户端不断断开连接
TWS IB Gateway (version 972/974) Client keeps disconnecting
我正在尝试连接 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
对可能出现的问题有什么建议吗?如果需要,我可以显示更多来自调试的错误消息。
如果您仅通过更改客户端 ID 就可以正常连接,这通常表示之前的连接未正确关闭,TWS 认为它仍处于打开状态。要断开 API 客户端,您应该显式调用 EClient.disconnect 函数,在您的示例中被覆盖为:
test_app.disconnect()
虽然没有必要在每个任务后都 disconnect/reconnect,并且您可以让连接保持打开状态较长时间。
如果在连接后立即调用 API 函数(例如 reqHistoricalData),您有时可能会遇到问题。最好在发起连接后稍作停顿,等待nextValidID
等回调,确保连接完成后再继续。
http://interactivebrokers.github.io/tws-api/connection.html#connect
我不确定函数 init_error()
在您的示例中的用途是什么,因为它总是在创建 TestApp 对象时被调用(无论是否有错误)。
安装最新版本的 TWS API (v 9.76) 解决了问题。
我正在尝试连接 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
对可能出现的问题有什么建议吗?如果需要,我可以显示更多来自调试的错误消息。
如果您仅通过更改客户端 ID 就可以正常连接,这通常表示之前的连接未正确关闭,TWS 认为它仍处于打开状态。要断开 API 客户端,您应该显式调用 EClient.disconnect 函数,在您的示例中被覆盖为:
test_app.disconnect()
虽然没有必要在每个任务后都 disconnect/reconnect,并且您可以让连接保持打开状态较长时间。
如果在连接后立即调用 API 函数(例如 reqHistoricalData),您有时可能会遇到问题。最好在发起连接后稍作停顿,等待nextValidID
等回调,确保连接完成后再继续。
http://interactivebrokers.github.io/tws-api/connection.html#connect
我不确定函数 init_error()
在您的示例中的用途是什么,因为它总是在创建 TestApp 对象时被调用(无论是否有错误)。
安装最新版本的 TWS API (v 9.76) 解决了问题。