Administrator
2025-06-12 ab662be5c523b75c1bd28fc6bfcab2872b9623b3
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
"""
交易管理器,
对一系列的代码交易变量,下单,撤单进行管理
"""
# 交易管理器
import copy
import json
 
from code_attribute import gpcode_manager
from db import redis_manager_delegate as redis_manager
from db.mysql_data_delegate import Mysqldb
from db.redis_manager_delegate import RedisUtils
from log_module import async_log_util
from trade import trade_constant
 
from log_module.log import *
from utils import import_util, tool, huaxin_util
 
trade_gui = import_util.import_lib("trade.trade_gui")
 
__db = 12
__redis_manager = redis_manager.RedisManager(__db)
 
guiTrade = None  # trade_gui.THSGuiTrade() if trade_gui is not None else None
 
latest_trade_delegate_data = []
 
 
# 关闭购买入口
# 开启购买入口
class TradeStateManager:
    __instance = None
    __db = 12
    redisManager = redis_manager.RedisManager(12)
 
    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
 
 
# 代码的交易状态管理
class CodesTradeStateManager:
    __trade_state_cache = {}
    __db = 12
    __redis_manager = redis_manager.RedisManager(12)
    __instance = None
 
    def __new__(cls, *args, **kwargs):
        if not cls.__instance:
            cls.__instance = super(CodesTradeStateManager, 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, "trade-state-*", auto_free=False)
            if keys:
                for key in keys:
                    code = key.replace("trade-state-", '')
                    cls.__trade_state_cache[code] = int(RedisUtils.get(__redis, key, auto_free=False))
        finally:
            RedisUtils.realse(__redis)
 
    # 获取交易状态
    def get_trade_state(self, code):
        state = RedisUtils.get(self.__get_redis(), "trade-state-{}".format(code))
        if state is None:
            return trade_constant.TRADE_STATE_NOT_TRADE
        return int(state)
 
    def get_trade_state_cache(self, code):
        cache_result = tool.CodeDataCacheUtil.get_cache(self.__trade_state_cache, code)
        if cache_result[0]:
            return cache_result[1]
        return trade_constant.TRADE_STATE_NOT_TRADE
 
    def get_trade_state_dict(self):
        return copy.deepcopy(self.__trade_state_cache)
 
    # 设置交易状态
    def set_trade_state(self, code, state):
        async_log_util.info(logger_trade, "set_trade_state {}-{}".format(code, state))
        tool.CodeDataCacheUtil.set_cache(self.__trade_state_cache, code, state)
        RedisUtils.setex_async(self.__db, "trade-state-{}".format(code), tool.get_expire(), state)
 
    def get_codes_by_trade_state(self, state):
        redis = self.__get_redis()
        try:
            keys = RedisUtils.keys(redis, "trade-state-*", auto_free=False)
            codes = []
            if keys is not None:
                for key in keys:
                    if int(RedisUtils.get(redis, key, auto_free=False)) == state:
                        codes.append(key.replace("trade-state-", ''))
            return codes
        finally:
            RedisUtils.realse(redis)
 
    def get_codes_by_trade_states(self, states):
        redis = self.__get_redis()
        try:
            keys = RedisUtils.keys(redis, "trade-state-*", auto_free=False)
            codes = []
            if keys is not None:
                for key in keys:
                    if int(RedisUtils.get(redis, key, auto_free=False)) in states:
                        codes.append(key.replace("trade-state-", ''))
            return codes
        finally:
            RedisUtils.realse(redis)
 
    def get_codes_by_trade_states_cache(self, states):
        # 获取
        codes = []
        for code in self.__trade_state_cache:
            if self.__trade_state_cache[code] in states:
                codes.append(code)
        return codes
 
    # 设置交易账户的可用金额
 
 
@tool.singleton
class DealCodesManager:
    """
    成交代码管理
    """
    __db = 12
 
    # 成交代码的订单信息:{代码:{交易id:(量,价格,系统订单号)}}
 
    def __init__(self):
        self.musql = Mysqldb()
        self.__deal_code_orders_info = {}
        self.redis_manager = redis_manager.RedisManager(12)
        # 下过单的板块代码
        self.__place_order_plate_codes_info = {}
        self.__load_data()
 
    def __get_redis(self):
        return self.redis_manager.getRedis()
 
    def __load_data(self):
        # 不算打板的数据
        sql = f"select tradeID,securityID, orderSysID,price,volume from hx_trade_deal_record where `direction` = '0' and tradingDay = '{tool.get_now_date_str('%Y%m%d')}'"
        results = self.musql.select_all(sql)
        if results:
            for r in results:
                self.add_deal_order(r[1], r[4], round(float(r[3]), 2), r[0], r[2])
 
        val = RedisUtils.get(self.__get_redis(), "place_order_plate_codes_info")
        if val:
            self.__place_order_plate_codes_info = json.loads(val)
 
    def add_deal_order(self, code, volume, price, trade_id, order_sys_id):
        """
        添加成交大单
        @param code:
        @param volume:
        @param price:
        @param trade_id:
        @param order_sys_id:
        @return:
        """
        pre_price = gpcode_manager.CodePrePriceManager().get_price_pre_cache(code)
        if pre_price and round((price - pre_price) / pre_price, 4) > 0.08 * (tool.get_limit_up_rate(code) - 1) * 10:
            # 视为打板买入,不处理数据
            return
        if code not in self.__deal_code_orders_info:
            self.__deal_code_orders_info[code] = {}
        if trade_id in self.__deal_code_orders_info[code]:
            return
        self.__deal_code_orders_info[code][trade_id] = (volume, price, order_sys_id)
 
    def get_deal_codes(self):
        if not self.__deal_code_orders_info:
            return set()
        return set(self.__deal_code_orders_info.keys())
 
    def place_order(self, plate, code):
        """
        下单
        @param plate:
        @param code:
        @return:
        """
        if plate not in self.__place_order_plate_codes_info:
            self.__place_order_plate_codes_info[plate] = []
        if code not in self.__place_order_plate_codes_info[plate]:
            self.__place_order_plate_codes_info[plate].append(code)
        RedisUtils.setex_async(self.__db, "place_order_plate_codes_info", tool.get_expire(),
                               json.dumps(self.__place_order_plate_codes_info))
 
    def get_place_order_plate_codes(self):
        return self.__place_order_plate_codes_info
 
 
__CodesTradeStateManager = CodesTradeStateManager()
 
if __name__ == "__main__":
    codes = DealCodesManager().get_codes()
    print(codes)