From 245979e3907d34bcd88ac0c4547f399bf33a44de Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期三, 18 六月 2025 18:13:30 +0800
Subject: [PATCH] bug修复/策略完善

---
 strategy/data_analyzer.py |   72 +++++++++++++++++++++++++++++++++---
 1 files changed, 66 insertions(+), 6 deletions(-)

diff --git a/strategy/data_analyzer.py b/strategy/data_analyzer.py
index 882999f..cfdc57d 100644
--- a/strategy/data_analyzer.py
+++ b/strategy/data_analyzer.py
@@ -281,7 +281,7 @@
         @return:
         """
         return abs(close - cls.calculate_upper_limit_price(code,
-                                                        pre_close)) < 0.01
+                                                           pre_close)) < 0.01
 
     @classmethod
     def get_third_limit_up_days(cls, k_data, days):
@@ -298,11 +298,18 @@
             if i + 3 >= len(k_data):
                 continue
             # 鍒ゆ柇杩炵画涓夋棩娑ㄥ仠涓旂鍥涙棩闈炴定鍋�
-            if cls.__is_limit_up(k_data[i]["sec_id"], k_data[i]['close'], k_data[i]["pre_close"]):
-                if cls.__is_limit_up(k_data[i+1]["sec_id"], k_data[i+1]['close'], k_data[i+1]["pre_close"]):
-                    if cls.__is_limit_up(k_data[i+2]["sec_id"], k_data[i+2]['close'], k_data[i+2]["pre_close"]):
-                        if not cls.__is_limit_up(k_data[i+3]["sec_id"], k_data[i+3]['close'], k_data[i+3]["pre_close"]):
-                            count += 1
+            day_count = 3
+            for n in range(day_count + 1):
+                if n < day_count:
+                    if not cls.__is_limit_up(k_data[i + n]["sec_id"], k_data[i + n]['close'],
+                                             k_data[i + n]["pre_close"]):
+                        # 闈炴定鍋�
+                        break
+                else:
+                    if not cls.__is_limit_up(k_data[i + n]["sec_id"], k_data[i + n]['close'],
+                                             k_data[i + n]["pre_close"]):
+                        count += 1
+                        break
         return count
 
     @classmethod
@@ -414,6 +421,59 @@
                 count += 1
         return count
 
+    @classmethod
+    def is_too_high_and_not_relase_volume(cls, k_data):
+        """
+        闀垮緱澶珮涓旀病鏀鹃噺锛�30涓氦鏄撴棩鍐咃紝鍑虹幇杩囨渶浣庝环锛堟渶楂樹环涔嬪墠鐨勪氦鏄撴棩锛夊埌鏈�楂樹环涔嬮棿鐨勬定骞呪墺35%鐨勭エ锛屼笖浠婃棩璺濈鏈�楂樹环閭f棩鏃犳定鍋�/鏃犵偢鏉夸笖>=3鏉夸笖蹇呴』鏈�2杩炴澘
+        @param k_data: K绾挎暟鎹垪琛�(杩�150涓氦鏄撴棩锛屼笉鍖呭惈褰撳墠浜ゆ槗鏃ワ紝鏃堕棿鍊掑簭)
+        @return: 鍥涜穼鍋滃強浠ヤ笂澶╂暟
+        """
+        k_data = k_data[:30]
+        code = k_data[0]["sec_id"]
+        # 鑾峰彇鏈�楂樹环淇℃伅
+        max_high_price_data = max(k_data, key=lambda x: x["high"])
+        before_datas = [d for d in k_data if d['bob'] < max_high_price_data['bob']]
+        after_datas = [d for d in k_data if d['bob'] >= max_high_price_data['bob']]
+        if not before_datas:
+            return False
+        if len(before_datas) > 15:
+            # 浠庢渶楂樹环鏃ユ湡鍚戝墠鏈�澶氱湅15涓氦鏄撴棩
+            before_datas = before_datas[:15]
+        min_close_price_data = min(before_datas, key=lambda x: x["close"])
+        if (max_high_price_data['high'] - min_close_price_data['close']) / min_close_price_data['close'] < 0.35:
+            # 娑ㄥ箙灏忎簬35%
+            return False
+        before_k_datas = [d for d in k_data if min_close_price_data['bob'] <= d['bob'] <= max_high_price_data['bob']]
+        before_k_datas.sort(key=lambda x: x['bob'])
+
+        # [鏈�浣庝环-鏈�楂樹环]鏃ユ湡鍐呮湁3涓澘涓旀湁涓よ繛鎵�
+
+        continue_2_limit_up_date = None
+        for i in range(len(before_k_datas) - 1):
+            if cls.__is_limit_up(code, before_k_datas[i]["close"],
+                                 before_k_datas[i]["pre_close"]) and cls.__is_limit_up(code,
+                                                                                       before_k_datas[i + 1]["close"],
+                                                                                       before_k_datas[i + 1][
+                                                                                           "pre_close"]):
+                continue_2_limit_up_date = before_k_datas[i + 1]['bob'][:10]
+                break
+        if not continue_2_limit_up_date:
+            # 鏃犱袱杩炴澘
+            return False
+        # 涓よ繛鏉夸箣鍚庢槸鍚︽湁鐐告澘/娑ㄥ仠
+        # 鍙�2杩炴澘涔嬪悗鐨�3涓氦鏄撴棩
+        temp_k_datas = [d for d in before_k_datas if d['bob'][:10] > continue_2_limit_up_date][:3]
+        if len([d for d in temp_k_datas if cls.__is_limit_up(code, d["high"], d["pre_close"])]) < 1:
+            # 涓よ繛鏉夸箣鍚庢湁涓定鍋�/鐐告澘涓旀椂闂村湪2杩炴澘涔嬪悗鐨�3涓氦鏄撴棩鍐�
+            return False
+
+        k_data = [d for d in k_data if d['bob'] > max_high_price_data['bob']]
+        # 鍒ゆ柇鏄惁娑ㄥ仠杩�
+        if len([d for d in k_data if cls.__is_limit_up(code, d["high"], d["pre_close"])]) > 0 or len(after_datas) >= 10:
+            # 鏈�楂樹环涔嬪悗鏈夎繃娑ㄥ仠鎴栬�呮槸鏈�楂樹环鍚�10涓氦鏄撴棩
+            return False
+        return True, f"楂樹环鏃ユ湡锛歿max_high_price_data['bob'][:10]}锛屼綆浠锋棩鏈燂細{min_close_price_data['bob'][:10]}锛屼袱杩炴壋鏃ユ湡锛歿continue_2_limit_up_date}"
+
 
 class K60SLineAnalyzer:
     """

--
Gitblit v1.8.0