From 65afea1ba534b51f947cbe7989d7f4d650bbc9e6 Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期一, 04 十一月 2024 18:29:00 +0800
Subject: [PATCH] 代码异常保护

---
 third_data/code_plate_key_manager.py |  103 +++++++++++++++++++++++++++++++++++++++++++--------
 1 files changed, 86 insertions(+), 17 deletions(-)

diff --git a/third_data/code_plate_key_manager.py b/third_data/code_plate_key_manager.py
index 884d33d..09a40b6 100644
--- a/third_data/code_plate_key_manager.py
+++ b/third_data/code_plate_key_manager.py
@@ -21,7 +21,7 @@
 from log_module import log, async_log_util
 from db import redis_manager_delegate as redis_manager
 
-from log_module.log import logger_kpl_block_can_buy, logger_debug
+from log_module.log import logger_kpl_block_can_buy, logger_debug, logger_kpl_jx_out
 from third_data.kpl_util import KPLPlatManager
 from trade import trade_manager, l2_trade_util, trade_constant
 
@@ -126,6 +126,8 @@
                         async_log_util.info(logger_kpl_block_can_buy,
                                             f"{code}:鑾峰彇鍒扮簿閫夋澘鍧�-{blocks}  鑰楁椂:{int(time.time() - start_time)}s")
                         self.save_jx_blocks(code, blocks, current_limit_up_blocks)
+                        # 璺熼殢绮鹃�夋澘鍧椾竴璧锋洿鏂�
+                        self.load_jx_blocks_radical(code)
                     else:
                         # 杩樻病娑ㄥ仠鐨勯渶瑕佹洿鏂扮簿閫夋澘鍧� 鏇存柊绮鹃�夋澘鍧�
                         if abs(float(buy_1_price) - float(limit_up_price)) >= 0.001:
@@ -146,6 +148,8 @@
                                 async_log_util.info(logger_kpl_block_can_buy,
                                                     f"{code}:鑾峰彇鍒扮簿閫夋澘鍧楋紙鏇存柊锛�-{blocks}  鑰楁椂:{int(time.time() - start_time)}s")
                                 self.save_jx_blocks(code, blocks, current_limit_up_blocks)
+                                # 璺熼殢绮鹃�夋澘鍧椾竴璧锋洿鏂�
+                                self.load_jx_blocks_radical(code)
                 elif price_rate > 0.03:
                     # 娣诲姞澶囩敤鏉垮潡
                     if not self.get_jx_blocks_cache(code, by=True):
@@ -154,6 +158,8 @@
                         self.save_jx_blocks(code, blocks, current_limit_up_blocks, by=True)
                         async_log_util.info(logger_kpl_block_can_buy,
                                             f"{code}:鑾峰彇鍒扮簿閫夋澘鍧�(澶囩敤)-{blocks}  鑰楁椂:{int(time.time() - start_time)}s")
+                        # 璺熼殢绮鹃�夋澘鍧椾竴璧锋洿鏂�
+                        self.load_jx_blocks_radical(code)
 
                 if price_rate > 0.03:
                     if not self.__code_blocks_for_radical_buy.get(code):
@@ -287,12 +293,6 @@
     def get_today_limit_up_reason(cls, code):
         return cls.__today_total_limit_up_reason_dict.get(code)
 
-    # 浠婃棩娑ㄥ仠鍘熷洜鍙樺寲
-    def set_today_limit_up_reason_change(self, code, from_reason, to_reason):
-        RedisUtils.sadd(self.__get_redis(), f"kpl_limit_up_reason_his-{code}", from_reason)
-        RedisUtils.expire(self.__get_redis(), f"kpl_limit_up_reason_his-{code}", tool.get_expire())
-        self.__set_total_keys(code)
-
     # 璁剧疆浠g爜鐨勪粖鏃ユ定鍋滃師鍥�
     def __set_total_keys(self, code):
         keys = set()
@@ -331,6 +331,8 @@
         return fresult
 
 
+
+
 # 瀹炴椂寮�鐩樺暒甯傚満鏁版嵁
 class RealTimeKplMarketData:
     # 绮鹃�夊墠5
@@ -344,11 +346,18 @@
     __KPLPlateForbiddenManager = KPLPlateForbiddenManager()
     __LimitUpCodesPlateKeyManager = LimitUpCodesPlateKeyManager()
     __KPLPlatManager = KPLPlatManager()
-    # 绮鹃�夊墠鍑�
+    # 绮鹃�夋祦鍏ュ墠鍑�
     __top_jx_blocks = set()
+    # 绮鹃�夋祦鍑哄墠鍑�
+    __top_jx_out_blocks = set()
 
     @classmethod
     def set_market_jingxuan_blocks(cls, datas):
+        """
+        璁剧疆绮鹃�夋祦鍏ユ暟鎹�
+        @param datas:
+        @return:
+        """
         blocks = set()
         for data in datas:
             if data[3] <= 0:
@@ -357,8 +366,34 @@
         cls.__top_jx_blocks = blocks
 
     @classmethod
+    def set_market_jingxuan_out_blocks(cls, datas):
+        """
+        璁剧疆绮鹃�夋祦鍑烘暟鎹�
+        @param datas:
+        @return:
+        """
+        blocks = set()
+        for i in range(0, len(datas)):
+            if i >= 10 and int(tool.get_now_time_str().replace(":", "")) < int("100000"):
+                # 10鐐瑰墠鐪嬪墠10锛屽崄鐐瑰悗涓嶇湅鍓�10
+                break
+            data = datas[i]
+            if data[3] > 0 - 5e7:
+                # 杩囨护5鍗冧竾浠ヤ笂鐨�
+                break
+            blocks.add(kpl_util.filter_block(data[1]))
+
+        # 璁板綍绮鹃�夋祦鍑烘棩蹇�
+        async_log_util.info(logger_kpl_jx_out, f"鍘熸暟鎹細{datas[:10]} 鏉垮潡锛歿blocks}")
+        cls.__top_jx_out_blocks = blocks
+
+    @classmethod
     def get_top_market_jingxuan_blocks(cls):
         return cls.__top_jx_blocks
+
+    @classmethod
+    def get_top_market_jingxuan_out_blocks(cls):
+        return cls.__top_jx_out_blocks
 
     @classmethod
     def set_top_5_industry(cls, datas):
@@ -410,6 +445,14 @@
     __history_limit_up_reason_dict = {}
     # 鏉垮潡
     __blocks_dict = {}
+
+    __instance = None
+
+    def __new__(cls, *args, **kwargs):
+        if not cls.__instance:
+            cls.__instance = super(CodesHisReasonAndBlocksManager, cls).__new__(cls, *args, **kwargs)
+
+        return cls.__instance
 
     def __get_redis(self):
         return self.__redisManager.getRedis()
@@ -493,6 +536,14 @@
         except:
             pass
         return set()
+
+    def get_history_blocks_cache(self, code):
+        """
+        鑾峰彇180澶╃殑鍘嗗彶娑ㄥ仠鍘熷洜缂撳瓨
+        @param code:
+        @return:
+        """
+        return self.__history_blocks_dict_cache.get(code)
 
 
 # 鐩爣浠g爜鏉垮潡鍏抽敭璇嶇鐞�
@@ -872,7 +923,8 @@
             current_limit_up_datas = []
 
         # 鑾峰彇鐩爣浠g爜鏉垮潡
-        keys, k1, k11, k2, k3, k4 = cls.__TargetCodePlateKeyManager.get_plate_keys(code)
+        # keys, k1, k11, k2, k3, k4 = cls.__TargetCodePlateKeyManager.get_plate_keys(code)
+        keys, k1 = RadicalBuyBlockManager.get_code_blocks(code)
 
         # log.logger_kpl_debug.info("{}鏈�缁堝叧閿瘝锛歿}", code, keys)
 
@@ -881,6 +933,7 @@
         fresults = []
         if not keys:
             return fresults, set()
+
         code_limit_up_reasons_dict = {}
         load_code_block()
         for block in keys:
@@ -1053,7 +1106,7 @@
 
 class RadicalBuyBlockManager:
     """
-    婵�杩涗拱鏉垮潡绠$悊
+    鎵叆涔版澘鍧楃鐞�
     """
     __TargetCodePlateKeyManager = TargetCodePlateKeyManager()
     # 涓婃鐨勬定鍋滀唬鐮�
@@ -1146,6 +1199,10 @@
             limit_up_time = time.time()
         for k in LimitUpDataConstant.current_limit_up_datas:
             _code = k[0]
+            # 鍓旈櫎4鏉夸互涓婄殑鏉�
+            if kpl_util.get_high_level_count(k[4]) >= 4:
+                continue
+
             if _code in exclude_codes:
                 continue
             blocks = LimitUpDataConstant.get_blocks_with_history(_code)
@@ -1201,6 +1258,11 @@
         limit_up_space_ge_60s_codes = set()
         for k in LimitUpDataConstant.history_limit_up_datas:
             _code = k[3]
+
+            # 鍓旈櫎4鏉夸互涓婄殑鏉�
+            if kpl_util.get_high_level_count(k[12]) >= 4:
+                continue
+
             if _code in exclude_codes:
                 continue
             blocks = LimitUpDataConstant.get_blocks_with_history(_code)
@@ -1305,8 +1367,8 @@
             if RedicalBuyDataManager.can_buy(history_before_codes_info[0][0],
                                              DealAndDelegateWithBuyModeDataManager().get_deal_codes())[0]:
                 return False, f"寮�1鏁伴噺锛歿count}锛屽墠鎺掍唬鐮佸彲涔帮細{history_before_codes_info[0]}"
-            return True, f"寮�1鏁伴噺锛歿count}锛屽墠鎺掍唬鐮佷笉鍙拱锛歿history_before_codes_info[0]}"
-        return True, f"寮�1鏁伴噺锛歿count}锛屽巻鍙�-{history_index + 1} 瀹炴椂-{current_index + 1}"
+            return True, f"寮�1鏁伴噺锛歿count}锛屽墠鎺掍唬鐮佷笉鍙拱锛歿history_before_codes_info[0]}锛屽巻鍙插墠鎺�-{history_before_codes_info}锛屽紑1浠g爜-{open_limit_up_block_codes}"
+        return True, f"寮�1鏁伴噺锛歿count}锛屽巻鍙�-{history_index + 1} 瀹炴椂-{current_index + 1}锛� 鍓嶆帓浠g爜-{current_before_codes_info}, 寮�1浠g爜-{open_limit_up_block_codes}"
 
     @classmethod
     def __is_radical_buy_with_block_up(cls, code, block, yesterday_limit_up_codes):
@@ -1387,12 +1449,12 @@
             else:
                 # 璺濈涓婁釜浠g爜娑ㄥ仠5鍒嗛挓浠ュ唴
                 if tool.trade_time_sub(tool.timestamp_format(limit_up_timestamp, '%H:%M:%S'),
-                                       tool.timestamp_format(current_before_codes_info[-1][1], '%H:%M:%S')) >= 5 * 60:
-                    return False, f"璺濈涓婁釜浠g爜娑ㄥ仠宸茶繃鍘�5鍒嗛挓锛坽current_before_codes_info[-1]}锛�"
+                                       tool.timestamp_format(current_before_codes_info[-1][1], '%H:%M:%S')) >= 10 * 60:
+                    return False, f"璺濈涓婁釜浠g爜娑ㄥ仠宸茶繃鍘�10鍒嗛挓锛坽current_before_codes_info[-1]}锛�"
         else:
             if tool.trade_time_sub(tool.timestamp_format(limit_up_timestamp, '%H:%M:%S'),
-                                   tool.timestamp_format(current_before_codes_info[-1][1], '%H:%M:%S')) >= 5 * 60:
-                return False, f"璺濈涓婁釜浠g爜娑ㄥ仠宸茶繃鍘�5鍒嗛挓锛坽current_before_codes_info[-1]}锛�"
+                                   tool.timestamp_format(current_before_codes_info[-1][1], '%H:%M:%S')) >= 10 * 60:
+                return False, f"璺濈涓婁釜浠g爜娑ㄥ仠宸茶繃鍘�10鍒嗛挓锛坽current_before_codes_info[-1]}锛�"
 
         return True, f"婊¤冻涔板叆闇�姹�: 鍓嶆帓浠g爜-{current_before_codes_info}"
 
@@ -1459,7 +1521,7 @@
         if blocks is None:
             blocks = set()
         # 灏嗚幏鍙栨定鍋滃師鍥犱笌娑ㄥ仠鎺ㄨ崘
-        keys = TargetCodePlateKeyManager().get_plate_keys(code, contains_today=False)
+        keys = TargetCodePlateKeyManager().get_plate_keys(code, contains_today=True)
         if keys and keys[0]:
             blocks |= set(keys[0])
         return blocks
@@ -1481,6 +1543,13 @@
         if match_blocks_3:
             match_blocks_3 -= constant.KPL_INVALID_BLOCKS
             fblocks |= match_blocks_3
+        # 鑾峰彇寮�鐩樺暒鍘嗗彶娑ㄥ仠鍘熷洜
+        kpl_history_blocks = CodesHisReasonAndBlocksManager().get_history_blocks_cache(code)
+        if kpl_history_blocks:
+            fblocks |= BlockMapManager().filter_blocks(kpl_history_blocks)
+        jx_out_blocks = RealTimeKplMarketData.get_top_market_jingxuan_out_blocks()
+        if jx_out_blocks:
+            fblocks -= jx_out_blocks
 
         return fblocks, match_blocks
 

--
Gitblit v1.8.0