From 8382cbe98cab50d8bbea9d43779e1c632548fe04 Mon Sep 17 00:00:00 2001
From: admin <admin@example.com>
Date: 星期二, 17 六月 2025 13:39:32 +0800
Subject: [PATCH] 禁止买入板块管理/增加外部接口

---
 data_server.py                       |   21 ++++++++++
 constant.py                          |    5 ++
 strategy/forbidden_plates_manager.py |   63 +++++++++++++++++++++++++++++++
 strategy/buying_strategy.py          |   29 +++++++++++++-
 4 files changed, 116 insertions(+), 2 deletions(-)

diff --git a/constant.py b/constant.py
index a9abd7a..45a5f73 100644
--- a/constant.py
+++ b/constant.py
@@ -84,3 +84,8 @@
 
 # 鏄惁鏄豢鐪熶氦鏄�
 IS_SIMULATED_TRADE = False
+
+check_plate_list = {'鏃�', 'ST鎽樺附', 'ST鏉垮潡', '瓒呰穼', '娆℃柊鑲�', '鍖椾氦鎵�', '绉戝垱鏉�',
+                                    '骞存姤澧為暱', '骞存姤棰勫', '骞惰喘閲嶇粍', '鑲℃潈杞', '閫佽浆濉潈', '楂橀�佽浆', '澹宠祫婧�',
+                                    '璧勪骇绠$悊', '涓剧墝',
+                                    '涓撶敤璁惧', '鍒涙姇'}
diff --git a/data_server.py b/data_server.py
index 361bcee..13d7b51 100644
--- a/data_server.py
+++ b/data_server.py
@@ -17,6 +17,7 @@
 from log_module import log_export, async_log_util
 from log_module.log import hx_logger_l2_transaction, logger_debug, logger_request_api, logger_system
 from strategy import data_cache
+from strategy.forbidden_plates_manager import ForbiddenPlatesManager
 from strategy.kpl_data_manager import KPLMarketsSiftPlateLogManager, KPLMarketStockHeatLogManager
 from strategy.trade_setting import TradeSetting
 from trade import huaxin_trade_api, huaxin_trade_data_update
@@ -234,6 +235,26 @@
                 # (璺濈09:15:00鐨勭鏁�, 鏃堕棿, 寮哄害)
                 fdatas.append((tool.trade_time_sub(data[0], "09:15:00"), data[0], data[1]))
             response_data = json.dumps({"code": 0, "data": fdatas})
+        elif url.path == "/get_place_order_records":
+            datas = data_cache.purchased_stocks_details_list
+            response_data = json.dumps({"code": 0, "data": datas})
+        elif url.path == "/get_forbidden_plates":
+            datas = ForbiddenPlatesManager().list_plates()
+            # human 璁や负璁剧疆  fixed: 鍥哄畾鐨�
+            response_data = json.dumps(
+                {"code": 0, "data": {"human": list(datas), "fixed": list(constant.check_plate_list)}})
+        elif url.path == "/add_forbidden_plate":
+            plate = params_dict.get("plate")
+            ForbiddenPlatesManager().add_plate(plate)
+            response_data = json.dumps({"code": 0, "data": {}})
+        elif url.path == "/remove_forbidden_plate":
+            plate = params_dict.get("plate")
+            ForbiddenPlatesManager().remove_plate(plate)
+            response_data = json.dumps({"code": 0, "data": {}})
+        elif url.path == "/get_market_sift_plate_stock_dict":
+            # 鑾峰彇寮�鐩樺暒鏉垮潡绮鹃�夋祦鍏�
+            data = data_cache.market_sift_plate_stock_dict
+            response_data = json.dumps({"code": 0, "data": data})
 
         self.send_response(200)
         # 鍙戠粰璇锋眰瀹㈡埛绔殑鍝嶅簲鏁版嵁
diff --git a/strategy/buying_strategy.py b/strategy/buying_strategy.py
index 991e972..bc6be39 100644
--- a/strategy/buying_strategy.py
+++ b/strategy/buying_strategy.py
@@ -429,6 +429,7 @@
                                             data_cache.bought_plate.extend(limit_up_plate_included_list)
                                             logger_info(
                                                 f"銆恵k_line_data[0]['sec_name']}銆戜氦鏄撴垚鍔燂紒鎸佷粨闆嗗悎锛歿data_cache.position_symbols_set}")
+                                            # 浼犵粰GUI鏄剧ず
                                             purchased_stock_details = {
                                                 "name": k_line_data[0]['sec_name'],
                                                 "policy_name": "鏈夋蹇垫湁寮哄害绛栫暐鍒嗘敮",
@@ -548,11 +549,23 @@
                                                 data_cache.bought_plate.extend(limit_up_plate_included_list)
                                                 logger_info(
                                                     f"銆恵k_line_data[0]['sec_name']}銆戜氦鏄撴垚鍔燂紒鎸佷粨闆嗗悎锛歿data_cache.position_symbols_set}")
+                                                # 浼犵粰GUI鏄剧ず
+                                                purchased_stock_details = {
+                                                    "name": k_line_data[0]['sec_name'],
+                                                    "policy_name": "鏈夋蹇垫棤寮哄害绛栫暐鍒嗘敮",
+                                                    "plate_name": limit_up_plate_included,
+                                                    "buy_time_trading_volume_ratio": (
+                                                                current_volume / k_line_data[0]['volume']),
+                                                }
+                                                data_cache.purchased_stocks_details_list.append(purchased_stock_details)
+                                                logger_info(
+                                                    f"宸叉垚浜よ偂绁ㄨ鎯呭垪琛細{data_cache.purchased_stocks_details_list} ")
                                 '''
                                 鏃犳蹇� 鏈夊己搴﹁鐣�
                                 '''
-                                if len(limit_up_plate_included) == 0:
-                                    # logger_info(f"銆愭棤姒傚康銆�")
+                                if len(limit_up_plate_included) == 0 or limit_up_plate_included.issubset(
+                                        check_plate_list) is True:
+                                    # logger_info(f"銆愭棤姒傚康 鎴� 姒傚康鍦ㄥ睆钄芥蹇电粍涓��")
                                     if strength_list_have_it is True:
                                         logger_info(
                                             f"銆恵k_line_data[0]['sec_name']}銆�--------------------------------------------------------------------------------------------------------[鏈夊己搴﹁鐣宂")
@@ -661,6 +674,18 @@
                                                     data_cache.bought_plate.extend(strength_plate)
                                                     logger_info(
                                                         f"銆恵k_line_data[0]['sec_name']}銆戜氦鏄撴垚鍔燂紒鎸佷粨闆嗗悎锛歿data_cache.position_symbols_set}")
+                                                    # 浼犵粰GUI鏄剧ず
+                                                    purchased_stock_details = {
+                                                        "name": k_line_data[0]['sec_name'],
+                                                        "policy_name": "鏃犳蹇垫湁寮哄害绛栫暐鍒嗘敮",
+                                                        "plate_name": strength_plate,
+                                                        "buy_time_trading_volume_ratio": (
+                                                                current_volume / k_line_data[0]['volume']),
+                                                    }
+                                                    data_cache.purchased_stocks_details_list.append(
+                                                        purchased_stock_details)
+                                                    logger_info(
+                                                        f"宸叉垚浜よ偂绁ㄨ鎯呭垪琛細{data_cache.purchased_stocks_details_list} ")
                                 '''
                                 鏃犳蹇垫棤寮哄害 鏈夊皬閲忔崲澶ф定骞呭害瑙嗙晫
                                 '''
diff --git a/strategy/forbidden_plates_manager.py b/strategy/forbidden_plates_manager.py
new file mode 100644
index 0000000..920ee96
--- /dev/null
+++ b/strategy/forbidden_plates_manager.py
@@ -0,0 +1,63 @@
+"""
+榛戝悕鍗曟澘鍧楃鐞�
+"""
+from db import redis_manager_delegate as redis_manager
+from db.redis_manager_delegate import RedisUtils
+from utils import tool
+
+
+@tool.singleton
+class ForbiddenPlatesManager:
+    def __init__(self):
+        self.forbidden_plates = set()
+        self.__db = 1
+        self.__redisManager = redis_manager.RedisManager(self.__db)
+        self.__load_forbidden_plates()
+
+    def __load_forbidden_plates(self):
+        plates = RedisUtils.smembers(self.__redisManager.getRedis(), "forbidden_plates")
+        if plates:
+            self.forbidden_plates = set(plates)
+
+    def add_plate(self, plate):
+        """
+        娣诲姞鏉垮潡
+        :param plate:
+        :return:
+        """
+        if plate in self.forbidden_plates:
+            return
+        self.forbidden_plates.add(plate)
+        RedisUtils.sadd_async(self.__db, "forbidden_plates", plate)
+        RedisUtils.expire_async(self.__db, "forbidden_plates", tool.get_expire())
+
+    def remove_plate(self, plate):
+        """
+        绉婚櫎鏉垮潡
+        :param plate:
+        :return:
+        """
+        if plate not in self.forbidden_plates:
+            return
+        self.forbidden_plates.remove(plate)
+        RedisUtils.srem_async(self.__db, "forbidden_plates", plate)
+        RedisUtils.expire_async(self.__db, "forbidden_plates", tool.get_expire())
+
+    def list_plates(self):
+        """
+        鍒楀嚭鎵�鏈夋澘鍧�
+        :return:
+        """
+        return self.forbidden_plates
+
+    def is_plate_forbidden(self, plate):
+        """
+        鍒ゆ柇鏉垮潡鏄惁琚姝�
+        :param plate:
+        :return:
+        """
+        return plate in self.forbidden_plates
+
+
+if __name__ == '__main__':
+    print(ForbiddenPlatesManager().list_plates())

--
Gitblit v1.8.0