New file |
| | |
| | | """ |
| | | 历史K线管理 |
| | | """ |
| | | import datetime |
| | | import os |
| | | |
| | | import constant |
| | | |
| | | |
| | | class HistoryKDataManager: |
| | | __instance = None |
| | | __db = 0 |
| | | |
| | | def __new__(cls, *args, **kwargs): |
| | | if not cls.__instance: |
| | | cls.__instance = super(HistoryKDataManager, cls).__new__(cls, *args, **kwargs) |
| | | cls.__load_data() |
| | | return cls.__instance |
| | | |
| | | @classmethod |
| | | def __load_data(cls): |
| | | pass |
| | | |
| | | def __get_cache_dir(self): |
| | | """ |
| | | 获取缓存路径 |
| | | @return: |
| | | """ |
| | | dir_path = f"{constant.get_path_prefix()}/datas/k_bars" |
| | | if not os.path.exists(dir_path): |
| | | os.makedirs(dir_path) |
| | | return dir_path |
| | | |
| | | def __del_outdate_datas(self, code): |
| | | dir_path = self.__get_cache_dir() |
| | | datas = [] |
| | | for root, dirs, files in os.walk(dir_path): |
| | | for file in files: |
| | | # 输出文件的绝对路径 |
| | | if file.find(code) < 0: |
| | | continue |
| | | path_ = os.path.join(root, file) |
| | | day = file.split("_")[0] |
| | | datas.append((day, path_)) |
| | | # 保存最新的一条数据 |
| | | if datas: |
| | | datas.sort(key=lambda x: int(x[0].replace("-", "")), reverse=True) |
| | | datas = datas[1:] |
| | | for d in datas: |
| | | os.remove(d[1]) |
| | | |
| | | def save_history_bars(self, code, day, datas, force=False): |
| | | """ |
| | | 保存历史K线 |
| | | @param code: 代码 |
| | | @param day: K线最新的日期(取datas最新一条数据的日期) |
| | | @param datas: 数据 |
| | | @return: |
| | | """ |
| | | cache_dir = self.__get_cache_dir() |
| | | file_name = f"{day}_{code}.txt" |
| | | path_str = f"{cache_dir}/{file_name}" |
| | | if os.path.exists(path_str) and not force: |
| | | return |
| | | if datas: |
| | | # 将日期格式化 |
| | | for d in datas: |
| | | for k in d: |
| | | if type(d[k]) == datetime.datetime: |
| | | d[k] = d[k].strftime("%Y-%m-%d %H:%M:%S") |
| | | |
| | | with open(path_str, encoding="utf-8", mode='w') as f: |
| | | f.write(f"{datas}") |
| | | self.__del_outdate_datas(code) |
| | | |
| | | def get_history_bars(self, code, day): |
| | | """ |
| | | 获取历史K线 |
| | | @param code: |
| | | @param day: |
| | | @return: |
| | | """ |
| | | cache_dir = self.__get_cache_dir() |
| | | file_name = f"{day}_{code}.txt" |
| | | path_str = f"{cache_dir}/{file_name}" |
| | | if not os.path.exists(path_str): |
| | | return None |
| | | with open(path_str, encoding="utf-8", mode='r') as f: |
| | | line = f.readline() |
| | | if line: |
| | | datas = eval(line) |
| | | # 将日期格式转为datetime |
| | | for d in datas: |
| | | for k in d: |
| | | if type(d[k]) == str and d[k].find("-") > 0 and d[k].find(":") > 0 and d[k].find(" ") > 0: |
| | | d[k] = datetime.datetime.strptime(d[k], "%Y-%m-%d %H:%M:%S") |
| | | return datas |
| | | return None |
| | | |
| | | def get_history_bars_code_count(self, day): |
| | | """ |
| | | 获取某一天的历史K线的数量 |
| | | @param day: |
| | | @return: |
| | | """ |
| | | dir_path = self.__get_cache_dir() |
| | | count = 0 |
| | | for root, dirs, files in os.walk(dir_path): |
| | | for file in files: |
| | | # 输出文件的绝对路径 |
| | | if file.find(day) >= 0: |
| | | count += 1 |
| | | return count |