比如我有三个合约的指数数据想下载[‘cu’,’rb’, ‘ru’]
用for循环的方法下载,第一个品种能正常下载,下载第二个合约数据时就报错:
RuntimeError: Event loop is closed
sys:1: RuntimeWarning: coroutine ‘DataDownloader._download_data’ was never awaited
我的理解是发出第一个请求之后一直没有新的请求,原连接就被断开了,因此第二个合约的数据下载申请就报错了,那么有什么办法能连续下载呢?
附上下载数据的代码如下:
api = TqApi() cons = ['cu','rb', 'ru'] for ic2 in cons: # 下载从 2016-01-01凌晨6点 到 2020-07-21下午4点 的 ic主连 分钟线数据 symbol_name = "KQ.i@SHFE" + "." + ic2 kd = DataDownloader(api, symbol_list=symbol_name, dur_sec=60, start_dt=datetime(2014, 1, 1, 6, 0, 0), end_dt=datetime(2014, 7, 31, 16, 0, 0), csv_file_name=symbol_name + "_kline_1min.csv") with closing(api): while not kd.is_finished(): # or not td.is_finished(): api.wait_update() # print("progress: kline: %.2f%% tick:%.2f%%" % (kd.get_progress(), td.get_progress())) print(symbol_name + " progress: kline: %.2f%% " % (kd.get_progress()))
可以创建三个DataDownloader,然后在循环的 while里把三个DataDownloader的条件都加上
from contextlib import closing from datetime import datetime from tqsdk import TqApi from tqsdk.tools import DataDownloader api = TqApi() cons = ['cu', 'rb', 'ru'] downloaders = [] for ic2 in cons: # 下载从 2016-01-01凌晨6点 到 2020-07-21下午4点 的 ic主连 分钟线数据 symbol_name = "KQ.i@SHFE" + "." + ic2 kd = DataDownloader(api, symbol_list=symbol_name, dur_sec=60, start_dt=datetime(2014, 1, 1, 6, 0, 0), end_dt=datetime(2014, 7, 31, 16, 0, 0), csv_file_name=symbol_name + "_kline_1min.csv") downloaders.append(kd) with closing(api): while any([not downloader.is_finished() for downloader in downloaders]): api.wait_update() print([downloader.get_progress() for downloader in downloaders])
P.S 好像你指定的这三个合约在这个时间段没数据,我换别的合约代码是好的,所以这块儿你自己调整一下吧