Administrator
2024-07-10 d475991a9d0abc94edfb3a5d9761df8bed8b4fc4
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
"""
交易设置
"""
# 想要买的代码
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