From e6cbb6c96b6576da5eaf089cfa3dd6098cc6baf9 Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期二, 27 五月 2025 15:40:30 +0800
Subject: [PATCH] 人为修改大单阈值

---
 trade/buy_radical/radical_buy_data_manager.py |   52 ++++++++++++++++
 api/outside_api_command_callback.py           |   21 +++++-
 data_parser/transaction_big_order_parser.py   |   70 ++++++++++++++++++----
 3 files changed, 123 insertions(+), 20 deletions(-)

diff --git a/api/outside_api_command_callback.py b/api/outside_api_command_callback.py
index 27088d6..5eaa25a 100644
--- a/api/outside_api_command_callback.py
+++ b/api/outside_api_command_callback.py
@@ -54,7 +54,8 @@
 from trade.huaxin import huaxin_trade_api, huaxin_trade_data_update, \
     huaxin_trade_record_manager, huaxin_trade_order_processor, huaxin_sell_util
 from trade.huaxin.huaxin_trade_record_manager import PositionManager, DealRecordManager, DelegateRecordManager
-from trade.buy_radical.radical_buy_data_manager import RadicalBuyBlockManager, BeforeSubDealBigOrderManager
+from trade.buy_radical.radical_buy_data_manager import RadicalBuyBlockManager, BeforeSubDealBigOrderManager, \
+    TotalDealBigOrderThresholdMoneyManager
 from trade.sell import sell_manager
 from trade.sell.sell_rule_manager import TradeRuleManager, SellRule
 from trade.trade_data_manager import RadicalBuyDealCodesManager
@@ -1319,7 +1320,9 @@
                     if volumes_data:
                         is_new_top = code_nature_analyse.is_new_top(code,
                                                                     gpcode_manager.get_limit_up_price_by_preprice(code,
-                                                                                                                  volumes_data[0]["close"]),
+                                                                                                                  volumes_data[
+                                                                                                                      0][
+                                                                                                                      "close"]),
                                                                     volumes_data)
 
                 data = {
@@ -1476,8 +1479,18 @@
                                    client_id,
                                    request_id)
 
-
-
+            elif ctype == "set_total_deal_big_order_threshold_money":
+                code = data.get("code")
+                money = data.get("money")
+                if not code or not money:
+                    self.send_response({"code": 1, "data": {}, "msg": "code/money涓虹┖"},
+                                       client_id,
+                                       request_id)
+                    return
+                TotalDealBigOrderThresholdMoneyManager().set_money(code, int(money))
+                self.send_response({"code": 0, "data": {}},
+                                   client_id,
+                                   request_id)
         except Exception as e:
             logging.exception(e)
             logger_debug.exception(e)
diff --git a/data_parser/transaction_big_order_parser.py b/data_parser/transaction_big_order_parser.py
index e986684..42aa437 100644
--- a/data_parser/transaction_big_order_parser.py
+++ b/data_parser/transaction_big_order_parser.py
@@ -194,9 +194,60 @@
     ))
 
 
-def extract_big_order_of_code(dir_path, code):
+def extract_big_order_of_code(dir_path, code=None):
     """
     鎻愬彇浠g爜鐨勫ぇ鍗�
+    @param dir_path: 鏁版嵁鐩綍
+    @param code: 涓虹┖琛ㄧず瀵煎嚭鍏ㄩ儴
+    @return:
+    """
+
+    def first_last(group):
+        """
+            鑾峰彇绗竴鏉℃暟鎹笌鏈�鍚庝竴鏉�
+            @param group:
+            @return:
+            """
+        return pd.Series({
+            'SecurityID': group['SecurityID'].iloc[0],
+            'BuyNo': group['BuyNo'].iloc[0],
+            'TotalVolume': group['TotalVolume'].sum(),
+            'TotalAmount': group['TotalAmount'].sum(),
+            'EndTime': group['EndTime'].iloc[-1],
+            'EndPrice': group['EndPrice'].iloc[-1],
+            'StartTime': group['StartTime'].iloc[0],
+            'StartPrice': group['StartPrice'].iloc[0]
+        })
+
+    combined_path = os.path.join(dir_path, 'combined.csv')
+    if not os.path.exists(combined_path):
+        print("鎷兼帴鏁版嵁涓嶅瓨鍦�")
+        return
+    df = pd.read_csv(combined_path)
+    df_copy = df.copy()
+    if code:
+        df_copy = df_copy[df_copy["SecurityID"] == int(code)]
+    if df_copy.empty:
+        print("鐩爣浠g爜瀵瑰簲鎴愪氦鏁版嵁涓虹┖")
+        return
+    df_copy["SecurityID"] = df_copy["SecurityID"].apply(BigOrderDealParser.code_format)
+    # 鎸塖ecurityID鍜孊uyNo鍒嗙粍
+    grouped = df_copy.groupby(['SecurityID', 'BuyNo'])
+    grouped_result = grouped.apply(first_last)
+    grouped_result = grouped_result[grouped_result["TotalAmount"] > 500000]
+    # print(grouped_result)
+    # 閬嶅巻鍐呭
+    if code:
+        grouped_result.to_csv(os.path.join(dir_path, f"big_buy_{code}.csv"), index=False)
+    else:
+        grouped_result.to_csv(os.path.join(dir_path, f"big_buy.csv"), index=False)
+    print("淇濆瓨鎴愬姛")
+
+
+def extract_big_order_codes(dir_path):
+    """
+    瀵煎嚭澶у崟浠g爜
+    @param dir_path: 鏁版嵁鐩綍
     @param code:
     @return:
     """
@@ -208,12 +259,6 @@
             @return:
             """
         return pd.Series({
-            'TotalAmount': group['TotalAmount'].sum(),
-            'TotalVolume': group['TotalVolume'].sum(),
-            'StartTime': group['StartTime'].iloc[0],
-            'StartPrice': group['StartPrice'].iloc[0],
-            'EndTime': group['EndTime'].iloc[-1],
-            'EndPrice': group['EndPrice'].iloc[-1]
         })
 
     combined_path = os.path.join(dir_path, 'combined.csv')
@@ -222,21 +267,18 @@
         return
     df = pd.read_csv(combined_path)
     df_copy = df.copy()
-    df_copy = df_copy[df_copy["SecurityID"] == int(code)]
     if df_copy.empty:
         print("鐩爣浠g爜瀵瑰簲鎴愪氦鏁版嵁涓虹┖")
         return
     df_copy["SecurityID"] = df_copy["SecurityID"].apply(BigOrderDealParser.code_format)
     # 鎸塖ecurityID鍜孊uyNo鍒嗙粍
-    grouped = df_copy.groupby(['SecurityID', 'BuyNo'])
-    grouped_result = grouped.apply(first_last)
-    grouped_result = grouped_result[grouped_result["TotalAmount"] > 500000]
-    grouped_result.to_csv(os.path.join(dir_path, f"{code}.csv"))
-    print("淇濆瓨鎴愬姛")
+    grouped = df_copy.groupby(['SecurityID'])
+    return set(grouped.groups.keys())
 
 
 if __name__ == "__main__":
     # pre_process_transactions("E:/娴嬭瘯鏁版嵁/Transaction_Test.csv")
     # pre_process_ngtsticks("E:/娴嬭瘯鏁版嵁/NGTSTick_Test.csv")
     # concat_pre_transactions("E:/娴嬭瘯鏁版嵁/Transaction_Test")
-    extract_big_order_of_code("E:/娴嬭瘯鏁版嵁/Transaction_Test", "000017")
+    # extract_big_order_codes("E:/娴嬭瘯鏁版嵁/Transaction_Test")
+    extract_big_order_of_code("E:/娴嬭瘯鏁版嵁/Transaction_Test")
diff --git a/trade/buy_radical/radical_buy_data_manager.py b/trade/buy_radical/radical_buy_data_manager.py
index e8a73e0..aab4f22 100644
--- a/trade/buy_radical/radical_buy_data_manager.py
+++ b/trade/buy_radical/radical_buy_data_manager.py
@@ -314,6 +314,45 @@
 
 
 @tool.singleton
+class TotalDealBigOrderThresholdMoneyManager:
+    """
+    绱鎴愪氦澶у崟闃堝�肩鐞嗭紙浜轰负璁剧疆锛�
+    """
+    __db = 3
+    __total_big_order_threshold = {}
+
+    def __init__(self):
+        self.__load_data()
+
+    def __load_data(self):
+        keys = redis_manager.RedisUtils.keys(self.__get_redis(), "total_radical_big_order_threshold-*")
+        for k in keys:
+            code = k.split("-")[1]
+            val = redis_manager.RedisUtils.get(self.__get_redis(), k)
+            val = int(val)
+            self.__total_big_order_threshold[code] = val
+
+    def set_money(self, code, money):
+        """
+        璁剧疆閲戦
+        @param code:
+        @param money:
+        @return:
+        """
+        self.__total_big_order_threshold[code] = money
+        redis_manager.RedisUtils.setex_async(self.__db, f"total_radical_big_order_threshold-{code}", tool.get_expire(),
+                                             money)
+
+    def get_money_cache(self, code):
+        """
+        鑾峰彇缂撳瓨
+        @param code:
+        @return:
+        """
+        return self.__total_big_order_threshold.get(code)
+
+
+@tool.singleton
 class RadicalCodeMarketInfoManager:
     """
     婵�杩涗拱鐨勭エ琛屾儏鏁版嵁绠$悊
@@ -617,7 +656,12 @@
                         code)
                     if deal_money >= 2 * THRESHOLD_MONEY:
                         gpcode_manager.WhiteListCodeManager().add_code(code)
-                        trade_record_log_util.add_common_msg(code, "鍔犵櫧",  f"{code}澶у崟鎴愪氦瓒冲鍔犵櫧锛� 鏈壒娆℃垚浜ら噾棰�-{deal_money}/{THRESHOLD_MONEY * 2}  绱澶у崟閲戦锛歿total_deal_big_order_result[1]}/{total_deal_big_order_result[2]}")
+                        trade_record_log_util.add_common_msg(code, "鍔犵櫧",
+                                                             f"{code}澶у崟鎴愪氦瓒冲鍔犵櫧锛� 鏈壒娆℃垚浜ら噾棰�-{deal_money}/{THRESHOLD_MONEY * 2}  绱澶у崟閲戦锛歿total_deal_big_order_result[1]}/{total_deal_big_order_result[2]}")
+                    else:
+                        async_log_util.info(logger_debug,
+                                            f"{code}-鎴愪氦澶у崟灏�({deal_money}/{2 * THRESHOLD_MONEY}锛屾渶灏忚鍗曞彿-{order_begin_pos.min_order_no})锛屼笉鑳藉姞鐧�")
+
         except Exception as e:
             logger_debug.exception(e)
             async_log_util.info(logger_debug, f"澶勭悊鎴愪氦澶у崟瓒冲鍔犵櫧鐨勯棶棰�:{str(e)}")
@@ -1729,7 +1773,11 @@
     if tool.is_ge_code(code):
         TOTAL_BIG_DEAL_MONEY_THRESHOLD_COUNT *= 3.3
 
-    TOTAL_BIG_DEAL_MONEY_THRESHOLD_MONEY = TOTAL_BIG_DEAL_MONEY_THRESHOLD_COUNT * THRESHOLD_MONEY
+    human_setting_money = TotalDealBigOrderThresholdMoneyManager().get_money_cache(code)
+    if human_setting_money is not None:
+        TOTAL_BIG_DEAL_MONEY_THRESHOLD_MONEY = int(human_setting_money)
+    else:
+        TOTAL_BIG_DEAL_MONEY_THRESHOLD_MONEY = TOTAL_BIG_DEAL_MONEY_THRESHOLD_COUNT * THRESHOLD_MONEY
 
     # if is_for_buy and is_temp_threshold_money:
     #     # 棣栨涓婃澘涔板叆锛屽ぇ鍗曢槇鍊兼墦3鎶�

--
Gitblit v1.8.0