首页 > 解决方案 > ib_insync reqHistoricalDataAsync 如何与 Asyncio 一起工作?

问题描述

import asyncio
import ib_insync as ibi
import symbol_list
import time

start = time.perf_counter()
stocklist = symbol_list.test
endDateTime = '20190328 09:30:00'
durationStr='1 D'
dataDirectory = './data/tmp'

class App:

    async def run(self):
        self.ib = ibi.IB()
        with await self.ib.connectAsync():
            contracts = [
                ibi.Stock(symbol, 'SMART', 'USD')
                for symbol in ['AAPL', 'TSLA', 'AMD', 'INTC']]
            for contract in contracts:
                # self.ib.reqMktData(contract)
                bars = await self.ib.reqHistoricalDataAsync(contract, 
                endDateTime=endDateTime, durationStr=durationStr,
                barSizeSetting='5 mins', whatToShow='MIDPOINT', useRTH=True)
                df = ibi.util.df(bars)
                df.to_csv(f"{dataDirectory}/{contract.symbol}.csv")


            async for tickers in self.ib.pendingTickersEvent:
                for ticker in tickers:
                    print(ticker)

    def stop(self):
        self.ib.disconnect()


app = App()
try:
    asyncio.run(app.run())
except (KeyboardInterrupt, SystemExit):
    app.stop()

endtime = (time.perf_counter() - start)/60
print(f"Process time: {endtime:,.2f} minutes")

请帮忙。我从async-streaming-example修改了示例代码。我没有收到任何错误消息,但它只是在没有给我 shell 提示的情况下运行。如果运行正常,这段代码应该只需要不到一分钟的时间。本质上,我想使用 reqHistoricalDataAsync 异步获取历史数据,而不是 reqMktData。我还查看了使用 ib_insync 的异步执行,但我也无法使用该技术。你能告诉我我做错了什么吗?我欢迎任何异步解决方案。谢谢你。

标签: python-asynciopython-multithreading

解决方案


推荐阅读