我尝试使用
ib_insync
下假设订单,但在调用 whatIfOrder
时收到与 asyncio 事件循环相关的错误:
此事件循环已在运行。
定期下订单而不是假设订单是有效的。以下示例重现了这种情况。
from ib_insync import IB, Forex, Ticker, MarketOrder
def on_tick(ticker: Ticker):
o = MarketOrder("BUY", 10000)
res = ib.whatIfOrder(contract, o) # => ERROR
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.run()
启动了事件循环(使用 loop.run_forever()
),但是 loop.is_running()
为 false。我不知道发生了什么。
ib.whatIfOrder()
正在阻塞并尝试启动新循环(请参阅此处https://ib-insync.readthedocs.io/_modules/ib_insync/ib.html#IB.whatIfOrder)。
不要使用阻塞版本,而是使用 异步版本:
from ib_insync import IB, Forex, Ticker, MarketOrder
async def on_tick(ticker: Ticker):
o = MarketOrder("BUY", 10000)
try:
res = await ib.whatIfOrderAsync(contract, o) # use the async version
# do something with res
except Exception as e:
print(f"Error: {e}")
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()