From d9b94154c523e631ac6fa38bce9836f12ac9581e Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期四, 06 三月 2025 16:45:27 +0800
Subject: [PATCH] 总抛压大的扫入策略调整

---
 l2/l2_data_manager_new.py |  102 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 99 insertions(+), 3 deletions(-)

diff --git a/l2/l2_data_manager_new.py b/l2/l2_data_manager_new.py
index 9efbcae..47918a4 100644
--- a/l2/l2_data_manager_new.py
+++ b/l2/l2_data_manager_new.py
@@ -28,7 +28,7 @@
 from trade import trade_manager, trade_queue_manager, l2_trade_factor, l2_trade_util, \
     trade_result_manager, current_price_process_manager, trade_data_manager, trade_huaxin, trade_record_log_util, \
     trade_constant, buy_open_limit_up_strategy
-from trade.buy_radical import radical_buy_data_manager
+from trade.buy_radical import radical_buy_data_manager, radical_buy_strategy
 from l2 import l2_data_manager, l2_log, l2_data_source_util, code_price_manager, \
     transaction_progress, cancel_buy_strategy, place_order_single_data_manager
 from l2.cancel_buy_strategy import DCancelBigNumComputer, \
@@ -883,7 +883,7 @@
         params_desc = cls.__l2PlaceOrderParamsManagerDict[code].get_buy_rank_desc()
         l2_log.debug(code, params_desc)
         #################娓呴櫎鏈涓嬪崟鐨勫ぇ鍗曟暟鎹�###############
-        EveryLimitupBigDealOrderManager.clear(code,"涓嬪崟鎴愬姛")
+        EveryLimitupBigDealOrderManager.clear(code, "涓嬪崟鎴愬姛")
         ############璁板綍涓嬪崟鏃剁殑鏁版嵁############
         try:
             jx_blocks, jx_blocks_by = KPLCodeJXBlockManager().get_jx_blocks_cache(
@@ -1443,6 +1443,7 @@
 
         # ---------璁$畻婵�杩涗拱鍏ョ殑淇″彿---------
         radical_result = cls.__compute_radical_order_begin_pos(code, compute_start_index, compute_end_index)
+
         if radical_result[0]:
             buy_single_index, buy_exec_index = radical_result[1], radical_result[1]
             buy_volume_rate = cls.volume_rate_info[code][0]
@@ -1472,7 +1473,35 @@
                 # 鐩戝惉澶у崟
                 RDCancelBigNumComputer().set_watch_indexes(code, radical_result[4])
             return
+        else:
+            radical_result = cls.__compute_radical_order_begin_pos_for_many_sell(code, start_index, end_index)
+            if radical_result[0]:
+                buy_single_index, buy_exec_index = radical_result[0][0], radical_result[0][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"][
+                                                                                    "time"])
+                if refer_sell_data:
+                    sell_info = (refer_sell_data[0], refer_sell_data[1])
+                else:
+                    sell_info = (total_datas[buy_single_index]["val"]["time"], 0)
+                threshold_money = 0
 
+                order_begin_pos_info = OrderBeginPosInfo(buy_single_index=buy_single_index,
+                                                         buy_exec_index=buy_exec_index,
+                                                         buy_compute_index=buy_exec_index,
+                                                         num=total_datas[buy_single_index]["val"]["num"], count=1,
+                                                         max_num_set=set(),
+                                                         buy_volume_rate=buy_volume_rate,
+                                                         mode=OrderBeginPosInfo.MODE_RADICAL,
+                                                         mode_desc=f"鎬绘姏鍘嬪ぇ鎵叆:{radical_result[2]}",
+                                                         sell_info=sell_info,
+                                                         threshold_money=threshold_money)
+                order_begin_pos_info.at_limit_up = cls.__is_at_limit_up_buy(code)
+                ordered = cls.__process_with_find_exec_index(code, order_begin_pos_info, compute_end_index,
+                                                             block_info=radical_result[2])
+                if ordered:
+                    radical_buy_data_manager.BlockPlaceOrderRecordManager().add_record(code, radical_result[2])
         if RadicalBuyDealCodesManager().get_code_blocks(code):
             # 宸茬粡鎵叆涓嬭繃鍗�
             return
@@ -1909,7 +1938,9 @@
                                                                                              code_volumn_manager.CodeVolumeManager().get_volume_rate_refer_in_5days(
                                                                                                  code),
                                                                                              refer_sell_money,
-                                                                                             for_buy=True, is_almost_open_limit_up=radical_data[5])
+                                                                                             for_buy=True,
+                                                                                             is_almost_open_limit_up=
+                                                                                             radical_data[5])
             # 缂轰箯鐨勫ぇ鍗曢噾棰�
             lack_money = big_order_deal_enough_result[3]
             # 濡傛灉鏈夊ぇ鍗曟垚浜ゅ氨涓嶉渶瑕佺湅澶у崟
@@ -2022,6 +2053,71 @@
             async_log_util.info(logger_l2_not_buy_reasons, f"{code}#{result[2]}")
         return result
 
+    # 鎬诲崠棰濆弬鑰冩椂闂翠娇鐢ㄨ褰�
+    __refer_sell_used_times = {}
+
+    @classmethod
+    def __compute_radical_order_begin_pos_for_many_sell(cls, code, start_index, end_index):
+        """
+        璁$畻娣辫瘉楂樻姏鍘嬬殑鍗栫殑涔板叆淇″彿
+        @param code:
+        @param start_index:
+        @param end_index:
+        @return: 淇″彿淇℃伅锛堜俊鍙蜂綅,鎵ц浣嶏級, 娑堟伅, 鍙拱鍏ョ殑鏉垮潡
+        """
+        if not tool.is_sz_code(code):
+            return None, "闈炴繁璇佺殑绁�", None
+        # 鍒ゆ柇鎶涘帇鏄惁澶т簬5000w
+        total_datas = local_today_datas.get(code)
+        refer_sell_data = cls.__L2MarketSellManager.get_refer_sell_data(code, total_datas[-1]["val"]["time"])
+        if not refer_sell_data or refer_sell_data[1] < 5e7:
+            return None, "鎬诲崠棰濆皬浜�5000涓�", None
+        if code in cls.__refer_sell_used_times and refer_sell_data[0] in cls.__refer_sell_used_times:
+            return None, f"鏃堕棿宸茬粡琚娇鐢細{refer_sell_data[0]}", None
+
+        deal_codes = RadicalBuyDealCodesManager().get_deal_codes()
+        if code in deal_codes:
+            return None, f"宸茬粡鎴愪氦", None
+
+        f_buy_blocks, orgin_buy_blocks = radical_buy_strategy.compute_can_radical_buy_blocks(code, deal_codes)
+        if not f_buy_blocks:
+            return None, f"鏉垮潡涓嶅彲涔板叆", None
+
+        # 鍒ゆ柇鏄惁鏈夋定鍋滀拱鐨勬暟鎹�
+        has_limit_up = False
+        for i in range(start_index, end_index + 1):
+            data = total_datas[i]
+            val = data["val"]
+            if L2DataUtil.is_limit_up_price_buy(val):
+                has_limit_up = True
+                break
+        if not has_limit_up:
+            return None, "鏃犳定鍋滀拱鏁版嵁", None
+        # 鏌ユ壘璁℃暟璧风偣
+        refer_sell_time_int = int(refer_sell_data[0].replace(":", ""))
+        begin_index = start_index
+        for i in range(start_index - 1, -1, -1):
+            data = total_datas[i]
+            val = data["val"]
+            if int(val["time"].replace(":", "")) < refer_sell_time_int:
+                begin_index = i + 1
+                break
+        threshold_num = int(round(refer_sell_data[1] / gpcode_manager.get_limit_up_price_as_num(code) / 100))
+        total_num = 0
+        for i in range(begin_index, end_index + 1):
+            data = total_datas[i]
+            val = data["val"]
+            if L2DataUtil.is_limit_up_price_buy(val):
+                total_num += val["num"]
+            elif L2DataUtil.is_limit_up_price_buy_cancel(val):
+                total_num -= val["num"]
+        if total_num > threshold_num:
+            if code not in cls.__refer_sell_used_times:
+                cls.__refer_sell_used_times[code] = set()
+            cls.__refer_sell_used_times[code].add(refer_sell_data[0])
+            return (begin_index, end_index), "鍙互涓嬪崟", f_buy_blocks
+        return None, "鎬讳拱棰濅笉婊¤冻", None
+
     @classmethod
     def test__compute_active_order_begin_pos(cls, code, continue_count, start_index, end_index):
         return cls.__compute_active_order_begin_pos(code, continue_count, start_index, end_index)

--
Gitblit v1.8.0