From 778889b13087125e0eacfa5f0d69e8bb95f82916 Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期二, 05 九月 2023 17:32:43 +0800
Subject: [PATCH] L撤撤单策略修改

---
 l2/cancel_buy_strategy.py |  146 ++++++++++++++++++------------------------------
 1 files changed, 56 insertions(+), 90 deletions(-)

diff --git a/l2/cancel_buy_strategy.py b/l2/cancel_buy_strategy.py
index 88c13dd..d2cfbde 100644
--- a/l2/cancel_buy_strategy.py
+++ b/l2/cancel_buy_strategy.py
@@ -30,6 +30,7 @@
 def set_real_place_position(code, index):
     DCancelBigNumComputer().set_real_order_index(code, index)
     SecondCancelBigNumComputer().set_real_place_order_index(code, index)
+    LCancelBigNumComputer().set_real_place_order_index(code, index)
 
 
 class SecondCancelBigNumComputer:
@@ -1004,6 +1005,7 @@
     __db = 0
     __redis_manager = redis_manager.RedisManager(0)
     __last_trade_progress_dict = {}
+    __real_place_order_index_dict = {}
     __cancel_watch_index_cache = {}
     __SecondCancelBigNumComputer = SecondCancelBigNumComputer()
 
@@ -1049,6 +1051,12 @@
                 self.__cancel_watch_index_cache[code].discard(index)
             RedisUtils.srem_async(self.__db, f"l_cancel_watch_index-{code}", index)
 
+    def __set_watch_indexes(self, code, indexes):
+        self.__cancel_watch_index_cache[code] = indexes
+        RedisUtils.delete_async(self.__db, f"l_cancel_watch_index-{code}")
+        for index in indexes:
+            RedisUtils.srem_async(self.__db, f"l_cancel_watch_index-{code}", index)
+
     def __get_watch_indexes(self, code):
         return RedisUtils.smembers(self.__get_redis(), f"l_cancel_watch_index-{code}")
 
@@ -1067,66 +1075,60 @@
             self.del_watch_index(code)
             if code in self.__last_trade_progress_dict:
                 self.__last_trade_progress_dict.pop(code)
+            if code in self.__real_place_order_index_dict:
+                self.__real_place_order_index_dict.pop(code)
         else:
             keys = RedisUtils.keys(self.__get_redis(), f"l_cancel_watch_index-*")
             for k in keys:
                 code = k.replace("l_cancel_watch_index-", "")
                 self.del_watch_index(code)
 
+    # 璁$畻瑙傚療绱㈠紩锛屽�掑簭璁$畻
+    def compute_watch_index(self, code, start_index, end_index):
+        total_datas = local_today_datas.get(code)
+        if total_datas:
+            MIN_MONEYS = [300, 200, 100, 50]
+            for min_money in MIN_MONEYS:
+                watch_indexes = set()
+                for i in range(end_index - 1, start_index, -1):
+                    data = total_datas[i]
+                    val = data['val']
+                    if not L2DataUtil.is_limit_up_price_buy(val):
+                        continue
+                    # 灏忛噾棰濊繃婊�
+                    if float(val['price']) * val['num'] < min_money * 100:
+                        continue
+                    left_count = l2_data_source_util.L2DataSourceUtils.get_limit_up_buy_no_canceled_count(code, i,
+                                                                                                          total_datas,
+                                                                                                          local_today_num_operate_map.get(
+                                                                                                              code))
+                    if left_count > 0:
+                        watch_indexes.add(i)
+                        if len(watch_indexes) >= 5:
+                            break
+                if watch_indexes:
+                    self.__set_watch_indexes(code, watch_indexes)
+                    l2_log.l_cancel_debug(code, f"璁剧疆鐩戝惉鑼冨洿锛� 鏁版嵁鑼冨洿锛歿start_index}-{end_index} 鐩戝惉鑼冨洿-{watch_indexes}")
+                    break
+
+    # 璁剧疆鐪熷疄涓嬪崟浣嶇疆
+    def set_real_place_order_index(self, code, index):
+        self.__real_place_order_index_dict[code] = index
+        if self.__last_trade_progress_dict.get(code):
+            self.compute_watch_index(code, self.__last_trade_progress_dict.get(code), index)
+
     # 璁剧疆鎴愪氦浣嶇疆,鎴愪氦浣嶇疆鍙樺寲涔嬪悗鐩稿簲鐨勭洃鍚暟鎹篃浼氬彂鐢熷彉鍖�
     def set_trade_progress(self, code, index, total_data):
-        # 姹傚姩鎬乵鍊�
-        volume_rate = code_volumn_manager.get_volume_rate(code)
-        volume_rate_index = code_volumn_manager.get_volume_rate_index(volume_rate)
-        m_val = L2PlaceOrderParamsManager(code, True, volume_rate, volume_rate_index, None).get_m_val()[0]
-        limit_up_price = gpcode_manager.get_limit_up_price(code)
-        m_val_num = int(m_val / (float(limit_up_price) * 100))
-        threshold_num = m_val_num
+        # 宸茬粡鏈夎绠楃殑鏃犳硶瑙﹀彂璁$畻
         old_watch_indexes = self.__get_watch_indexes_cache(code)
+        if old_watch_indexes:
+            return
         if self.__last_trade_progress_dict.get(code) == index:
-            # 鎴愪氦杩涘害灏氭湭鍙戠敓鍙樺寲涓斿凡缁忕洃鍚埌浜嗚冻澶熺殑鏁版嵁
-            if len(old_watch_indexes) >= constant.L_CANCEL_MIN_WATCH_COUNT:
-                if old_watch_indexes:
-                    total_num = 0
-                    for i in old_watch_indexes:
-                        data = total_data[i]
-                        val = data['val']
-                        total_num += val['num'] * data['re']
-                    if total_num > threshold_num:
-                        return
+            return
         self.__last_trade_progress_dict[code] = index
-
-        watch_indexes = set()
-        start_index = index + 1
-        end_index = total_data[-1]["index"]
-        total_num = 0
-
-        for i in range(start_index, end_index + 1):
-            data = total_data[i]
-            val = data['val']
-            if not L2DataUtil.is_limit_up_price_buy(val):
-                continue
-            # 灏忛噾棰濊繃婊�
-            if float(val['price'])*val['num'] < constant.L_CANCEL_MIN_MONEY * 100:
-                continue
-
-            # 鍒ゆ柇褰撳墠璁㈠崟鏄惁宸茬粡鎾ゅ崟
-            left_count = l2_data_source_util.L2DataSourceUtils.get_limit_up_buy_no_canceled_count(code, i, total_data,
-                                                                                                  local_today_num_operate_map.get(
-                                                                                                      code))
-            if left_count > 0:
-                watch_indexes.add(i)
-                total_num += val['num'] * data['re']
-
-                if len(watch_indexes) >= constant.L_CANCEL_MIN_WATCH_COUNT and total_num > threshold_num:
-                    break
-        l2_log.l_cancel_debug(code,
-                              f"璁剧疆鐩戝惉鑼冨洿锛屾垚浜よ繘搴�-{index} , 鏁版嵁鑼冨洿锛歿start_index}-{end_index} 鐩戝惉鑼冨洿-{watch_indexes} 绾拱鎵嬫暟锛歿total_num}/{threshold_num}")
-        # 鏁版嵁缁存姢
-        add_indexes = watch_indexes - old_watch_indexes
-        delete_indexes = old_watch_indexes - watch_indexes
-        self.__add_watch_indexes(code, add_indexes)
-        self.__del_watch_indexes(code, delete_indexes)
+        if self.__real_place_order_index_dict.get(code):
+            # 瑙﹀彂璁$畻
+            self.compute_watch_index(code, self.__last_trade_progress_dict.get(code), self.__real_place_order_index_dict.get(code))
 
     def __compute_need_cancel(self, code, buy_exec_index, start_index, end_index, total_data,
                               _local_today_num_operate_map, is_first_code):
@@ -1135,9 +1137,9 @@
             return False, None
         watch_indexes = set([int(i) for i in watch_indexes])
         # 璁$畻鐩戝惉鐨勬�绘潯鏁�
-        total_num = 0
+        total_count = 0
         for wi in watch_indexes:
-            total_num += total_data[wi]["re"] * int(total_data[wi]["val"]["num"])
+            total_count += total_data[wi]["re"]
         # 鍒ゆ柇鎾ゅ崟涓槸鍚︽湁鐩戝惉涓殑绱㈠紩
         need_compute = False
         for i in range(start_index, end_index + 1):
@@ -1152,14 +1154,14 @@
                     break
         if need_compute:
             # 璁$畻鎾ゅ崟姣斾緥
-            canceled_num = 0
+            canceled_count = 0
             for wi in watch_indexes:
                 left_count = l2_data_source_util.L2DataSourceUtils.get_limit_up_buy_no_canceled_count(code,
                                                                                                       wi,
                                                                                                       total_data,
                                                                                                       _local_today_num_operate_map)
-                canceled_num += (total_data[wi]["re"] - left_count) * int(total_data[wi]["val"]["num"])
-            rate = round(canceled_num / total_num, 3)
+                canceled_count += total_data[wi]["re"] - left_count
+            rate = round(canceled_count / total_count, 3)
             l2_log.l_cancel_debug(code, f"璁$畻鑼冨洿锛歿start_index}-{end_index},宸叉挙鍗曟瘮渚嬶細{rate}")
             if rate >= constant.L_CANCEL_RATE:
                 return True, total_data[-1]
@@ -1175,42 +1177,6 @@
             return False, None
         can_cancel, cancel_data = self.__compute_need_cancel(code, buy_exec_index, start_index, end_index, total_data,
                                                              _local_today_num_operate_map, is_first_code)
-        if can_cancel:
-            # 鍒ゆ柇鎴愪氦杩涘害浣嶇疆鍒板綋鍓嶄綅缃殑鍑�涔板叆
-            try:
-                place_order_index = self.__SecondCancelBigNumComputer.get_real_place_order_index_cache(code)
-                if place_order_index is None:
-                    raise Exception("鏈幏鍙栧埌涓嬪崟鐪熷疄浣嶇疆")
-                # 鑾峰彇鍒扮湡瀹炴垚浜や綅缃�
-                transaction_index = self.__last_trade_progress_dict.get(code)
-                if transaction_index is None:
-                    raise Exception("灏氭湭鑾峰彇鍒扮湡瀹炴垚浜や綅缃�")
-                # 鑾峰彇m鍊�
-                volume_rate = code_volumn_manager.get_volume_rate(code)
-                volume_rate_index = code_volumn_manager.get_volume_rate_index(volume_rate)
-                m_val = L2PlaceOrderParamsManager(code, True, volume_rate, volume_rate_index, None).get_m_val()[0]
-                limit_up_price = gpcode_manager.get_limit_up_price(code)
-                m_val_num = int(m_val / (float(limit_up_price) * 100))
-                threshold_num = int(m_val_num * 1.2)
-                buy_nums = 0
-                for index in range(transaction_index + 1, place_order_index):
-                    data = total_data[index]
-                    if L2DataUtil.is_limit_up_price_buy(data["val"]):
-                        # 鑾峰彇鏄惁鍦ㄤ拱鍏ユ墽琛屼俊鍙峰懆鍥�2s
-                        left_count = l2_data_source_util.L2DataSourceUtils.get_limit_up_buy_no_canceled_count(code,
-                                                                                                              index,
-                                                                                                              total_data,
-                                                                                                              local_today_num_operate_map)
-                        if left_count > 0:
-                            buy_nums += left_count * data["val"]["num"]
-                            if buy_nums > threshold_num:
-                                l2_log.l_cancel_debug(code, f"LX闃绘柇L鎾ゆ挙鍗曪細{buy_nums}/{threshold_num}  鎴愪氦浣嶇疆-{transaction_index} 鐪熷疄涓嬪崟浣嶇疆-{place_order_index}")
-                                return False, "LX闃绘柇L鎾ゆ挙鍗�"
-                l2_log.l_cancel_debug(code, f"LX灏氭湭闃绘柇L鎾ゆ挙鍗曪細{buy_nums}/{threshold_num} 鎴愪氦浣嶇疆-{transaction_index} 鐪熷疄涓嬪崟浣嶇疆-{place_order_index}")
-                return can_cancel, cancel_data
-            except Exception as e:
-                l2_log.l_cancel_debug(code, f"LX鎾ゅ崟璁$畻寮傚父锛歿str(e)}")
-                return can_cancel, cancel_data
         return can_cancel, cancel_data
 
     def place_order_success(self, code):

--
Gitblit v1.8.0