From 326e0b138c00fe14ab860441b2e05f8c3c37576f Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期日, 25 五月 2025 12:01:56 +0800
Subject: [PATCH] 大单足够下单方式改变

---
 l2/l2_data_manager_new.py |  147 +++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 143 insertions(+), 4 deletions(-)

diff --git a/l2/l2_data_manager_new.py b/l2/l2_data_manager_new.py
index b1f6617..b943351 100644
--- a/l2/l2_data_manager_new.py
+++ b/l2/l2_data_manager_new.py
@@ -219,6 +219,67 @@
         #                                      round(t.time() * 1000) - start_time))
 
 
+class HumanRadicalBuySingleManager:
+    """
+    浜轰负涔板叆绠$悊
+    """
+    # 浜轰负涓嬪崟鏍囪:{"浠g爜":(淇″彿鏃堕棿, 闂撮殧鏃堕棿,淇″彿鎴嚦鏃堕棿, radical_result)}
+    __human_radical_buy_mark_info = {}
+
+    @classmethod
+    def add_single(cls, code, latest_data, radical_result):
+        """
+        娣诲姞涔板叆淇″彿
+        @param code:
+        @param latest_data:
+        @param radical_result:
+        @return:
+        """
+        start_time_with_ms = L2DataUtil.get_time_with_ms(latest_data["val"])
+        if tool.is_sh_code(code):
+            cls.__human_radical_buy_mark_info[code] = (
+                start_time_with_ms, 400, tool.trade_time_add_millionsecond(start_time_with_ms, 3000), radical_result)
+        else:
+            cls.__human_radical_buy_mark_info[code] = (
+                start_time_with_ms, 30, tool.trade_time_add_millionsecond(start_time_with_ms, 2000), radical_result)
+
+    @classmethod
+    def remove_single(cls, code):
+        """
+        绉婚櫎淇″彿
+        @param code:
+        @return:
+        """
+        if code in cls.__human_radical_buy_mark_info:
+            cls.__human_radical_buy_mark_info.pop(code)
+
+    @classmethod
+    def has_single(cls, code):
+        """
+        鏄惁鏈変俊鍙�
+        @param code:
+        @return:
+        """
+        if code in cls.__human_radical_buy_mark_info:
+            return True
+
+    @classmethod
+    def is_valid(cls, code, data):
+        """
+        淇″彿鏄惁鏈夋晥
+        @param code:
+        @return: 鏄惁鏈夋晥锛屾棤鏁堟秷鎭�/鏈夋晥瀵硅薄
+        """
+        if code not in cls.__human_radical_buy_mark_info:
+            return False, "娌℃湁浜轰拱鍏ヤ俊鍙�"
+        single_time_ms, space_time_ms, expire_time_ms, _ = cls.__human_radical_buy_mark_info[code]
+        if tool.trade_time_sub_with_ms(L2DataUtil.get_time_with_ms(data["val"]),
+                                       expire_time_ms) > 0:
+            cls.__human_radical_buy_mark_info.pop(code)
+            return False, "瓒呰繃淇″彿鐢熸晥鏃堕棿"
+        return True, cls.__human_radical_buy_mark_info[code]
+
+
 class L2TradeDataProcessor:
     unreal_buy_dict = {}
     volume_rate_info = {}
@@ -1458,10 +1519,32 @@
         _start_time = tool.get_now_timestamp()
         total_datas = local_today_datas[code]
 
-        # ---------璁$畻婵�杩涗拱鍏ョ殑淇″彿---------
-        radical_result = cls.__compute_radical_order_begin_pos(code, compute_start_index, compute_end_index)
+        if not HumanRadicalBuySingleManager.has_single(code):
+            # ---------璁$畻婵�杩涗拱鍏ョ殑淇″彿---------
+            radical_result = cls.__compute_radical_order_begin_pos(code, compute_start_index, compute_end_index)
+        else:
+            human_radical_result = cls.__compute_human_radical_order_begin_pos(code, compute_start_index,
+                                                                               compute_end_index)
+            if human_radical_result[0]:
+                radical_result = list(human_radical_result[2])
+                # 鏀瑰彉鎵ц浣嶇疆
+                radical_result[1] = human_radical_result[1]["index"]
+            else:
+                radical_result = None
+        if radical_result and radical_result[0]:
 
-        if radical_result[0]:
+            if not HumanRadicalBuySingleManager.has_single(code):
+                big_order_deal_enough_result = radical_buy_data_manager.is_big_order_deal_enough(code,
+                                                                                                 code_volumn_manager.CodeVolumeManager().get_volume_rate_refer_in_5days(
+                                                                                                     code), 0)
+                if big_order_deal_enough_result[6] <= 0:
+                    HumanRadicalBuySingleManager.add_single(code, total_datas[-1], radical_result)
+                    async_log_util.info(logger_l2_not_buy_reasons, f"{code}#澶у崟瓒冲锛岄渶瑕佹牴鎹汉涓轰笅鍗�")
+                    return
+            # 涓嬪崟鍓嶄竴姝ワ紝绉婚櫎浜轰负涓嬪崟淇″彿
+            is_human_radical_buy = HumanRadicalBuySingleManager.has_single(code)
+            HumanRadicalBuySingleManager.remove_single(code)
+
             buy_single_index, buy_exec_index = radical_result[1], radical_result[1]
             buy_volume_rate = cls.volume_rate_info[code][0]
             refer_sell_data = cls.__L2MarketSellManager.get_refer_sell_data(code, total_datas[buy_single_index]["val"][
@@ -1479,7 +1562,7 @@
                                                      max_num_set=set(),
                                                      buy_volume_rate=buy_volume_rate,
                                                      mode=OrderBeginPosInfo.MODE_RADICAL,
-                                                     mode_desc=f"澶у崟涓嶈冻鎵叆:{radical_result[2]}",
+                                                     mode_desc=f"澶у崟涓嶈冻鎵叆:{radical_result[2]} 鏄惁璺熶汉涔板叆-{is_human_radical_buy}",
                                                      sell_info=sell_info,
                                                      threshold_money=threshold_money)
             order_begin_pos_info.at_limit_up = cls.__is_at_limit_up_buy(code)
@@ -2089,6 +2172,62 @@
             async_log_util.info(logger_l2_not_buy_reasons, f"{code}#{result[2]}")
         return result
 
+    @classmethod
+    def __compute_human_radical_order_begin_pos(cls, code, start_index, end_index):
+        """
+        澶勭悊璺熶汉涔�
+        @param code:
+        @param start_index:
+        @param end_index:
+        @return:
+        """
+        total_datas = local_today_datas.get(code)
+        result = HumanRadicalBuySingleManager.is_valid(code, total_datas[start_index])
+        if not result[0]:
+            return False, None, result[1]
+        result = result[1]
+        single_time_ms, space_time_ms, expire_time_ms, radical_result = result[0], result[1], result[2], result[3]
+
+        bigger_num = l2_data_util.get_big_money_val(gpcode_manager.get_limit_up_price_as_num(code),
+                                                    tool.is_ge_code(code)) // (
+                             gpcode_manager.get_limit_up_price_as_num(code) * 100)
+        canceled_buyno_map = local_today_buyno_map.get(code)
+        for i in range(start_index, end_index + 1):
+            data = total_datas[i]
+            val = data["val"]
+            if not L2DataUtil.is_limit_up_price_buy(val):
+                continue
+            if val["num"] < bigger_num:
+                continue
+
+            left_count = l2_data_source_util.L2DataSourceUtils.get_limit_up_buy_no_canceled_count_v2(code, i,
+                                                                                                     total_datas,
+                                                                                                     canceled_buyno_map)
+            if left_count == 0:
+                continue
+
+            # 鍒ゆ柇鏄惁瓒呰繃鐢熸晥鏃堕棿
+            if tool.trade_time_sub_with_ms(L2DataUtil.get_time_with_ms(total_datas[i]["val"]),
+                                           expire_time_ms) > 0:
+                HumanRadicalBuySingleManager.remove_single(code)
+                return False, None, "瓒呰繃淇″彿鐢熸晥鏃堕棿"
+            is_valid = False
+            # 鍒ゆ柇璺濈涓婁釜50w涔板崟鐨勬椂闂存槸鍚﹁秴杩囦簡space_time_ms
+            for ii in range(i - 1, -1, -1):
+                data_child = total_datas[ii]
+                val_child = data_child["val"]
+                if not L2DataUtil.is_limit_up_price_buy(val_child):
+                    continue
+                if val_child["num"] * float(val_child["price"]) < 5000:
+                    continue
+                if tool.trade_time_sub_with_ms(L2DataUtil.get_time_with_ms(val),
+                                               L2DataUtil.get_time_with_ms(val_child)) > space_time_ms:
+                    is_valid = True
+                    break
+            if is_valid:
+                return True, data, radical_result
+        return False, None, "娌℃湁鏈夋晥淇″彿"
+
     # 鎬诲崠棰濆弬鑰冩椂闂翠娇鐢ㄨ褰�
     __refer_sell_used_times = {}
 

--
Gitblit v1.8.0