From 7ca9e90febd61dbcc5357349294affe95ea04105 Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期五, 30 八月 2024 00:34:33 +0800
Subject: [PATCH] 激进买入完善

---
 third_data/code_plate_key_manager.py |  226 ++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 211 insertions(+), 15 deletions(-)

diff --git a/third_data/code_plate_key_manager.py b/third_data/code_plate_key_manager.py
index 4f0be3a..c3224b3 100644
--- a/third_data/code_plate_key_manager.py
+++ b/third_data/code_plate_key_manager.py
@@ -14,6 +14,7 @@
 from settings.trade_setting import MarketSituationManager
 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 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
@@ -1050,6 +1051,13 @@
         cls.__can_buy_compute_result_dict[code] = (
             can_buy_blocks, unique, msg, can_buy_strong_blocks, keys, active_buy_blocks)
 
+
+class RadicalBuyBlockManager:
+    """
+    婵�杩涗拱鏉垮潡绠$悊
+    """
+    __TargetCodePlateKeyManager = TargetCodePlateKeyManager()
+
     @classmethod
     def compute_open_limit_up_code_dict_for_radical_buy(cls, current_limit_up_datas):
         """
@@ -1057,9 +1065,7 @@
         @param current_limit_up_datas:
         @return:
         """
-        timestamp_start = time.mktime(
-            time.strptime(datetime.datetime.now().strftime("%Y-%m-%d") + " 09:25:00", '%Y-%m-%d %H:%M:%S'))
-        timestamp_end = time.mktime(time.strptime(datetime.datetime.now().strftime("%Y-%m-%d") + " 09:30:00", '%Y-%m-%d %H:%M:%S'))
+        timestamp_start, timestamp_end = kpl_block_util.open_limit_up_time_range
         temp_dict = {}
         for d in current_limit_up_datas:
             code = d[0]
@@ -1067,36 +1073,226 @@
             # 璁$畻鏄惁寮�1
             if int(d[2]) >= timestamp_end or int(d[2]) < timestamp_start:
                 continue
-            # 鍓旈櫎5鏉夸互涓婄殑
-            if d[4].find("杩炴澘") > 0 and int(d[4].replace("杩炴澘", "")) >= 5:
-                continue
             buy1_money = huaxin_l1_data_manager.get_buy1_money(code)
-            if not buy1_money or buy1_money < 1e8:
+            # 涔�1鏄惁澶т簬5000w
+            if not buy1_money or buy1_money < 5e7:
                 continue
             if not tool.is_can_buy_code(code):
                 continue
-            # 涔�1鏄惁澶т簬1浜�
             blocks = {d[5]}
             if d[6]:
                 blocks |= set(d[6].split("銆�"))
             blocks -= constant.KPL_INVALID_BLOCKS
-            temp_dict[code] = (kpl_util.get_high_level_count(d[4]), d[6])
+            temp_dict[code] = (kpl_util.get_high_level_count(d[4]), blocks)
         kpl_data_constant.open_limit_up_code_dict_for_radical_buy = temp_dict
 
     @classmethod
-    def is_radical_buy(cls, code):
+    def __get_current_index(cls, code, block, yesterday_limit_up_codes):
+        """
+        鑾峰彇褰撳墠娑ㄥ仠韬綅
+        @param code:
+        @param block:
+        @param yesterday_limit_up_codes:
+        @return: 绱㈠紩,鍓嶆帓浠g爜淇℃伅锛圼(浠g爜, 娑ㄥ仠鏃堕棿)]锛�
+        """
+        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]
+            blocks = LimitUpDataConstant.get_blocks_with_history(_code)
+            if not blocks:
+                blocks = set()
+            if _code == code:
+                # 鑾峰彇褰撳墠浠g爜娑ㄥ仠鏃堕棿
+                limit_up_time = int(k[2])
+                continue
+            # 涓嶆槸杩欎釜鏉垮潡
+            if block not in blocks:
+                continue
+            if not tool.is_can_buy_code(_code):
+                continue
+            # 鍓旈櫎寮�1鐨勬暟鎹�
+            if timestamp_start <= int(k[2]) < timestamp_end:
+                continue
+            # 鍓旈櫎楂樹綅鏉�
+            if _code in yesterday_limit_up_codes:
+                continue
+            # 浠g爜.娑ㄥ仠鏃堕棿
+            block_codes_infos.append((_code, int(k[2])))
+        block_codes_infos.append((code, limit_up_time))
+        block_codes_infos.sort(key=lambda x: x[1])
+        before_codes_info = []
+        for i in range(0, len(block_codes_infos)):
+            if block_codes_infos[i][0] == code:
+                current_index = i
+                break
+            else:
+                before_codes_info.append(block_codes_infos[i])
+
+        return current_index, before_codes_info
+
+    @classmethod
+    def __get_history_index(cls, code, block, yesterday_limit_up_codes):
+        """
+        鑾峰彇鍘嗗彶娑ㄥ仠韬綅
+        @param code:
+        @param block:
+        @param current_limit_up_datas:
+        @return:
+        """
+        history_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.history_limit_up_datas:
+            _code = k[3]
+            blocks = LimitUpDataConstant.get_blocks_with_history(_code)
+            if _code == code:
+                # 鑾峰彇褰撳墠浠g爜娑ㄥ仠鏃堕棿
+                limit_up_time = int(k[5])
+                continue
+            # 涓嶆槸杩欎釜鏉垮潡
+            if block not in blocks:
+                continue
+            if not tool.is_can_buy_code(_code):
+                continue
+            # 鍓旈櫎寮�1鐨勬暟鎹�
+            if timestamp_start <= int(k[5]) < timestamp_end:
+                continue
+            # 鍓旈櫎楂樹綅鏉�
+            if _code in yesterday_limit_up_codes:
+                continue
+            # 浠g爜.娑ㄥ仠鏃堕棿
+            block_codes_infos.append((_code, int(k[5])))
+        block_codes_infos.append((code, limit_up_time))
+        block_codes_infos.sort(key=lambda x: x[1])
+        before_codes_info = []
+        for i in range(0, len(block_codes_infos)):
+            if block_codes_infos[i][0] == code:
+                history_index = i
+                break
+            else:
+                before_codes_info.append(block_codes_infos[i])
+        return history_index, before_codes_info
+
+    @classmethod
+    def __is_radical_buy_with_open_limitup(cls, code, block, yesterday_limit_up_codes):
+        """
+        鏄惁闇�瑕佹縺杩涗拱(鏌愪釜鏉垮潡寮�1)
+        1.鏈�>=2涓紑1涔拌��2
+        2.鏈�1涓紑1鐨勪拱鑰�3
+        @param code:
+        @param block:
+        @param yesterday_limit_up_codes 鏄ㄦ棩娑ㄥ仠浠g爜
+        @return:
+        """
+        # 10鐐逛箣鍓嶆墠鑳戒拱鍏�
+        if int(tool.get_now_time_str().replace(":", "")) > 100000:
+            return False, "瓒呰繃鐢熸晥鏃堕棿"
+
+        # 鏍规嵁鏉垮潡鑱氬悎鏁版嵁
+        open_limit_up_block_codes = {}
+        for c in kpl_data_constant.open_limit_up_code_dict_for_radical_buy:
+            blocks = kpl_data_constant.open_limit_up_code_dict_for_radical_buy[c][1]
+            for b in blocks:
+                if b not in open_limit_up_block_codes:
+                    open_limit_up_block_codes[b] = set()
+                open_limit_up_block_codes[b].add(c)
+        if block not in open_limit_up_block_codes:
+            return False, "鏉垮潡鏈紑1"
+
+        count = len(open_limit_up_block_codes.get(block))
+        # ----鑾峰彇鍘嗗彶韬綅----
+        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)
+        if count >= 2:
+            # 涔拌��2
+            if history_index == 0 and current_index == 0:
+                return True, f"寮�1鏁伴噺锛歿count}"
+            else:
+                return False, f"寮�1鏁伴噺锛歿count}锛岃韩浣嶄笉鍖归厤锛氬巻鍙�-{history_index} 瀹炴椂-{current_index}"
+        else:
+            # 涔拌��3
+            if history_index == 1 and current_index == 1:
+                return True, f"寮�1鏁伴噺锛歿count}"
+            else:
+                return False, f"寮�1鏁伴噺锛歿count}锛岃韩浣嶄笉鍖归厤锛氬巻鍙�-{history_index} 瀹炴椂-{current_index}"
+
+    @classmethod
+    def __is_radical_buy_with_block_up(cls, code, block, yesterday_limit_up_codes):
+        """
+        鏄惁婵�杩涗拱锛堟澘鍧楃獊鐒舵定璧锋潵锛�
+        鑰佸ぇ鍜岃�佷簩鐨勬定鍋滄椂闂寸浉宸�5鍒嗛挓鍐�
+        鑰佷笁鐨勬定鍋滄椂闂磋窛绂昏�佸ぇ娑ㄥ仠鍦�10鍒嗛挓鍐呭氨涔�
+        @param code:
+        @param block:
+        @param yesterday_limit_up_codes:
+        @return:
+        """
+        # 鑾峰彇褰撳墠鐨勬澘鍧�
+        current_index, current_before_codes_info = cls.__get_current_index(code, block, set())
+        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爜鏈夌偢鏉�"
+        if len(current_before_codes_info) < 2:
+            return False, f"鍓嶆帓浠g爜灏忎簬2涓�"
+        # 鑰佸ぇ锛岃�佷簩蹇呴』鐩搁殧5鍒嗛挓鍐�
+        if current_before_codes_info[0][1] >= kpl_block_util.open_limit_up_time_range[1]:
+            return False, f"鏈夊紑1"
+
+        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, "鍓嶆帓娑ㄥ仠鏃堕棿闂撮殧涓嶆弧瓒虫潯浠�"
+
+    @classmethod
+    def is_radical_buy(cls, code, yesterday_limit_up_codes):
         """
         鏄惁鏄縺杩涗拱
         @param code:
-        @return:
+        @return: {婵�杩涗拱鐨勬澘鍧梷, 鍘熷洜
         """
-        # 鑾峰彇浠婃棩寮�涓�鐨勪唬鐮�,鍓旈櫎5鏉夸互涓婄殑
-        current_limit_up_datas = kpl_data_constant.current_limit_up_datas
         # 璁$畻
-
+        # 鑾峰彇寮�1鐨勬澘鍧�
+        open_limit_up_code_dict = kpl_data_constant.open_limit_up_code_dict_for_radical_buy
+        if not open_limit_up_code_dict:
+            return False, "娌℃湁棣栨澘寮�1鐨勬暟鎹�"
+        open_limit_up_blocks = set()
+        for c in open_limit_up_code_dict:
+            open_limit_up_blocks |= open_limit_up_code_dict[c][1]
         # 鑾峰彇浠g爜鐨勬澘鍧�
         keys_, k1_, k11_, k2_, k3_, k4_ = cls.__TargetCodePlateKeyManager.get_plate_keys(code, contains_today=False)
-        # 鑾峰彇
+        match_blocks = open_limit_up_blocks & keys_
+        if not match_blocks:
+            return False, "娌″尮閰嶅埌寮�1鐨勬澘鍧�"
+        can_buy_blocks = set()
+        msges = []
+        for b in match_blocks:
+            # 鍒ゆ柇鏉垮潡鏄惁璇ユ縺杩涗拱
+            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}")
+        if can_buy_blocks:
+            return can_buy_blocks, "寮�1婊¤冻鏉′欢锛�" + "锛�".join(msges)
+        if not can_buy_blocks:
+            msges.clear()
+            for b in match_blocks:
+                # 鏉垮潡蹇�熷惎鍔�
+                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}")
+        return can_buy_blocks, "寮�1涓嶆弧瓒虫潯浠讹紝鏉垮潡蹇�熷惎鍔細" + "锛�".join(msges)
 
 
 if __name__ == "__main__":

--
Gitblit v1.8.0