From 7eb1a8ed1a007d80de41d131071ee38f5872700c Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期五, 07 二月 2025 14:26:37 +0800
Subject: [PATCH] 辨识度票策略修改/恢复P撤/上传订阅涨幅

---
 trade/buy_radical/radical_buy_data_manager.py    |    6 +
 third_data/kpl_limit_up_data_manager.py          |    7 +
 l2/l2_transaction_data_processor.py              |    2 
 utils/middle_api_protocol.py                     |    5 +
 trade/trade_constant.py                          |    3 +
 servers/huaxin_trade_server.py                   |   40 ++-----------
 l2/code_price_manager.py                         |   36 +++++++++++
 trade/buy_radical/block_special_codes_manager.py |   53 ++++++++++++++++-
 l2/l2_data_manager_new.py                        |   12 ++--
 9 files changed, 114 insertions(+), 50 deletions(-)

diff --git a/l2/code_price_manager.py b/l2/code_price_manager.py
index 0f00fbe..df76595 100644
--- a/l2/code_price_manager.py
+++ b/l2/code_price_manager.py
@@ -2,8 +2,12 @@
 浠g爜浠锋牸绠$悊
 """
 import json
+import threading
+import time
+
+from code_attribute.gpcode_manager import CodePrePriceManager
 from db.redis_manager_delegate import RedisUtils
-from utils import tool
+from utils import tool, middle_api_protocol
 from db import redis_manager_delegate as redis_manager
 from log_module.log import logger_trade_queue_price_info
 
@@ -73,7 +77,6 @@
                                          (limit_up_time, open_limit_up_time))
         RedisUtils.setex_async(self.__db, f"buy1_price_limit_up_info-{code}", tool.get_expire(),
                                json.dumps((limit_up_time, open_limit_up_time)))
-
 
     def __get_buy1_price_limit_up_info_cache(self, code):
         cache_result = tool.CodeDataCacheUtil.get_cache(self.__buy1_price_limit_up_info_cache, code)
@@ -200,5 +203,34 @@
         return self.__latest_3m_buy1_money_list_dict.get(code)
 
 
+class CurrentPriceManager:
+    """
+    鐜颁环绠$悊
+    """
+    # 浠g爜娑ㄥ箙鏁版嵁
+    __current_rate_dict = {}
+    # 鏈�杩戜笂浼犳椂闂�
+    __latest_upload_time = 0
+
+    @classmethod
+    def set_current_price(cls, code, price):
+        """
+        璁剧疆鐜颁环
+        @param code:
+        @param price:
+        @return:
+        """
+        pre_close_price = CodePrePriceManager.get_price_pre_cache(code)
+        if pre_close_price:
+            rate = round((price - pre_close_price) * 100 / pre_close_price, 2)
+            cls.__current_rate_dict[code] = rate
+        # 鍒ゆ柇鏄惁瑕佷笂浼�
+        if time.time() - cls.__latest_upload_time >= 3:
+            # 闂撮殧3s涓婁紶
+            cls.__latest_upload_time = time.time()
+            threading.Thread(target=lambda: middle_api_protocol.request(
+                middle_api_protocol.load_l2_subscript_codes_rate(cls.__current_rate_dict)), daemon=True).start()
+
+
 if __name__ == "__main__":
     print(Buy1PriceManager().get_limit_up_info("002777"))
diff --git a/l2/l2_data_manager_new.py b/l2/l2_data_manager_new.py
index 594b9a4..15c035a 100644
--- a/l2/l2_data_manager_new.py
+++ b/l2/l2_data_manager_new.py
@@ -816,11 +816,11 @@
             average_rate = cls.__Buy1PriceManager.get_average_rate(code)
             if average_rate :
                 if tool.is_ge_code(code):
-                    if average_rate <= 0.07:
-                        return False, True, f"鍧囦环娑ㄥ箙({average_rate})灏忎簬7%", True
+                    if average_rate <= 0.1:
+                        return False, True, f"鍧囦环娑ㄥ箙({average_rate})灏忎簬10%", True
                 else:
-                    if average_rate <= 0.03:
-                        return False, True, f"鍧囦环娑ㄥ箙({average_rate})灏忎簬3%", True
+                    if average_rate <= 0.05:
+                        return False, True, f"鍧囦环娑ㄥ箙({average_rate})灏忎簬5%", True
         return True, False, f"", False
 
     @classmethod
@@ -1307,13 +1307,13 @@
             # 鏄惁鏄氦鏄撻槦鍒楄Е鍙�
             # 鎵叆涓嬪崟鍙湁L鎾よ兘鎾ゅ崟
             if order_begin_pos and order_begin_pos.mode == OrderBeginPosInfo.MODE_RADICAL and cancel_type not in {
-                trade_constant.CANCEL_TYPE_L_DOWN, trade_constant.CANCEL_TYPE_L, trade_constant.CANCEL_TYPE_RD}:
+                trade_constant.CANCEL_TYPE_L_DOWN, trade_constant.CANCEL_TYPE_L, trade_constant.CANCEL_TYPE_RD, trade_constant.CANCEL_TYPE_P}:
                 l2_log.cancel_debug(code, "鎾ゅ崟涓柇锛屽師鍥狅細{}", "鎵叆涓嬪崟涓嶆槸L鎾�")
                 return False
             # 鍔犵豢鍙湁L鎾�/浜烘挙鐢熸晥
             if gpcode_manager.GreenListCodeManager().is_in_cache(code):
                 if cancel_type not in {trade_constant.CANCEL_TYPE_L, trade_constant.CANCEL_TYPE_L_UP,
-                                       trade_constant.CANCEL_TYPE_L_DOWN, trade_constant.CANCEL_TYPE_RD}:
+                                       trade_constant.CANCEL_TYPE_L_DOWN, trade_constant.CANCEL_TYPE_RD, trade_constant.CANCEL_TYPE_P}:
                     l2_log.cancel_debug(code, "鎾ゅ崟涓柇锛屽師鍥狅細{}", "鍔犵豢涓嶆槸L鎾�")
                     return False
 
diff --git a/l2/l2_transaction_data_processor.py b/l2/l2_transaction_data_processor.py
index 3bb47fb..fd6f162 100644
--- a/l2/l2_transaction_data_processor.py
+++ b/l2/l2_transaction_data_processor.py
@@ -163,7 +163,7 @@
                     if not need_cancel:
                         need_cancel, cancel_msg = FCancelBigNumComputer().need_cancel_for_p(code,
                                                                                             order_begin_pos)
-                        cancel_type = trade_constant.CANCEL_TYPE_F
+                        cancel_type = trade_constant.CANCEL_TYPE_P
                     # 鍒ゆ柇鏃堕棿鏄惁涓庢湰鍦版椂闂寸浉宸�5s浠ヤ笂
                     if tool.trade_time_sub(tool.get_now_time_str(), l2_huaxin_util.convert_time(datas[-1][3])) > 10:
                         now_seconds = int(tool.get_now_time_str().replace(":", ""))
diff --git a/servers/huaxin_trade_server.py b/servers/huaxin_trade_server.py
index 60a844e..373af9c 100644
--- a/servers/huaxin_trade_server.py
+++ b/servers/huaxin_trade_server.py
@@ -392,41 +392,15 @@
 
     @classmethod
     def l2_market_data(cls, code, data):
-
-        def update_kpl_jx_block(code_, buy_1_price_, limit_up_price_):
-            # ----------------------------------鏉垮潡鐩稿叧------------------------------
-            try:
-                if code_ in cls.__updating_jx_blocks_codes:
-                    return
-                cls.__updating_jx_blocks_codes.add(code_)
-                cls.__KPLCodeJXBlockManager.load_jx_blocks(code_, buy_1_price_, limit_up_price_,
-                                                           kpl_data_manager.KPLLimitUpDataRecordManager.get_current_reasons())
-                # 鏇存柊鏉垮潡淇℃伅
-                latest_current_limit_up_records = kpl_data_manager.get_latest_current_limit_up_records()
-
-                codes_delegate = set(CodesTradeStateManager().get_codes_by_trade_states_cache(
-                    {trade_constant.TRADE_STATE_BUY_DELEGATED, trade_constant.TRADE_STATE_BUY_PLACE_ORDER}))
-                codes_success = set(CodesTradeStateManager().get_codes_by_trade_states_cache(
-                    {trade_constant.TRADE_STATE_BUY_SUCCESS}))
-
-                CodePlateKeyBuyManager.update_can_buy_blocks(code_,
-                                                             kpl_data_manager.KPLLimitUpDataRecordManager.latest_origin_datas,
-                                                             kpl_data_manager.KPLLimitUpDataRecordManager.total_datas,
-                                                             latest_current_limit_up_records,
-                                                             block_info.get_before_blocks_dict(),
-                                                             kpl_data_manager.KPLLimitUpDataRecordManager.get_current_limit_up_reason_codes_dict(),
-                                                             codes_delegate, codes_success)
-            finally:
-                cls.__updating_jx_blocks_codes.discard(code_)
-
         time_str = f"{data['dataTimeStamp']}"
-        if time_str.startswith("9"):
-            time_str = "0" + time_str
-        time_str = time_str[:6]
-        time_str = f"{time_str[0:2]}:{time_str[2:4]}:{time_str[4:6]}"
+        time_str = l2_huaxin_util.convert_time(time_str)
         buy_1_price, buy_1_volume = data["buy"][0]
         sell_1_price, sell_1_volume = data["sell"][0]
         limit_up_price = gpcode_manager.get_limit_up_price_as_num(code)
+        # 娑ㄥ箙
+        price = data['lastPrice']
+
+        code_price_manager.CurrentPriceManager.set_current_price(code, price)
 
         code_price_manager.Buy1PriceManager().set_latest_buy1_money(code, buy_1_price, buy_1_volume)
 
@@ -443,11 +417,11 @@
         except Exception as e:
             logger_debug.exception(e)
 
-        if limit_up_price is not None:
+        pre_close_price = CodePrePriceManager.get_price_pre_cache(code)
+        if pre_close_price is not None:
             average_rate = None
             try:
                 average_price = data["totalValueTrade"] / data["totalVolumeTrade"]
-                pre_close_price = CodePrePriceManager.get_price_pre_cache(code)
                 average_rate = round((average_price - pre_close_price) / pre_close_price, 4)
             except:
                 pass
diff --git a/third_data/kpl_limit_up_data_manager.py b/third_data/kpl_limit_up_data_manager.py
index d106874..fef51f5 100644
--- a/third_data/kpl_limit_up_data_manager.py
+++ b/third_data/kpl_limit_up_data_manager.py
@@ -330,5 +330,8 @@
 
 
 if __name__ == "__main__":
-    datas = LatestLimitUpBlockManager().statistics_limit_up_block_infos()
-    print(datas)
\ No newline at end of file
+    # datas = LatestLimitUpBlockManager().statistics_limit_up_block_infos()
+    # print(datas)
+    code = "600126"
+    blocks = LimitUpCodesBlockRecordManager().get_radical_buy_blocks(code)
+    print(blocks)
\ No newline at end of file
diff --git a/trade/buy_radical/block_special_codes_manager.py b/trade/buy_radical/block_special_codes_manager.py
index e413b7a..4b930ed 100644
--- a/trade/buy_radical/block_special_codes_manager.py
+++ b/trade/buy_radical/block_special_codes_manager.py
@@ -59,6 +59,11 @@
             f"SELECT r.`_hot_block_name`, r.`_code`, COUNT(*) FROM kpl_limit_up_record  r WHERE r.`_day`>'{min_day}' and r.`_day`<'{max_day}' and r._code not like '68%' group by  r.`_hot_block_name`, r.`_code`")
         return results
 
+    def __list_code_blocks(self, min_day, max_day):
+        results = self.__mysql.select_all(
+            f"SELECT r.`_hot_block_name`, r.`_code`, r.`_day` FROM kpl_limit_up_record  r WHERE r.`_day`>'{min_day}' and r.`_day`<'{max_day}' and r._code not like '68%'")
+        return results
+
     def __get_limit_up_info(self, min_day):
         sql = f"SELECT r.`_code`, COUNT(r.`_code`),r.`_code_name`,IF( r.`_zylt_val` is null, 1, r.`_zylt_val`/100000000 )  FROM (SELECT * FROM kpl_limit_up_record  r ORDER BY r.`_create_time` DESC)  r WHERE r.`_day`>'{min_day}' GROUP BY r.`_code`"
         results = self.__mysql.select_all(sql)
@@ -122,13 +127,46 @@
         鑾峰彇鏉垮潡鏈夎鲸璇嗗害鐨勪唬鐮�
         @return:
         """
-        trading_dates = HistoryKDatasUtils.get_latest_trading_date(8)
-        max_day = trading_dates[-1]
+        trading_dates = HistoryKDatasUtils.get_latest_trading_date(9)
+        max_day = trading_dates[0]
         min_day = tool.date_sub(max_day, 180)
 
         block_map = self.__get_block_map()
-        # [(鏉垮潡鍚嶇О,浠g爜, 鍦ㄦ澘鍧椾腑鐨勬定鍋滄鏁�)]
-        code_block_infos = self.__get_code_blocks(min_day, max_day)
+        # 缁熻鏈�杩�180澶╂定鍋滄暟鎹�
+        # [(鏉垮潡鍚嶇О,浠g爜, 鏃ユ湡)]
+        code_block_infos = self.__list_code_blocks(min_day, max_day)
+
+        # 缁熻鏈�杩�8澶╃殑娑ㄥ仠鏁版嵁
+        min_day = trading_dates[-1]
+        code_block_infos_8 = self.__get_code_blocks(min_day, max_day)
+        # 缁熻娑ㄥ仠娆℃暟澶т簬3娆$殑娑ㄥ仠浠g爜
+        # 鏍煎紡锛歿"浠g爜":娑ㄥ仠娆℃暟}
+        count_dict = {}
+        filter_codes = set()
+        for d in code_block_infos_8:
+            if d[1] not in count_dict:
+                count_dict[d[1]] = 0
+            count_dict[d[1]] += d[2]
+            if count_dict[d[1]] > 3:
+                filter_codes.add(d[1])
+        count_dict.clear()
+        code_block_infos_8.clear()
+
+        # 鍒犻櫎鏁版嵁
+        temp_data_dict = {}
+        for d in code_block_infos:
+            if d[1] in filter_codes and int(d[2].replace("-", "")) > int(min_day.replace("-", "")):
+                # 闇�瑕佽繃婊や笖鏈�杩�8澶╂定鍋�
+                continue
+            block, code = d[0], d[1]
+            k = f"{block}#{code}"
+            if k not in temp_data_dict:
+                temp_data_dict[k] = [block, code, 0]
+            temp_data_dict[k][2] += 1
+        code_block_infos = [temp_data_dict[k] for k in temp_data_dict]
+
+        min_day = tool.date_sub(max_day, 180)
+
         code_block_dict = {}  # {"浠g爜":{"鏉垮潡": 娑ㄥ仠娆℃暟}}
         for b in code_block_infos:
             if b[1] not in code_block_dict:
@@ -139,7 +177,11 @@
             for bb in bs:
                 if bb not in code_block_dict[b[1]]:
                     code_block_dict[b[1]][bb] = 0
-                code_block_dict[b[1]][bb] += b[2]
+                if tool.is_ge_code(b[1]):
+                    # 鍒涗笟鏉�1娆℃定鍋滅畻2娆℃定鍋�
+                    code_block_dict[b[1]][bb] += b[2] * 2
+                else:
+                    code_block_dict[b[1]][bb] += b[2]
         block_codes_dict = {}  # {"鏉垮潡":[锛堜唬鐮�,娑ㄥ仠娆℃暟锛塢}
         for code in code_block_dict:
             for b in code_block_dict[code]:
@@ -214,4 +256,5 @@
 if __name__ == "__main__":
     # print(datas)
     datas = AnalysisBlockSpecialCodesManager().get_block_special_codes()
+    print(datas)
     # print(BlockSpecialCodesManager().get_code_blocks("002582"))
diff --git a/trade/buy_radical/radical_buy_data_manager.py b/trade/buy_radical/radical_buy_data_manager.py
index a384de8..e32d16b 100644
--- a/trade/buy_radical/radical_buy_data_manager.py
+++ b/trade/buy_radical/radical_buy_data_manager.py
@@ -295,7 +295,11 @@
             return
         money_list = [x[0] for x in fmoney_list]
         money_list = money_list[:2]
-        # 璁$畻澶у崟: 鍓�2涓ぇ鍗曠殑鍧囧��
+        # 璁$畻澶у崟: 鍓�2涓ぇ鍗�+涓囨墜鐨勫潎鍊�
+        # if tool.is_ge_code(code):
+        #     money_list.append(gpcode_manager.get_limit_up_price_as_num(code) * 300000)
+        # else:
+        #     money_list.append(gpcode_manager.get_limit_up_price_as_num(code) * 1000000)
         self.__temp_big_order_threshold[code] = (
             int(sum(money_list) // len(money_list)), time.time() + 10, len(money_list) < 2)
         async_log_util.info(logger_l2_radical_buy_data,
diff --git a/trade/trade_constant.py b/trade/trade_constant.py
index 3ad9173..3a3c25b 100644
--- a/trade/trade_constant.py
+++ b/trade/trade_constant.py
@@ -51,3 +51,6 @@
 
 # RD鎾�
 CANCEL_TYPE_RD = 12
+
+# P鎾�
+CANCEL_TYPE_P = 13
diff --git a/utils/middle_api_protocol.py b/utils/middle_api_protocol.py
index e42f4dc..2888577 100644
--- a/utils/middle_api_protocol.py
+++ b/utils/middle_api_protocol.py
@@ -70,6 +70,11 @@
     fdata = {"type": "l2_subscript_codes", "data": {"ctype": "l2_subscript_codes", "data": datas}}
     return fdata
 
+# ------------------------------L2璁㈤槄浠g爜鐨勫疄鏃舵定骞�------------------------------------
+def load_l2_subscript_codes_rate(datas):
+    fdata = {"type": "l2_subscript_codes_rate", "data": {"ctype": "l2_subscript_codes_rate", "data": datas}}
+    return fdata
+
 
 # ------------------------------娑堟伅鎺ㄩ��------------------------------------
 def load_push_msg(data):

--
Gitblit v1.8.0