def QA_fetch_cryptocurrency_list_adv(market, collections=DATABASE.cryptocurrency_list): ''' '获取数字加密资产列表' :param collections: mongodb 数据库 :return: DataFrame ''' cryptocurrency_list_items = QA_fetch_cryptocurrency_list(market) if len(cryptocurrency_list_items) == 0: print( "QA Error QA_fetch_cryptocurrency_list_adv call item for item in collections.find() return 0 item, maybe the DATABASE.cryptocurrency_list is empty!" ) return None return cryptocurrency_list_items
def QA_SU_save_bitfinex_day(frequency, ui_log=None, ui_progress=None): """ Save Bitfinex day kline 日线数据,统一转化字段保存数据为 crypto_asset_day """ symbol_template = Bitfinex_SYMBOL symbol_list = QA_fetch_cryptocurrency_list(Bitfinex_EXCHANGE) col = DATABASE.cryptocurrency_day col.create_index([("symbol", pymongo.ASCENDING), ("date_stamp", pymongo.ASCENDING)], unique=True) end = datetime.datetime.now(tzutc()) QA_util_log_info( 'Starting DOWNLOAD PROGRESS of day Klines from {:s}... '.format( Bitfinex_EXCHANGE), ui_log=ui_log, ui_progress=ui_progress) for index in range(len(symbol_list)): symbol_info = symbol_list.iloc[index] QA_util_log_info('The "{}" #{} of total in {}'.format( symbol_template.format(symbol_info['symbol']), index, len(symbol_list)), ui_log=ui_log, ui_progress=ui_progress) QA_util_log_info('DOWNLOAD PROGRESS {} '.format( str(float(index / len(symbol_list) * 100))[0:4] + '%'), ui_log=ui_log, ui_progress=ui_progress) query_id = { "symbol": symbol_template.format(symbol_info['symbol']), } ref = col.find(query_id).sort('date_stamp', -1) if (col.count_documents(query_id) > 0): start_stamp = ref.next()['date_stamp'] start_time = datetime.datetime.fromtimestamp(start_stamp + 1, tz=tzutc()) QA_util_log_info( 'UPDATE_SYMBOL "{}" Trying updating "{}" from {} to {}'.format( symbol_template.format(symbol_info['symbol']), Bitfinex2QA_FREQUENCY_DICT[frequency], QA_util_timestamp_to_str(start_time), QA_util_timestamp_to_str(end)), ui_log=ui_log, ui_progress=ui_progress) # 查询到 Kline 缺漏,点抓取模式,按缺失的时间段精确请求K线数据 missing_data_list = QA_util_find_missing_kline( symbol_template.format(symbol_info['symbol']), Bitfinex2QA_FREQUENCY_DICT[frequency], )[::-1] else: start_time = Bitfinex_MIN_DATE QA_util_log_info( 'NEW_SYMBOL "{}" Trying downloading "{}" from {} to {}'.format( symbol_template.format(symbol_info['symbol']), Bitfinex2QA_FREQUENCY_DICT[frequency], QA_util_timestamp_to_str(start_time), QA_util_timestamp_to_str(end)), ui_log=ui_log, ui_progress=ui_progress) miss_kline = pd.DataFrame( [[ int(QA_util_datetime_to_Unix_timestamp(start_time)), int(QA_util_datetime_to_Unix_timestamp(end)), '{} to {}'.format(start_time, end) ]], columns=['expected', 'between', 'missing']) missing_data_list = miss_kline.values if len(missing_data_list) > 0: # 查询确定中断的K线数据起止时间,缺分时数据,补分时数据 expected = 0 between = 1 missing = 2 reqParams = {} for i in range(len(missing_data_list)): reqParams['from'] = int(missing_data_list[i][expected]) reqParams['to'] = int(missing_data_list[i][between]) if (reqParams['from'] > (QA_util_datetime_to_Unix_timestamp() + 120)): # 出现“未来”时间,一般是默认时区设置错误造成的 QA_util_log_info( 'A unexpected \'Future\' timestamp got, Please check self.missing_data_list_func param \'tzlocalize\' set. More info: {:s}@{:s} at {:s} but current time is {}' .format( symbol_template.format(symbol_info['symbol']), frequency, QA_util_print_timestamp(reqParams['from']), QA_util_print_timestamp( QA_util_datetime_to_Unix_timestamp()))) # 跳到下一个时间段 continue QA_util_log_info( 'Fetch "{:s}" slices "{:s}" kline:{:s} to {:s}'.format( symbol_template.format(symbol_info['symbol']), Bitfinex2QA_FREQUENCY_DICT[frequency], QA_util_timestamp_to_str( missing_data_list[i][expected])[2:16], QA_util_timestamp_to_str( missing_data_list[i][between])[2:16])) data = QA_fetch_bitfinex_kline( symbol_info['symbol'], time.mktime(start_time.utctimetuple()), time.mktime(end.utctimetuple()), frequency, callback_func=QA_SU_save_data_bitfinex_callback) if data is None: QA_util_log_info('SYMBOL "{}" from {} to {} has no data'.format( symbol_template.format(symbol_info['symbol']), QA_util_timestamp_to_str(start_time), QA_util_timestamp_to_str(end)), ui_log=ui_log, ui_progress=ui_progress) continue QA_util_log_info( 'DOWNLOAD PROGRESS of day Klines from Bitfinex accomplished.', ui_log=ui_log, ui_progress=ui_progress)
def QA_SU_save_bitmex_day(frequency='1d', ui_log=None, ui_progress=None): """ 获取 bitmex K线 日线数据,统一转化字段保存数据为 crypto_asset_day """ symbol_template = bitmex_SYMBOL symbol_list = QA_fetch_cryptocurrency_list(bitmex_EXCHANGE) col = DATABASE.cryptocurrency_day col.create_index([("symbol", pymongo.ASCENDING), ("date_stamp", pymongo.ASCENDING)], unique=True) end = datetime.datetime.now(tzutc()) QA_util_log_info( 'Starting DOWNLOAD PROGRESS of day Klines from {:s}... '.format( bitmex_EXCHANGE), ui_log=ui_log, ui_progress=ui_progress) for index in range(len(symbol_list)): symbol_info = symbol_list.iloc[index] QA_util_log_info('The "{}" #{} of total in {}'.format( symbol_template.format(symbol_info['symbol']), index, len(symbol_list)), ui_log=ui_log, ui_progress=ui_progress) QA_util_log_info('DOWNLOAD PROGRESS {} '.format( str(float(index / len(symbol_list) * 100))[0:4] + '%'), ui_log=ui_log, ui_progress=ui_progress) query_id = { "symbol": symbol_template.format(symbol_info['symbol']), } ref = col.find(query_id).sort('date_stamp', -1) if (col.count_documents(query_id) > 0): start_stamp = ref.next()['date_stamp'] start_time = datetime.datetime.fromtimestamp(start_stamp + 1, tz=tzutc()) QA_util_log_info( 'UPDATE_SYMBOL "{}" Trying updating "{}" from {} to {}'.format( symbol_template.format(symbol_info['symbol']), Bitmex2QA_FREQUENCY_DICT[frequency], QA_util_timestamp_to_str(start_time), QA_util_timestamp_to_str(end)), ui_log=ui_log, ui_progress=ui_progress) else: start_time = symbol_info.get('listing', "2018-01-01T00:00:00Z") start_time = parse(start_time) QA_util_log_info( 'NEW_SYMBOL "{}" Trying downloading "{}" from {} to {}'.format( symbol_template.format(symbol_info['symbol']), Bitmex2QA_FREQUENCY_DICT[frequency], QA_util_timestamp_to_str(start_time), QA_util_timestamp_to_str(end)), ui_log=ui_log, ui_progress=ui_progress) data = QA_fetch_bitmex_kline( symbol_info['symbol'], QA_util_datetime_to_Unix_timestamp(start_time), QA_util_datetime_to_Unix_timestamp(end), frequency, callback_func=QA_SU_save_data_bitmex_callback) if data is None: QA_util_log_info('SYMBOL "{}" from {} to {} has no data'.format( symbol_template.format(symbol_info['symbol']), QA_util_timestamp_to_str(start_time), QA_util_timestamp_to_str(end)), ui_log=ui_log, ui_progress=ui_progress) continue QA_util_log_info( 'DOWNLOAD PROGRESS of day Klines from {:s} accomplished.'.format( bitmex_EXCHANGE), ui_log=ui_log, ui_progress=ui_progress)
def QA_SU_save_huobi_min( frequency=CandlestickInterval.MIN1, fetch_range='all', ui_log=None, ui_progress=None, ): """ 下载火币K线分钟数据,统一转化字段保存数据为 cryptocurrency_min """ symbol_template = huobi_SYMBOL symbol_list = QA_fetch_cryptocurrency_list(huobi_EXCHANGE) print("XXX", huobi_EXCHANGE, symbol_list) col = DATABASE.cryptocurrency_min col.create_index([("symbol", pymongo.ASCENDING), ('time_stamp', pymongo.ASCENDING), ('date_stamp', pymongo.ASCENDING)]) col.create_index([("symbol", pymongo.ASCENDING), ("type", pymongo.ASCENDING), ('time_stamp', pymongo.ASCENDING)], unique=True) end = datetime.datetime.now(tzutc()) QA_util_log_info( 'Starting DOWNLOAD PROGRESS of min Klines from {:s}... '.format( huobi_EXCHANGE), ui_log=ui_log, ui_progress=ui_progress) for index in range(len(symbol_list)): symbol_info = symbol_list.iloc[index] if ((fetch_range != 'all') and (symbol_info['symbol'] not in fetch_range)): # Process save_range[] only continue QA_util_log_info('The "{}" #{} of total in {}'.format( symbol_template.format(symbol_info['symbol']), index, len(symbol_list)), ui_log=ui_log, ui_progress=ui_progress) QA_util_log_info('DOWNLOAD PROGRESS {} '.format( str(float(index / len(symbol_list) * 100))[0:4] + '%'), ui_log=ui_log, ui_progress=ui_progress) query_id = { "symbol": symbol_template.format(symbol_info['symbol']), 'type': Huobi2QA_FREQUENCY_DICT[frequency] } ref = col.find(query_id).sort('time_stamp', -1) if (col.count_documents(query_id) > 0): start_stamp = ref.next()['time_stamp'] start_time = datetime.datetime.fromtimestamp(start_stamp + 1, tz=tzutc()) QA_util_log_info( 'UPDATE_SYMBOL "{}" Trying updating "{}" from {} to {}'.format( symbol_template.format(symbol_info['symbol']), Huobi2QA_FREQUENCY_DICT[frequency], QA_util_timestamp_to_str(start_time), QA_util_timestamp_to_str(end)), ui_log=ui_log, ui_progress=ui_progress) # 查询到 Kline 缺漏,点抓取模式,按缺失的时间段精确请求K线数据 missing_data_list = QA_util_find_missing_kline( symbol_template.format(symbol_info['symbol']), Huobi2QA_FREQUENCY_DICT[frequency], )[::-1] else: start_time = huobi_MIN_DATE QA_util_log_info( 'NEW_SYMBOL "{}" Trying downloading "{}" from {} to {}'.format( symbol_template.format(symbol_info['symbol']), Huobi2QA_FREQUENCY_DICT[frequency], QA_util_timestamp_to_str(start_time), QA_util_timestamp_to_str(end)), ui_log=ui_log, ui_progress=ui_progress) miss_kline = pd.DataFrame( [[ int(QA_util_datetime_to_Unix_timestamp(start_time)), int(QA_util_datetime_to_Unix_timestamp(end)), '{} to {}'.format(start_time, end) ]], columns=['expected', 'between', 'missing']) missing_data_list = miss_kline.values if len(missing_data_list) > 0: # 查询确定中断的K线数据起止时间,缺分时数据,补分时数据 expected = 0 between = 1 missing = 2 reqParams = {} for i in range(len(missing_data_list)): reqParams['from'] = int(missing_data_list[i][expected]) reqParams['to'] = int(missing_data_list[i][between]) if (reqParams['from'] > (QA_util_datetime_to_Unix_timestamp() + 120)): # 出现“未来”时间,一般是默认时区设置错误造成的 QA_util_log_info( 'A unexpected \'Future\' timestamp got, Please check self.missing_data_list_func param \'tzlocalize\' set. More info: {:s}@{:s} at {:s} but current time is {}' .format( symbol_template.format(symbol_info['symbol']), frequency, QA_util_print_timestamp(reqParams['from']), QA_util_print_timestamp( QA_util_datetime_to_Unix_timestamp()))) # 跳到下一个时间段 continue QA_util_log_info( 'Fetch "{:s}" slices "{:s}" kline:{:s} to {:s}'.format( symbol_template.format(symbol_info['symbol']), frequency, QA_util_timestamp_to_str( missing_data_list[i][expected])[2:16], QA_util_timestamp_to_str( missing_data_list[i][between])[2:16])) data = QA_fetch_huobi_kline_subscription( symbol_info['symbol'], start_time=reqParams['from'], end_time=reqParams['to'], frequency=frequency, callback_func=QA_SU_save_data_huobi_callback) if data is None: QA_util_log_info( 'SYMBOL "{}" from {} to {} has no MORE data'.format( symbol_template.format(symbol_info['symbol']), QA_util_timestamp_to_str(start_time), QA_util_timestamp_to_str(end))) continue QA_util_log_info( 'DOWNLOAD PROGRESS of min Klines from {:s} accomplished.'.format( huobi_EXCHANGE), ui_log=ui_log, ui_progress=ui_progress)