"""
|
交易设置
|
"""
|
# 想要买的代码
|
from db.redis_manager_delegate import RedisUtils, RedisManager
|
from utils import tool, constant
|
|
|
class WantBuyCodesManager:
|
"""
|
想买单
|
"""
|
__instance = None
|
__redis_key = "want_buy_code_infos"
|
__redisManager = RedisManager(constant.REDIS_DB)
|
|
def __new__(cls, *args, **kwargs):
|
if not cls.__instance:
|
cls.__instance = super(WantBuyCodesManager, cls).__new__(cls, *args, **kwargs)
|
# 初始化设置
|
# 获取交易窗口的锁
|
cls.__want_buy_code_infos_cache = RedisUtils.smembers(cls.__get_redis(),
|
cls.__redis_key)
|
return cls.__instance
|
|
# 格式:{"代码-买入类型"}
|
__want_buy_code_infos_cache = set()
|
|
@classmethod
|
def __get_redis(cls):
|
return cls.__redisManager.getRedis()
|
|
def clear(self):
|
RedisUtils.delete(self.__get_redis(), self.__redis_key)
|
|
@classmethod
|
def __get_key(cls, code, buy_type):
|
return f"{code}-{buy_type}"
|
|
@classmethod
|
def __parse_key(cls, k):
|
ks = k.split("-")
|
return ks[0], int(ks[1])
|
|
def add_code(self, code, buy_type: int):
|
self.__want_buy_code_infos_cache.add(self.__get_key(code,buy_type))
|
RedisUtils.sadd(self.__get_redis(), self.__redis_key, self.__get_key(code,buy_type))
|
RedisUtils.expire(self.__get_redis(), self.__redis_key, tool.get_expire())
|
|
def remove_code(self, code, buy_type):
|
k = self.__get_key(code, buy_type)
|
if k not in self.__want_buy_code_infos_cache:
|
return
|
self.__want_buy_code_infos_cache.discard(k)
|
RedisUtils.srem(self.__get_redis(), self.__redis_key, k)
|
|
def sync(self):
|
codes_info = self.list_code()
|
self.__want_buy_code_infos_cache.clear()
|
if codes_info:
|
self.__want_buy_code_infos_cache |= set(codes_info)
|
|
def is_in(self, code, buy_type):
|
return RedisUtils.sismember(self.__get_redis(), self.__redis_key, self.__get_key(code, buy_type))
|
|
def is_in_cache(self, code, buy_type):
|
return self.__get_key(code, buy_type) in self.__want_buy_code_infos_cache
|
|
def list_code(self):
|
return RedisUtils.smembers(self.__get_redis(), self.__redis_key)
|
|
def list_code_cache(self):
|
return self.__want_buy_code_infos_cache
|
|
|
class TradeStateManager:
|
"""
|
交易状态管理
|
"""
|
__instance = None
|
__db = constant.REDIS_DB
|
redisManager = RedisManager(constant.REDIS_DB)
|
|
def __new__(cls, *args, **kwargs):
|
if not cls.__instance:
|
cls.__instance = super(TradeStateManager, cls).__new__(cls, *args, **kwargs)
|
cls.__instance.__trade_buy_state_cache = cls.is_can_buy()
|
return cls.__instance
|
|
@classmethod
|
def __get_redis(cls):
|
return cls.redisManager.getRedis()
|
|
def sync(self):
|
self.__trade_buy_state_cache = self.is_can_buy()
|
|
# 开启购买入口
|
def open_buy(self):
|
self.__trade_buy_state_cache = True
|
RedisUtils.setex_async(self.__db, "trade_buy_state", tool.get_expire(), 1)
|
|
# 关闭购买入口
|
def close_buy(self):
|
self.__trade_buy_state_cache = False
|
RedisUtils.setex_async(self.__db, "trade_buy_state", tool.get_expire(), 0)
|
|
# 是否可以下单
|
@classmethod
|
def is_can_buy(cls):
|
# 默认设置为可交易
|
val = RedisUtils.get(cls.__get_redis(), "trade_buy_state")
|
if val is None:
|
return True
|
if int(val) == 1:
|
return True
|
else:
|
return False
|
|
# 是否可以下单
|
|
def is_can_buy_cache(self):
|
# 默认设置为可交易
|
return self.__trade_buy_state_cache
|