From e9680308bd91bb112c29f03a1316a0fc49e1917a Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期一, 09 九月 2024 14:58:35 +0800
Subject: [PATCH] 一个板块扫入之后不能再次扫入

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

diff --git a/l2/l2_data_manager_new.py b/l2/l2_data_manager_new.py
index c689068..6ec5472 100644
--- a/l2/l2_data_manager_new.py
+++ b/l2/l2_data_manager_new.py
@@ -691,29 +691,29 @@
     @classmethod
     def get_active_buy_blocks(cls, code):
         """
-        鑾峰彇婵�杩涗拱鍏ョ殑鏉垮潡
+        鑾峰彇绉瀬涔板叆鐨勬澘鍧�
         @param code:
         @return:
         """
         if tool.is_sh_code(code):
-            # 涓婅瘉涓嶆縺杩涗笅鍗�
+            # 涓婅瘉涓嶇Н鏋佷笅鍗�
             return None
 
         current_total_sell_data = L2MarketSellManager().get_current_total_sell_data(code)
         place_order_count = trade_data_manager.PlaceOrderCountManager().get_place_order_count(code)
-        # 鍙湁鍒濇涓嬪崟 + 鎬绘姏鍘嬪ぇ浜�500w鑳芥縺杩涗笅鍗�
+        # 鍙湁鍒濇涓嬪崟 + 鎬绘姏鍘嬪ぇ浜�500w鑳界Н鏋佷笅鍗�
         if place_order_count > 0 or current_total_sell_data is None or current_total_sell_data[1] < 500 * 10000:
             return None
 
         if global_util.zyltgb_map.get(code) > 50 * 100000000:
-            # 50浜夸互涓婄殑鏃犳硶婵�杩涗笅鍗�
+            # 50浜夸互涓婄殑鏃犳硶绉瀬涓嬪崟
             return None
         can_buy_result = CodePlateKeyBuyManager.can_buy(code)
         if can_buy_result:
             if can_buy_result[5]:
                 return can_buy_result[5]
             elif not can_buy_result[0] and can_buy_result[1]:
-                # 10:00:00 鍓嶇殑鐙嫍鍙縺杩涗拱鍏�
+                # 10:00:00 鍓嶇殑鐙嫍鍙Н鏋佷拱鍏�
                 if tool.trade_time_sub(tool.get_now_time_str(), "10:00:00") <= 0:
                     return ["鐙嫍"]
         return None
@@ -735,7 +735,7 @@
                 code)
 
             if order_begin_pos.MODE_RADICAL == order_begin_pos.mode:
-                # 婵�杩涗笅鍗曚笉鍒ゆ柇鏉′欢
+                # 绉瀬涓嬪崟涓嶅垽鏂潯浠�
                 can, need_clear_data, reason, is_valid_exec_index = True, False, "婵�杩涗笅鍗�", True
             else:
                 can, need_clear_data, reason, is_valid_exec_index = cls.__can_buy_first(code)
@@ -804,7 +804,7 @@
                                 temps = []
                                 temps.extend([f"{x[0]}" for x in can_buy_result[0]])
                                 if can_buy_result[5]:
-                                    temps.append(f"婵�杩涗拱鍏ワ細{can_buy_result[5]}")
+                                    temps.append(f"绉瀬涔板叆锛歿can_buy_result[5]}")
                                 info.set_kpl_match_blocks(temps)
                         trade_record_log_util.add_place_order_log(code, info)
                     except Exception as e:
@@ -856,8 +856,17 @@
         return True, ""
 
     @classmethod
-    def __is_on_limit_up_buy(cls, code, buy_exec_index):
+    def __is_at_limit_up_buy(cls, code, buy_exec_index=None):
+        """
+        鏄惁鏄澘涓婃斁閲忎拱
+        @param code:
+        @param buy_exec_index:
+        @return:
+        """
         total_data = local_today_datas.get(code)
+        if buy_exec_index is None:
+            # 鎵ц浣嶇疆涓虹┖锛屽氨鍙栨渶杩戠殑涓�鏉℃暟鎹�
+            buy_exec_index = total_data[-1]["index"]
         latest_exec_indexes = cls.__latest_exec_indexes[code]
         if not latest_exec_indexes:
             latest_exec_indexes = []
@@ -984,7 +993,7 @@
             # 1.褰撳墠鎴愪氦浠蜂负娑ㄥ仠浠�
             # 2.璺濈鏈�杩戠殑闈炴澘涓婃垚浜ょ殑鏃堕棿澶т簬涓�涓槇鍊�
             if abs(limit_up_price - float(trade_price)) < 0.001:
-                is_limit_up_buy = cls.__is_on_limit_up_buy(code, order_begin_pos.buy_exec_index)
+                is_limit_up_buy = cls.__is_at_limit_up_buy(code, order_begin_pos.buy_exec_index)
                 if is_limit_up_buy:
                     # 鏉夸笂涔颁笖闈炲姞缁�
                     # 鑾峰彇鏈�杩戠殑闈炴定鍋滀环鎴愪氦鏃堕棿
@@ -1360,21 +1369,42 @@
         cls.unreal_buy_dict[code] = (buy_exec_index, capture_time)
         trade_result_manager.virtual_buy_success(code)
 
-    # 鏄惁鏄湪鏉夸笂涔�
     @classmethod
-    def __is_at_limit_up_buy(cls, code_):
-        # 鎬诲崠涓�0锛屽綋鍓嶆垚浜や环涓烘定鍋滀环灏卞垽鏂负鏉夸笂涔�
-        current_sell_data = cls.__L2MarketSellManager.get_current_total_sell_data(code_)
-        if current_sell_data and tool.trade_time_sub(tool.get_now_time_str(), current_sell_data[0]) < 5:
-            # 5s鍐呯殑鏁版嵁鎵嶆湁鏁�
-            if current_sell_data[1] <= 0:
-                # 鎬诲崠涓�0
-                trade_price = current_price_process_manager.get_trade_price(code_)
-                limit_up_price = gpcode_manager.get_limit_up_price(code_)
-                if trade_price and limit_up_price and abs(float(trade_price) - float(limit_up_price)) <= 0.001:
-                    # 褰撳墠鎴愪氦浠蜂负娑ㄥ仠浠�
-                    return True
-        return False
+    def __process_with_find_exec_index(cls, code, order_begin_pos: OrderBeginPosInfo, compute_end_index):
+        """
+        澶勭悊鎵惧埌鎵ц浣嶇疆
+        @return:
+        """
+        total_datas = local_today_datas.get(code)
+        l2_log.debug(code, "鑾峰彇鍒颁拱鍏ユ墽琛屼綅缃細{} m鍊硷細{} 绾拱鎵嬫暟锛歿} 绾拱鍗曟暟锛歿} 鏄惁鏉夸笂涔帮細{} 鏁版嵁锛歿} ,閲忔瘮:{} ,涓嬪崟妯″紡锛歿}",
+                     order_begin_pos.buy_exec_index,
+                     order_begin_pos.threshold_money,
+                     order_begin_pos.num,
+                     order_begin_pos.count, order_begin_pos.at_limit_up, total_datas[order_begin_pos.buy_exec_index],
+                     cls.volume_rate_info[code], order_begin_pos.mode)
+        cls.__save_order_begin_data(code, order_begin_pos)
+        cls.__LimitUpTimeManager.save_limit_up_time(code, total_datas[order_begin_pos.buy_exec_index]["val"]["time"])
+        l2_log.debug(code, "delete_buy_cancel_point")
+        if code not in cls.__latest_exec_indexes:
+            cls.__latest_exec_indexes[code] = []
+        cls.__latest_exec_indexes[code].append(order_begin_pos.buy_exec_index)
+        # 淇濈暀鏈�杩�3娆$殑涔板叆鎵ц浣嶇疆
+        if len(cls.__latest_exec_indexes[code]) > 3:
+            cls.__latest_exec_indexes[code] = cls.__latest_exec_indexes[code][-3:]
+
+        # 鐩存帴涓嬪崟
+        ordered = cls.__buy(code, 0, total_datas[-1], total_datas[-1]["index"], True)
+
+        # 鏁版嵁鏄惁澶勭悊瀹屾瘯
+        if order_begin_pos.buy_exec_index < compute_end_index:
+            if ordered:
+                cls.__process_order(code, order_begin_pos.buy_exec_index + 1, compute_end_index, 0, True,
+                                    False)
+            else:
+                cls.__start_compute_buy(code, order_begin_pos.buy_exec_index + 1, compute_end_index,
+                                        order_begin_pos.threshold_money,
+                                        0,
+                                        True, False)
 
     @classmethod
     def __start_compute_buy(cls, code, compute_start_index, compute_end_index, threshold_money, capture_time,
@@ -1408,18 +1438,44 @@
         _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 radical_result[0]:
+            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"][
+                "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="婵�杩涗拱鍏�",
+                                                     sell_info=sell_info,
+                                                     threshold_money=threshold_money)
+            order_begin_pos_info.at_limit_up = cls.__is_at_limit_up_buy(code)
+            cls.__process_with_find_exec_index(code, order_begin_pos_info, compute_end_index)
+            return
+
         # 鑾峰彇涔板叆淇″彿璁$畻璧峰浣嶇疆
-        order_begin_pos = cls.__get_order_begin_pos(
-            code)
+        order_begin_pos = cls.__get_order_begin_pos(code)
 
         # 鏄惁涓烘柊鑾峰彇鍒扮殑浣嶇疆
         new_get_single = False
         buy_single_index = order_begin_pos.buy_single_index
         if buy_single_index is None:
             # ------------------------------纭畾淇″彿绉嶇被----------------------------------
-            # 绗竴姝ワ細鑾峰彇婵�杩涗笅鍗曚俊鍙�
+            # 绗竴姝ワ細鑾峰彇绉瀬涓嬪崟淇″彿
             # if code.find('60') == 0:
-            # 婵�杩涗拱
+            # 绉瀬涔�
             continue_count = 1
             has_single, _index, sell_info, single_msg, mode = cls.__compute_active_order_begin_pos(code, continue_count,
                                                                                                    compute_start_index,
@@ -1475,12 +1531,6 @@
         if new_get_single:
             start_process_index = order_begin_pos.buy_single_index
 
-        # _start_time = l2_data_log.l2_time(code, tool.get_now_timestamp() - _start_time, "璁$畻m鍊煎ぇ鍗�")
-
-        # threshold_money, msg = cls.__get_threshmoney(code)
-
-        # _start_time = l2_data_log.l2_time(code, tool.get_now_timestamp() - _start_time, "m鍊奸槇鍊艰绠�")
-
         # 璁剧疆涓烘�诲崠棰�
         new_buy_exec_index, buy_nums, buy_count, rebegin_buy_pos, threshold_money_new, max_num_set_new, not_buy_msg, clear_buy_single = cls.__sum_buy_num_for_order_active(
             code,
@@ -1506,42 +1556,17 @@
             return
 
         if new_buy_exec_index is not None:
-            l2_log.debug(code, "鑾峰彇鍒颁拱鍏ユ墽琛屼綅缃細{} m鍊硷細{} 绾拱鎵嬫暟锛歿} 绾拱鍗曟暟锛歿} 鏄惁鏉夸笂涔帮細{} 鏁版嵁锛歿} ,閲忔瘮:{} ,涓嬪崟妯″紡锛歿}", new_buy_exec_index,
-                         threshold_money,
-                         buy_nums,
-                         buy_count, order_begin_pos.at_limit_up, total_datas[new_buy_exec_index],
-                         cls.volume_rate_info[code], order_begin_pos.mode)
-            cls.__save_order_begin_data(code, OrderBeginPosInfo(buy_single_index=buy_single_index,
-                                                                buy_exec_index=new_buy_exec_index,
-                                                                buy_compute_index=new_buy_exec_index,
-                                                                num=buy_nums, count=buy_count,
-                                                                max_num_set=max_num_set_new,
-                                                                buy_volume_rate=cls.volume_rate_info[code][0],
-                                                                mode=order_begin_pos.mode,
-                                                                mode_desc=order_begin_pos.mode_desc,
-                                                                sell_info=order_begin_pos.sell_info,
-                                                                threshold_money=threshold_money))
-            cls.__LimitUpTimeManager.save_limit_up_time(code, total_datas[new_buy_exec_index]["val"]["time"])
-            l2_log.debug(code, "delete_buy_cancel_point")
-            if code not in cls.__latest_exec_indexes:
-                cls.__latest_exec_indexes[code] = []
-            cls.__latest_exec_indexes[code].append(new_buy_exec_index)
-            # 淇濈暀鏈�杩�3娆$殑涔板叆鎵ц浣嶇疆
-            if len(cls.__latest_exec_indexes[code]) > 3:
-                cls.__latest_exec_indexes[code] = cls.__latest_exec_indexes[code][-3:]
-
-            # 鐩存帴涓嬪崟
-            ordered = cls.__buy(code, capture_time, total_datas[-1], total_datas[-1]["index"], is_first_code)
-
-            # 鏁版嵁鏄惁澶勭悊瀹屾瘯
-            if new_buy_exec_index < compute_end_index:
-                if ordered:
-                    cls.__process_order(code, new_buy_exec_index + 1, compute_end_index, capture_time, is_first_code,
-                                        False)
-                else:
-                    cls.__start_compute_buy(code, new_buy_exec_index + 1, compute_end_index, threshold_money,
-                                            capture_time,
-                                            is_first_code, False)
+            cls.__process_with_find_exec_index(code, OrderBeginPosInfo(buy_single_index=buy_single_index,
+                                                                       buy_exec_index=new_buy_exec_index,
+                                                                       buy_compute_index=new_buy_exec_index,
+                                                                       num=buy_nums, count=buy_count,
+                                                                       max_num_set=max_num_set_new,
+                                                                       buy_volume_rate=cls.volume_rate_info[code][0],
+                                                                       mode=order_begin_pos.mode,
+                                                                       mode_desc=order_begin_pos.mode_desc,
+                                                                       sell_info=order_begin_pos.sell_info,
+                                                                       threshold_money=threshold_money),
+                                               compute_end_index)
         else:
             # 鏈揪鍒颁笅鍗曟潯浠讹紝淇濆瓨绾拱棰濓紝璁剧疆绾拱棰�
             # 璁板綍涔板叆淇″彿浣嶇疆
@@ -1773,7 +1798,7 @@
 
                 return True, i, [refer_sell_data[0],
                                  0], '涓婅瘉涔板叆', OrderBeginPosInfo.MODE_ACTIVE if active_buy_blocks else OrderBeginPosInfo.MODE_FAST
-            return False, -1, "鏈幏鍙栧埌婵�杩涗拱鐨勮捣濮嬩俊鍙�", '', OrderBeginPosInfo.MODE_NORMAL
+            return False, -1, "鏈幏鍙栧埌绉瀬涔扮殑璧峰淇″彿", '', OrderBeginPosInfo.MODE_NORMAL
         else:
             # 娣辫瘉
             if refer_sell_data is None:
@@ -1796,7 +1821,7 @@
                 # 鍒ゆ柇鏈�杩戞湁娌℃湁娑ㄥ仠鍗栨暟鎹�
                 limit_up_sell_count = L2TradeSingleDataProcessor.get_latest_limit_up_sell_order_count(code)
                 if (limit_up_sell_count == 0 or active_buy_blocks) and not single:
-                    # 濡傛灉娌℃湁娑ㄥ仠鍗栨暟鎹�/婵�杩涗笅鍗曡�屼笖杩樻病鏈夋垚浜や拱鍏ヤ俊鍙凤紝灏辨寜鐓у師鏉ョ殑鎬诲崠棰濊绠�
+                    # 濡傛灉娌℃湁娑ㄥ仠鍗栨暟鎹�/绉瀬涓嬪崟鑰屼笖杩樻病鏈夋垚浜や拱鍏ヤ俊鍙凤紝灏辨寜鐓у師鏉ョ殑鎬诲崠棰濊绠�
                     threshold_money, sell_1_price = copy.deepcopy(refer_sell_data[1]), refer_sell_data[3][0]
                     for i in range(start_index - 1, -1, -1):
                         val = total_datas[i]["val"]
@@ -1832,7 +1857,7 @@
                     return True, buy_single_index, [refer_sell_data[0],
                                                     0], "鏉夸笂鏀鹃噺", OrderBeginPosInfo.MODE_ACTIVE if active_buy_blocks else OrderBeginPosInfo.MODE_NORMAL
 
-        return False, -1, "鏈幏鍙栧埌婵�杩涗拱鐨勮捣濮嬩俊鍙�", '', OrderBeginPosInfo.MODE_NORMAL
+        return False, -1, "鏈幏鍙栧埌绉瀬涔扮殑璧峰淇″彿", '', OrderBeginPosInfo.MODE_NORMAL
 
     # 璁$畻婵�杩涗拱鐨勪笅鍗曚俊鍙�
     @classmethod
@@ -1844,10 +1869,9 @@
         @param code:
         @param start_index:
         @param end_index:
-        @return: (鏄惁鑾峰彇鍒颁俊鍙�, 淇″彿浣嶇疆)
+        @return: (鏄惁鑾峰彇鍒颁俊鍙�, 淇″彿浣嶇疆, 娑堟伅)
         """
         # 婵�杩涗拱淇″彿鐨勬椂闂�
-
 
         radical_data = RadicalBuyDealCodesManager.buy_by_l2_delegate_expire_time_dict.get(code)
         if not radical_data:
@@ -1855,9 +1879,8 @@
         if t.time() > radical_data[0]:
             return False, None, "瓒呰繃鐢熸晥鏃堕棿"
 
-
         # 鍒ゆ柇鏄惁鏄澘涓婃斁閲�
-        if cls.__is_on_limit_up_buy(code, start_index):
+        if cls.__is_at_limit_up_buy(code, start_index):
             return False, None, "鏉夸笂鏀鹃噺"
         total_datas = local_today_datas[code]
         min_num = int(29900 / gpcode_manager.get_limit_up_price_as_num(code))

--
Gitblit v1.8.0