无法使用 ib_insync 下whatIfOrder

问题描述 投票:0回答:1

我尝试使用

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。我不知道发生了什么。

python python-asyncio ib-insync
1个回答
0
投票

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()
© www.soinside.com 2019 - 2024. All rights reserved.