IBAPI客户端连接挂起无法正常关闭断开问题求助
解决Interactive Brokers API连接无法正常断开的问题
你的代码核心问题是app.run()是阻塞调用,它会占据当前线程持续处理IB API的消息循环,导致后续的print、time.sleep和app.disconnect()完全不会被执行——这就是连接一直挂着、只能通过杀进程结束的原因。
另外代码还有个小问题:类中的print('testing')缩进错误,它应该放在__init__方法内部,否则会在类定义阶段就执行,而不是实例化IBapi对象时执行。
以下是两种可行的解决方案:
方案一:用后台线程运行消息循环(适合定时断开场景)
把app.run()放到后台线程中,让主线程可以继续执行后续的断开逻辑:
from ibapi.client import EClient from ibapi.wrapper import EWrapper import time import threading class IBapi(EWrapper, EClient): def __init__(self): EClient.__init__(self, self) print('testing') app = IBapi() app.connect('127.0.0.1', 7497, 0) # 启动后台线程处理API消息循环,避免阻塞主线程 api_thread = threading.Thread(target=app.run, daemon=True) api_thread.start() print("TEST successful: The app will stop running in 5 seconds...") time.sleep(5) # 主线程正常执行断开操作 app.disconnect()
daemon=True设置让后台线程随主线程退出而自动终止,避免程序残留线程。
方案二:通过API回调触发断开(适合操作完成后自动断开)
如果需要在特定操作(比如下单完成)后断开连接,可以重写IB API的回调方法,在操作完成时触发断开:
from ibapi.client import EClient from ibapi.wrapper import EWrapper from ibapi.order import Order from ibapi.contract import Contract class IBapi(EWrapper, EClient): def __init__(self): EClient.__init__(self, self) print('testing') def orderStatus(self, orderId, status, filled, remaining, avgFillPrice, permId, parentId, lastFillPrice, clientId, whyHeld, mktCapPrice): # 当订单完全成交时触发断开 if status == "Filled" and remaining == 0: print("订单已全部成交,准备断开连接") self.disconnect() app = IBapi() app.connect('127.0.0.1', 7497, 0) # 示例:创建合约和订单(根据需求修改) contract = Contract() contract.symbol = "AAPL" contract.secType = "STK" contract.exchange = "SMART" contract.currency = "USD" order = Order() order.action = "BUY" order.totalQuantity = 1 order.orderType = "MKT" # 发送订单 app.placeOrder(1, contract, order) # 启动消息循环,订单完成后触发回调并断开,run()会自动退出 app.run()
内容的提问来源于stack exchange,提问作者craftytech
相关产品推荐
相关产品推荐

