""" 成交大单管理 """ import json from db.redis_manager_delegate import RedisUtils from utils import tool from db import redis_manager_delegate as redis_manager from l2 import l2_data_util, l2_data_source_util # 成交进度计算 class DealOrderNoManager: __db = 2 __redisManager = redis_manager.RedisManager(2) __deal_orderno_cache = {} __last_progress = {} __instance = None def __new__(cls, *args, **kwargs): if not cls.__instance: cls.__instance = super(DealOrderNoManager, cls).__new__(cls, *args, **kwargs) cls.__load_datas() return cls.__instance @classmethod def __get_redis(cls): return cls.__redisManager.getRedis() @classmethod def __load_datas(cls): __redis = cls.__get_redis() try: keys = RedisUtils.keys(__redis, "deal_orderno-*") for k in keys: code = k.split("-")[-1] val = RedisUtils.smembers(__redis, k) if val is None: val = set() tool.CodeDataCacheUtil.set_cache(cls.__deal_orderno_cache, code, val) finally: RedisUtils.realse(__redis) # 添加订单号 def __add_orderno(self, code, orderno): RedisUtils.sadd_async(self.__db, f"deal_orderno-{code}", orderno) RedisUtils.expire_async(self.__db, f"deal_orderno-{code}", tool.get_expire()) # 移除订单号 def __remove_orderno(self, code, orderno): RedisUtils.srem_async(self.__db, f"deal_orderno-{code}", orderno) RedisUtils.expire_async(self.__db, f"deal_orderno-{code}", tool.get_expire()) # 清除数据 def clear(self): self.__deal_orderno_cache.clear() keys = RedisUtils.keys(self.__get_redis(), "deal_orderno-*") for k in keys: RedisUtils.delete_async(self.__db, k) def remove_orderno(self, code, orderno): if code in self.__deal_orderno_cache: if orderno in self.__deal_orderno_cache[code]: self.__deal_orderno_cache[code].discard(orderno) self.__remove_orderno(code, orderno) def add_orderno(self, code, orderno): if code not in self.__deal_orderno_cache: self.__deal_orderno_cache[code] = set() self.__deal_orderno_cache[code].add(orderno) self.__add_orderno(code, orderno) # 设置成交进度 def get_deal_nums(self, code, orderno_map: dict): if code not in self.__deal_orderno_cache: return 0 total_num = 0 for orderno in self.__deal_orderno_cache[code]: if orderno_map: if str(orderno) in orderno_map: data = orderno_map[str(orderno)] total_num += data["val"]["num"] * data["re"] return total_num def get_deal_ordernos(self, code): return self.__deal_orderno_cache.get(code) # 统计大单总共成交手数 def get_deal_big_money_num(code): val = DealOrderNoManager().get_deal_nums(code, l2_data_util.local_today_buyno_map.get(code)) return val # 统计大单成交笔数 def get_deal_big_money_count(code): ordernos = DealOrderNoManager().get_deal_ordernos(code) if ordernos: return len(ordernos) return 0 if __name__ == "__main__": pass