From a6db14d8bf83be51d61b285a86f16ffe7b4ce5cf Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期四, 12 九月 2024 00:08:14 +0800
Subject: [PATCH] 激进买策略修复

---
 third_data/code_plate_key_manager.py |  132 +++++++++++++++++++++++++++++++------------
 1 files changed, 94 insertions(+), 38 deletions(-)

diff --git a/third_data/code_plate_key_manager.py b/third_data/code_plate_key_manager.py
index 0324401..05c452e 100644
--- a/third_data/code_plate_key_manager.py
+++ b/third_data/code_plate_key_manager.py
@@ -15,6 +15,7 @@
 from third_data.history_k_data_manager import HistoryKDataManager
 from third_data.history_k_data_util import HistoryKDatasUtils
 from third_data.kpl_data_constant import LimitUpDataConstant
+from trade.radical_buy_data_manager import RedicalBuyDataManager
 from utils import global_util, tool, buy_condition_util, init_data_util
 from log_module import log, async_log_util
 from db import redis_manager_delegate as redis_manager
@@ -1131,7 +1132,7 @@
         kpl_data_constant.open_limit_up_code_dict_for_radical_buy = temp_dict
 
     @classmethod
-    def __get_current_index(cls, code, block, yesterday_limit_up_codes):
+    def __get_current_index(cls, code, block, yesterday_limit_up_codes, exclude_codes=None):
         """
         鑾峰彇褰撳墠娑ㄥ仠韬綅
         @param code:
@@ -1139,12 +1140,16 @@
         @param yesterday_limit_up_codes:
         @return: 绱㈠紩,鍓嶆帓浠g爜淇℃伅锛圼(浠g爜, 娑ㄥ仠鏃堕棿)]锛�
         """
+        if exclude_codes is None:
+            exclude_codes = set()
         current_index = 0
         block_codes_infos = []
         timestamp_start, timestamp_end = kpl_block_util.open_limit_up_time_range
         limit_up_time = time.time()
         for k in LimitUpDataConstant.current_limit_up_datas:
             _code = k[0]
+            if _code in exclude_codes:
+                continue
             blocks = LimitUpDataConstant.get_blocks_with_history(_code)
             if not blocks:
                 blocks = set()
@@ -1178,7 +1183,7 @@
         return current_index, before_codes_info
 
     @classmethod
-    def __get_history_index(cls, code, block, yesterday_limit_up_codes):
+    def __get_history_index(cls, code, block, yesterday_limit_up_codes, exclude_codes=None):
         """
         鑾峰彇鍘嗗彶娑ㄥ仠韬綅
         @param code:
@@ -1187,13 +1192,18 @@
         @param current_limit_up_codes: 鐩墠鐨勬定鍋滀唬鐮�
         @return:
         """
+        if exclude_codes is None:
+            exclude_codes = set()
         history_index = 0
         block_codes_infos = []
         # 寮�1鏃堕棿鑼冨洿
         timestamp_start, timestamp_end = kpl_block_util.open_limit_up_time_range
         limit_up_time = time.time()
+        limit_up_space_ge_60s_codes = set()
         for k in LimitUpDataConstant.history_limit_up_datas:
             _code = k[3]
+            if _code in exclude_codes:
+                continue
             blocks = LimitUpDataConstant.get_blocks_with_history(_code)
             if _code == code:
                 # 鑾峰彇褰撳墠浠g爜娑ㄥ仠鏃堕棿
@@ -1210,9 +1220,11 @@
             # 鍓旈櫎楂樹綅鏉�
             if _code in yesterday_limit_up_codes:
                 continue
-            # 鍓旈櫎鐐告澘浠g爜鎸佺画娑ㄥ仠鏃堕棿灏忎簬1鍒嗛挓鐨勪唬鐮�
+            # 鍓旈櫎鐐告澘浠g爜鎸佺画娑ㄥ仠鏃堕棿灏忎簬1鍒嗛挓鐨勪唬鐮� 涓� 鍙兘鐢ㄤ簬涓嶆帓闄ゅ墠2鏉℃暟鎹�
             if _code not in cls.__current_limit_up_codes and _code in cls.__total_limit_up_space_dict and \
-                    cls.__total_limit_up_space_dict[_code] < 60:
+                    cls.__total_limit_up_space_dict[_code] < 60 and not exclude_codes and len(
+                limit_up_space_ge_60s_codes) < 3:
+                limit_up_space_ge_60s_codes.add(_code)
                 continue
             # 浠g爜,娑ㄥ仠鏃堕棿
             block_codes_infos.append((_code, int(k[5])))
@@ -1238,11 +1250,13 @@
         @param yesterday_limit_up_codes 鏄ㄦ棩娑ㄥ仠浠g爜
         @return:
         """
-        # 9:45鐐逛箣鍓嶆墠鑳戒拱鍏�
-        if not constant.TEST:
-            if int(tool.get_now_time_str().replace(":", "")) > 94500:
-                return False, "瓒呰繃鐢熸晥鏃堕棿"
-
+        # 9:45鐐逛箣鍓嶆定鍋滅殑鎵嶈兘涔板叆
+        # 鑾峰彇褰撳墠浠g爜鐨勬定鍋滄椂闂�
+        limit_up_timestamp = LimitUpDataConstant.get_first_limit_up_time(code)
+        if not limit_up_timestamp:
+            limit_up_timestamp = time.time()
+        if int(tool.timestamp_format(limit_up_timestamp, "%H%M%S")) > 94500:
+            return False, "瓒呰繃鐢熸晥鏃堕棿"
         # 鏍规嵁鏉垮潡鑱氬悎鏁版嵁
         open_limit_up_block_codes_dict = {}
         for c in kpl_data_constant.open_limit_up_code_dict_for_radical_buy:
@@ -1259,27 +1273,50 @@
         history_index, history_before_codes_info = cls.__get_history_index(code, block, yesterday_limit_up_codes)
         # ----鑾峰彇瀹炴椂韬綅----
         current_index, current_before_codes_info = cls.__get_current_index(code, block, yesterday_limit_up_codes)
+        exclude_codes = set()
         if count >= 2 or (
                 count == 1 and kpl_data_constant.open_limit_up_code_dict_for_radical_buy[open_limit_up_block_codes[0]][
             0] == 2):
             # 寮�濮嬫暟閲忓ぇ浜�2涓垨鑰呭彧鏈変竴涓�2鏉垮紑1
-            if history_index == 0 and current_index == 0:
-                return True, f"寮�1鏁伴噺锛歿count}"
-            else:
-                return False, f"寮�1鏁伴噺锛歿count}锛岄潪寮�1棣栨澘韬綅涓嶅尮閰嶏細鍘嗗彶-{history_index + 1} 瀹炴椂-{current_index + 1}"
+            exclude_codes.clear()
         else:
-            # 涔拌��3
-            if history_index == 1 and current_index == 1:
-                return True, f"寮�1鏁伴噺锛歿count}"
+            # 鑾峰彇鍖呭惈楂樹綅鏉跨殑韬綅
+            # ----鑾峰彇鍘嗗彶韬綅----
+            history_index, history_before_codes_info = cls.__get_history_index(code, block, set())
+            # ----鑾峰彇瀹炴椂韬綅----
+            current_index, current_before_codes_info = cls.__get_current_index(code, block, set())
+            if history_before_codes_info and current_before_codes_info and history_before_codes_info[0][0] == \
+                    current_before_codes_info[0][0]:
+                # 鍓嶆帓绗竴涓厓绱犳棤鐐告澘
+                exclude_codes = {history_before_codes_info[0][0]}
             else:
-                return False, f"寮�1鏁伴噺锛歿count}锛岄潪寮�1棣栨澘韬綅涓嶅尮閰嶏細鍘嗗彶-{history_index + 1} 瀹炴椂-{current_index + 1}"
+                return False, f"寮�1鏁伴噺锛歿count}锛屽巻鍙�-{history_index + 1} 瀹炴椂-{current_index + 1}"
+
+        # 鑾峰彇涓绘澘鐨勮韩浣�
+        history_index, history_before_codes_info = cls.__get_history_index(code, block,
+                                                                           yesterday_limit_up_codes,
+                                                                           exclude_codes=exclude_codes)
+        # 涔伴鏉胯�佸ぇ/鑰佷簩
+        # 棣栨澘鑰佸ぇ涓嶈兘涔版椂鍙拱鑰佷簩
+        if history_index > 1:
+            return False, f"寮�1鏁伴噺锛歿count}锛岄潪寮�1棣栨澘韬綅涓嶅尮閰嶏細鍘嗗彶-{history_index + 1} 瀹炴椂-{current_index + 1}"
+        if history_index == 1:
+            # 褰撳墠浠g爜涓鸿��2锛岃鍒ゆ柇鑰佸ぇ鏄惁鍙拱
+            if RedicalBuyDataManager.can_buy(history_before_codes_info[0][0])[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}"
 
     @classmethod
     def __is_radical_buy_with_block_up(cls, code, block, yesterday_limit_up_codes):
         """
         鏄惁婵�杩涗拱锛堟澘鍧楃獊鐒舵定璧锋潵锛�
-        鑰佸ぇ鍜岃�佷簩鐨勬定鍋滄椂闂寸浉宸�5鍒嗛挓鍐�
-        鑰佷笁鐨勬定鍋滄椂闂磋窛绂昏�佸ぇ娑ㄥ仠鍦�10鍒嗛挓鍐呭氨涔�
+        1.鑰佸ぇ鍜岃�佷簩鐨勬定鍋滄椂闂寸浉宸�5鍒嗛挓鍐�
+        2.鑰佷笁鐨勬定鍋滄椂闂磋窛绂昏�佸ぇ娑ㄥ仠鍦�10鍒嗛挓鍐呭氨涔�
+        3.鍓�2涓エ涓嶈兘鐐告澘锛堝巻鍙茶韩浣嶄笌鐜板湪韬綅涓�鑷达級
+        4.闄ゅ紑鍓嶄袱涓唬鐮佸彲涔拌��1涓庤��2
+        5.涔拌��2鐨勬儏鍐碉細鑰�1涓嶆弧瓒充拱鍏ユ潯浠�
+
         @param code:
         @param block:
         @param yesterday_limit_up_codes:
@@ -1287,25 +1324,44 @@
         """
         # 鑾峰彇褰撳墠鐨勬澘鍧�
         current_index, current_before_codes_info = cls.__get_current_index(code, block, set())
+        current_before_codes = [x[0] for x in current_before_codes_info]
+
         if len(current_before_codes_info) < 2:
-            return False, f"鍓嶆帓浠g爜灏忎簬2涓�"
-        if current_before_codes_info[0][1] >= kpl_block_util.open_limit_up_time_range[1]:
-            return False, f"鏈夊紑1"
-        if current_index != 2:
-            return False, f"鍙兘涔拌��3锛屽綋鍓嶈韩浣�-{current_index + 1}"
-        history_index, history_before_codes_info = cls.__get_history_index(code, block, set())
-        if history_index != current_index or len(current_before_codes_info) != len(history_before_codes_info):
-            return False, f"鍓嶆帓浠g爜鏈夌偢鏉�"
+            return False, f"鍓嶆帓浠g爜灏忎簬2涓細{current_before_codes_info}"
+        if current_before_codes_info[0][1] < kpl_block_util.open_limit_up_time_range[1]:
+            return False, f"鏈夊紑1锛歿current_before_codes_info}"
 
         # 鑰佸ぇ锛岃�佷簩蹇呴』鐩搁殧5鍒嗛挓鍐�
-        if current_before_codes_info[1][1] - current_before_codes_info[0][1] < 5 * 60:
-            # 鑾峰彇褰撳墠浠g爜鐨勬定鍋滄椂闂�
-            limit_up_timestamp = LimitUpDataConstant.get_first_limit_up_time(code)
-            if not limit_up_timestamp:
-                limit_up_timestamp = time.time()
-            if limit_up_timestamp - current_before_codes_info[0][1] < 10 * 60:
-                return True, f"鍓嶆帓娑ㄥ仠:{current_before_codes_info}"
-        return False, "鍓嶆帓娑ㄥ仠鏃堕棿闂撮殧涓嶆弧瓒虫潯浠�"
+        if current_before_codes_info[1][1] - current_before_codes_info[0][1] >= 5 * 60:
+            return False, f"鑰佸ぇ鑰佷簩娑ㄥ仠鏃堕棿蹇呴』闂撮殧5鍒嗛挓鍐�"
+
+        # 鑾峰彇褰撳墠浠g爜鐨勬定鍋滄椂闂�
+        limit_up_timestamp = LimitUpDataConstant.get_first_limit_up_time(code)
+        if not limit_up_timestamp:
+            limit_up_timestamp = time.time()
+        if limit_up_timestamp - current_before_codes_info[0][1] >= 10 * 60:
+            return False, f"璺濈鑰佸ぇ娑ㄥ仠宸茶繃鍘�10鍒嗛挓锛坽current_before_codes_info[0]}锛�"
+
+        history_index, history_before_codes_info = cls.__get_history_index(code, block, set())
+        history_before_codes = [x[0] for x in history_before_codes_info]
+
+        # 鍓嶄袱涓唬鐮佹槸鍚︽湁鐐告澘
+        dif_codes = set(history_before_codes[:2]) - set(current_before_codes[:2])
+        if dif_codes:
+            return False, f"鍓�2浠g爜鏈夌偢鏉匡細{dif_codes}"
+        # 涓嶈绠楀墠2鐨勪唬鐮�
+        exclude_codes = set(current_before_codes[:2])
+        history_index, history_before_codes_info = cls.__get_history_index(code, block, yesterday_limit_up_codes,
+                                                                           exclude_codes)
+        if history_index > 1:
+            return False, f"鎺掗櫎鍓�2锛岀洰鏍囦唬鐮佷綅浜庡巻鍙茶韩浣�-{history_index + 1}锛屽墠鎺掍唬鐮侊細{history_before_codes_info}"
+        if history_index == 1:
+            # 棣栨澘鑰�2锛屽垽鏂墠闈㈢殑鑰佸ぇ鏄惁鏄睘浜庝笉鑳戒拱鐨勮寖鐣�
+            pre_code = history_before_codes_info[0][0]
+            # pre_code涓嶈兘涔帮紝鎵嶈兘涔�
+            if RedicalBuyDataManager.can_buy(pre_code)[0]:
+                return False, f"鍓嶆帓浠g爜鍙拱锛歿pre_code}"
+        return True, "婊¤冻涔板叆闇�姹�"
 
     @classmethod
     def is_radical_buy(cls, code, yesterday_limit_up_codes):
@@ -1333,16 +1389,16 @@
             result = cls.__is_radical_buy_with_open_limitup(code, b, yesterday_limit_up_codes)
             if result[0]:
                 can_buy_blocks.add(b)
-            msges.append(f"銆恵b}銆�:{result}")
+            msges.append(f"銆恵b}銆�:{result[1]}")
         fmsges.append("寮�1鍒ゆ柇##" + ",".join(msges))
         if not can_buy_blocks:
             msges.clear()
-            for b in match_blocks:
+            for b in keys_:
                 # 鏉垮潡蹇�熷惎鍔�
                 result = cls.__is_radical_buy_with_block_up(code, b, yesterday_limit_up_codes)
                 if result[0]:
                     can_buy_blocks.add(b)
-                msges.append(f"銆恵b}銆�:{result}")
+                msges.append(f"銆恵b}銆�:{result[1]}")
             fmsges.append("鏉垮潡蹇�熷惎鍔ㄥ垽鏂�##" + ",".join(msges))
         return can_buy_blocks, " **** ".join(fmsges)
 

--
Gitblit v1.8.0