2020-07-20 02:25:37 +00:00
|
|
|
|
# flake8: noqa
|
|
|
|
|
"""
|
|
|
|
|
下载天勤期货历史tick数据 => vnpy项目目录/bar_data/tq/
|
|
|
|
|
"""
|
|
|
|
|
import os
|
|
|
|
|
import sys
|
|
|
|
|
import json
|
|
|
|
|
import csv
|
|
|
|
|
from collections import OrderedDict
|
|
|
|
|
import pandas as pd
|
|
|
|
|
from contextlib import closing
|
|
|
|
|
from datetime import datetime, timedelta
|
|
|
|
|
import argparse
|
2022-01-06 03:36:26 +00:00
|
|
|
|
from tqsdk import TqApi, TqSim,TqAuth
|
2020-07-20 02:25:37 +00:00
|
|
|
|
|
|
|
|
|
vnpy_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..'))
|
|
|
|
|
if vnpy_root not in sys.path:
|
|
|
|
|
sys.path.append(vnpy_root)
|
|
|
|
|
|
|
|
|
|
os.environ["VNPY_TESTING"] = "1"
|
|
|
|
|
|
|
|
|
|
from vnpy.data.tdx.tdx_future_data import get_future_contracts, Exchange
|
|
|
|
|
from vnpy.trader.utility import get_csv_last_dt, get_underlying_symbol, extract_vt_symbol
|
2022-01-06 03:36:26 +00:00
|
|
|
|
from vnpy.data.tq.downloader import DataDownloader,get_account_config
|
2020-07-20 02:25:37 +00:00
|
|
|
|
|
|
|
|
|
if __name__ == "__main__":
|
|
|
|
|
if len(sys.argv) <= 1:
|
|
|
|
|
print('请使用 --help 查看说明')
|
|
|
|
|
# 参数分析
|
|
|
|
|
parser = argparse.ArgumentParser()
|
|
|
|
|
parser.add_argument('-s', '--symbol', type=str, default='', help='下载合约,格式: rb2010 或者 SHFE.rb2010')
|
|
|
|
|
parser.add_argument('-b', '--begin', type=str, default='20160101', help='开始日期,格式:20160101')
|
|
|
|
|
parser.add_argument('-e', '--end', type=str, default=datetime.now().strftime('%Y%m%d'),
|
|
|
|
|
help='结束日期,格式:{}'.format(datetime.now().strftime('%Y%m%d')))
|
|
|
|
|
args = parser.parse_args()
|
|
|
|
|
if len(args.symbol) == 0:
|
|
|
|
|
print('下载合约未设定 参数 -s rb2010')
|
|
|
|
|
os._exit(0)
|
2022-01-06 03:36:26 +00:00
|
|
|
|
auth_dict = get_account_config()
|
2020-08-19 03:46:07 +00:00
|
|
|
|
# 开始下载(使用快期的免费行情websocket)
|
2022-01-06 03:36:26 +00:00
|
|
|
|
api = TqApi(account=TqSim(), auth=TqAuth(auth_dict['user_name'],auth_dict['password'])) # url="wss://u.shinnytech.com/t/md/front/mobile"
|
2020-07-20 02:25:37 +00:00
|
|
|
|
download_tasks = {}
|
|
|
|
|
begin_date = datetime.strptime(args.begin, '%Y%m%d')
|
|
|
|
|
end_date = datetime.strptime(args.end, '%Y%m%d')
|
2020-08-07 07:17:41 +00:00
|
|
|
|
if end_date > datetime.now():
|
|
|
|
|
end_date = datetime.now()
|
2020-07-20 02:25:37 +00:00
|
|
|
|
n_days = (end_date - begin_date).days
|
|
|
|
|
|
|
|
|
|
future_contracts = get_future_contracts()
|
|
|
|
|
if '.' not in args.symbol:
|
|
|
|
|
underly_symbol = get_underlying_symbol(args.symbol).upper()
|
|
|
|
|
contract_info = future_contracts.get(underly_symbol)
|
|
|
|
|
symbol = args.symbol
|
|
|
|
|
exchange = Exchange(contract_info.get('exchange'))
|
|
|
|
|
else:
|
|
|
|
|
symbol, exchange = extract_vt_symbol(args.symbol)
|
|
|
|
|
|
|
|
|
|
if n_days <= 0:
|
|
|
|
|
n_days = 1
|
|
|
|
|
|
2020-08-19 03:46:07 +00:00
|
|
|
|
for n in range(n_days + 1):
|
2020-07-20 02:25:37 +00:00
|
|
|
|
download_date = begin_date + timedelta(days=n)
|
|
|
|
|
if download_date.isoweekday() in [6, 7]:
|
|
|
|
|
continue
|
|
|
|
|
|
|
|
|
|
save_folder = os.path.abspath(os.path.join(
|
|
|
|
|
vnpy_root, 'tick_data', 'tq', 'future',
|
|
|
|
|
download_date.strftime('%Y%m')))
|
|
|
|
|
if not os.path.exists(save_folder):
|
|
|
|
|
os.makedirs(save_folder)
|
|
|
|
|
|
|
|
|
|
save_file = os.path.abspath(os.path.join(save_folder,
|
2020-08-19 03:46:07 +00:00
|
|
|
|
"{}_{}.csv".format(symbol, download_date.strftime('%Y%m%d'))))
|
2020-07-20 02:25:37 +00:00
|
|
|
|
zip_file = os.path.abspath(os.path.join(save_folder,
|
2020-08-19 03:46:07 +00:00
|
|
|
|
"{}_{}.pkb2".format(symbol, download_date.strftime('%Y%m%d'))))
|
2020-08-07 07:17:41 +00:00
|
|
|
|
|
2020-07-20 02:25:37 +00:00
|
|
|
|
if os.path.exists(save_file):
|
2020-08-07 07:17:41 +00:00
|
|
|
|
# 文件size是否大于1024字节
|
|
|
|
|
if os.path.getsize(save_file) > 1024:
|
|
|
|
|
# 获取最后的tick时间
|
|
|
|
|
dt = get_csv_last_dt(file_name=save_file, dt_format='%Y-%m-%d %H:%M:%S.%f')
|
|
|
|
|
# 判断是否为交易日最后
|
|
|
|
|
if dt and dt.hour == 14 and dt.minute == 59:
|
|
|
|
|
continue
|
|
|
|
|
|
2020-07-20 02:25:37 +00:00
|
|
|
|
if os.path.exists(zip_file):
|
2020-08-07 07:17:41 +00:00
|
|
|
|
if os.path.getsize(save_file) > 1024:
|
|
|
|
|
continue
|
2020-07-20 02:25:37 +00:00
|
|
|
|
|
|
|
|
|
# 下载从 2018-05-01凌晨0点 到 2018-06-01凌晨0点 的 T1809 盘口Tick数据
|
|
|
|
|
download_tasks["{}_{}_tick".format(symbol, download_date.strftime('%Y%m%d'))] = DataDownloader(
|
|
|
|
|
api,
|
|
|
|
|
symbol_list=f"{exchange.value}.{symbol}",
|
|
|
|
|
dur_sec=0,
|
|
|
|
|
start_dt=download_date.date(),
|
|
|
|
|
end_dt=download_date.replace(hour=16), csv_file_name=save_file)
|
|
|
|
|
|
|
|
|
|
# 使用with closing机制确保下载完成后释放对应的资源
|
|
|
|
|
with closing(api):
|
|
|
|
|
while not all([v.is_finished() for v in download_tasks.values()]):
|
|
|
|
|
api.wait_update()
|
|
|
|
|
print("progress: ", {k: ("%.2f%%" % v.get_progress()) for k, v in download_tasks.items()})
|