使用ib_insync提交whatIfOrder时遇事件循环已运行错误
解决ib_insync中whatIfOrder调用触发事件循环冲突的问题
问题原因
在ticker.updateEvent的同步回调函数中直接调用异步方法ib.whatIfOrder,会触发事件循环冲突报错。ib.run()已经启动了ib_insync内部的事件循环,同步回调中直接调用异步方法会尝试重复使用已运行的循环,导致"This event loop is already running."错误。
另外你提到loop.is_running()返回false,大概率是因为你获取的是默认asyncio循环,而非ib_insync实例使用的内部循环,检查ib.loop.is_running()应该会返回true。
解决方案
将whatIfOrder的调用用ib.runAsync()包裹,把异步任务提交到当前运行的ib_insync事件循环中执行:
from ib_insync import IB, Forex, Ticker, MarketOrder def on_tick(ticker: Ticker): o = MarketOrder("BUY", 10000) # 用runAsync包装异步调用,避免循环冲突 ib.runAsync(ib.whatIfOrder(contract, o)) ib = IB() ib.connect(host='127.0.0.1', port=4001, clientId=1) contract = Forex('GBPUSD', 'IDEALPRO') ib.qualifyContracts(contract) ticker = ib.reqMktData(contract) ticker.updateEvent += on_tick ib.run()
原理说明
ib.whatIfOrder是异步方法,必须在事件循环上下文内执行。ib.runAsync()是ib_insync提供的工具方法,专门用于在已启动的事件循环中提交异步任务,避免同步回调与异步方法的执行冲突。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

