from datetime import datetime import ccxt import json from Common.CEnum import AUTYPE, DATA_FIELD, KL_TYPE from Common.CTime import CTime from Common.func_util import kltype_lt_day, str2float from KLine.KLine_Unit import CKLine_Unit from .CommonStockAPI import CCommonStockApi def GetColumnNameFromFieldList(fileds: str): _dict = { "time": DATA_FIELD.FIELD_TIME, "open": DATA_FIELD.FIELD_OPEN, "high": DATA_FIELD.FIELD_HIGH, "low": DATA_FIELD.FIELD_LOW, "close": DATA_FIELD.FIELD_CLOSE, } return [_dict[x] for x in fileds.split(",")] class CCXT(CCommonStockApi): is_connect = None def __init__(self, code, k_type=KL_TYPE.K_DAY, begin_date=None, end_date=None, autype=AUTYPE.QFQ): super(CCXT, self).__init__(code, k_type, begin_date, end_date, autype) def get_kl_data(self): fields = "time,open,high,low,close" exchange = ccxt.binance() timeframe = self.__convert_type() since_date = exchange.parse8601(f'{self.begin_date}T08:00:00') #file_path = "BTC_USDT-5m-futures.json" #with open(file_path, 'r') as file: # data = json.load(file) data = exchange.fetch_ohlcv(self.code, timeframe, since=since_date) for item in data: time_obj = datetime.fromtimestamp(item[0] / 1000) time_str = time_obj.strftime('%Y-%m-%d %H:%M:%S') item_data = [ time_str, item[1], item[2], item[3], item[4], item[5] ] yield CKLine_Unit(self.create_item_dict(item_data, GetColumnNameFromFieldList(fields)), autofix=True) def SetBasciInfo(self): pass @classmethod def do_init(cls): pass @classmethod def do_close(cls): pass def __convert_type(self): _dict = { KL_TYPE.K_DAY: '1d', KL_TYPE.K_WEEK: '1w', KL_TYPE.K_MON: '1M', KL_TYPE.K_5M: '5m', KL_TYPE.K_15M: '15m', KL_TYPE.K_30M: '30m', KL_TYPE.K_60M: '1h', KL_TYPE.K_1M: '1m', # need to add this 1m } return _dict[self.k_type] def parse_time_column(self, inp): if len(inp) == 10: year = int(inp[:4]) month = int(inp[5:7]) day = int(inp[8:10]) hour = minute = 0 elif len(inp) == 17: year = int(inp[:4]) month = int(inp[4:6]) day = int(inp[6:8]) hour = int(inp[8:10]) minute = int(inp[10:12]) elif len(inp) == 19: year = int(inp[:4]) month = int(inp[5:7]) day = int(inp[8:10]) hour = int(inp[11:13]) minute = int(inp[14:16]) else: raise Exception(f"unknown time column from TradingView:{inp}") return CTime(year, month, day, hour, minute, auto=not kltype_lt_day(self.k_type)) def create_item_dict(self, data, column_name): for i in range(len(data)): data[i] = self.parse_time_column(data[i]) if i == 0 else str2float(data[i]) return dict(zip(column_name, data))