""" L2卖管理 """ from db import redis_manager_delegate as redis_manager from db.redis_manager_delegate import RedisUtils from log_module import async_log_util from log_module.log import logger_l2_market_sell, logger_debug from utils import tool from utils.tool import CodeDataCacheUtil # 卖行情信息 class L2MarketSellManager: __db = 0 __redis_manager = redis_manager.RedisManager(0) __instance = None __used_refer_sell_data_cache = {} # 总卖信息列表 __total_sell_data_cache_list_cache = {} def __new__(cls, *args, **kwargs): if not cls.__instance: cls.__instance = super(L2MarketSellManager, cls).__new__(cls, *args, **kwargs) cls.__load_datas() return cls.__instance @classmethod def __get_redis(cls): return cls.__redis_manager.getRedis() @classmethod def __load_datas(cls): logger_debug.info("L2MarketSellManager __load_datas") __redis = cls.__get_redis() try: keys = RedisUtils.keys(__redis, "fast_buy_used_sell_data-*") for k in keys: code = k.split("-")[-1] val = RedisUtils.smembers(__redis, k) CodeDataCacheUtil.set_cache(cls.__used_refer_sell_data_cache, code, val) except: pass finally: RedisUtils.realse(__redis) def set_sell_time_used(self, code, time_str): if code not in self.__used_refer_sell_data_cache: self.__used_refer_sell_data_cache[code] = set() self.__used_refer_sell_data_cache[code].add(time_str) RedisUtils.sadd_async(self.__db, f"fast_buy_used_sell_data-{code}", time_str) RedisUtils.expire_async(self.__db, f"fast_buy_used_sell_data-{code}", tool.get_expire()) def is_refer_sell_time_used(self, code, time_str): if code not in self.__used_refer_sell_data_cache: return False return time_str in self.__used_refer_sell_data_cache[code] def clear(self): self.__used_refer_sell_data_cache.clear() self.__total_sell_data_cache_list_cache.clear() keys = RedisUtils.keys(self.__get_redis(), "fast_buy_used_sell_data-*") for k in keys: RedisUtils.delete_async(self.__db, k) # 设置当前的总卖 def set_current_total_sell_data(self, code, time_str, money, volume, sell_1_info, sell_n_info): """ @param code: @param time_str: @param money: @param volume: @param sell_1_info: 格式(卖1价格,卖1量) @param sell_n_info:卖挡位 @return: """ # 记录日志 async_log_util.info(logger_l2_market_sell, f"{code}: {time_str}-{money} {sell_1_info} {sell_n_info}") if code not in self.__total_sell_data_cache_list_cache: self.__total_sell_data_cache_list_cache[code] = [] if self.__total_sell_data_cache_list_cache[code] and self.__total_sell_data_cache_list_cache[code][-1][ 0] == time_str: return self.__total_sell_data_cache_list_cache[code].append((time_str, round(money), volume, sell_1_info, sell_n_info)) # 保留最多10条数据 if len(self.__total_sell_data_cache_list_cache[code]) > 10: self.__total_sell_data_cache_list_cache[code] = self.__total_sell_data_cache_list_cache[code][-10:] def get_current_total_sell_data(self, code): """ @param code: @return:(时间, 总买额, 总量, 卖1信息, 卖挡位信息) """ total_sell_data_cache_list = self.__total_sell_data_cache_list_cache.get(code) if not total_sell_data_cache_list: return None return total_sell_data_cache_list[-1] # 获取参考卖的数据 def get_refer_sell_data(self, code, time_str): """ 获取可引用的总卖额 @param code: @param time_str: 当前数据截止时间 @return: (time_str, round(money), volume, sell_1_info, sell_n_infos) """ total_sell_data_cache_list = self.__total_sell_data_cache_list_cache.get(code) if total_sell_data_cache_list: for i in range(len(total_sell_data_cache_list) - 1, -1, -1): sell_data = total_sell_data_cache_list[i] if int(time_str.replace(":", "")) > int(sell_data[0].replace(":", "")): # 取刚好比当前时间早的数据 return sell_data return None # 板上卖统计 class L2LimitUpSellManager: __db = 0 __redis_manager = redis_manager.RedisManager(0) __instance = None __limit_up_sell_cache = {} def __new__(cls, *args, **kwargs): if not cls.__instance: cls.__instance = super(L2LimitUpSellManager, cls).__new__(cls, *args, **kwargs) cls.__load_datas() return cls.__instance @classmethod def __get_redis(cls): return cls.__redis_manager.getRedis() @classmethod def __load_datas(cls): __redis = cls.__get_redis() try: keys = RedisUtils.keys(__redis, "limit_up_sell_indexes-*") for k in keys: code = k.split("-")[-1] val = RedisUtils.smembers(__redis, k) CodeDataCacheUtil.set_cache(cls.__limit_up_sell_cache, code, val) except: pass finally: RedisUtils.realse(__redis) def add_limit_up_sell(self, code, index): if code not in self.__limit_up_sell_cache: self.__limit_up_sell_cache[code] = set() self.__limit_up_sell_cache[code].add(index) RedisUtils.sadd_async(self.__db, f"limit_up_sell_indexes-{code}", index) RedisUtils.expire_async(self.__db, f"limit_up_sell_indexes-{code}", tool.get_expire()) def remove_limit_up_sell(self, code, index): if code in self.__limit_up_sell_cache: self.__limit_up_sell_cache[code].discard(index) RedisUtils.srem_async(self.__db, f"limit_up_sell_indexes-{code}", index) def clear(self): self.__limit_up_sell_cache.clear() keys = RedisUtils.keys(self.__get_redis(), "limit_up_sell_indexes-*") for k in keys: RedisUtils.delete_async(self.__db, k) # 设置当前的总卖 def get_limit_up_sell_indexes(self, code): if code in self.__limit_up_sell_cache: return self.__limit_up_sell_cache[code] return set()