From 8b848e8a9fa242b39f92f3a28faf89be10a6e456 Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期五, 17 三月 2023 17:43:32 +0800
Subject: [PATCH] 首板策略优化

---
 l2/cancel_buy_strategy.py |   82 +++++++++++++++++++----------------------
 1 files changed, 38 insertions(+), 44 deletions(-)

diff --git a/l2/cancel_buy_strategy.py b/l2/cancel_buy_strategy.py
index 230fa30..b554e2b 100644
--- a/l2/cancel_buy_strategy.py
+++ b/l2/cancel_buy_strategy.py
@@ -25,6 +25,7 @@
 
 class SecondCancelBigNumComputer:
     __redis_manager = redis_manager.RedisManager(0)
+    __sCancelParamsManager = l2_trade_factor.SCancelParamsManager
 
     @classmethod
     def __getRedis(cls):
@@ -61,20 +62,16 @@
 
     # 璁$畻鍑�澶у崟
     @classmethod
-    def __compute_left_big_num(cls, code, buy_single_index, start_index, end_index, total_data, place_order_count):
+    def __compute_left_big_num(cls, code, buy_single_index, start_index, end_index, total_data, volume_rate_index):
         # 鑾峰彇澶у崟鐨勬渶灏忔墜鏁�
         left_big_num = 0
         # 鐐圭伀澶у崟鏁伴噺
-        fire_count = 5
-        if place_order_count <= 4:
-            fire_count = 6 - place_order_count
-        else:
-            fire_count = 2
+        fire_count = cls.__sCancelParamsManager.get_max_exclude_count(volume_rate_index)
         for i in range(start_index, end_index + 1):
             data = total_data[i]
             val = data["val"]
             # 鍘婚櫎闈炲ぇ鍗�
-            if not l2_data_util.is_big_money(val):
+            if val["num"] * float(val["price"]) <= constant.S_CANCEL_MIN_MONEY * 100:
                 continue
 
             if L2DataUtil.is_limit_up_price_buy(val):
@@ -108,12 +105,15 @@
 
     @classmethod
     def need_cancel(cls, code, buy_single_index, buy_exec_index, start_index, end_index, total_data, is_first_code,
+                    buy_volume_rate_index,
+                    volume_rate_index,
                     need_cancel=True):
         if start_index >= 217:
             print("杩涘叆璋冭瘯")
         # 鍙畧鎶�30s
+        buy_exec_time = total_data[buy_exec_index]["val"]["time"]
         if tool.trade_time_sub(total_data[start_index]["val"]["time"],
-                               total_data[buy_exec_index]["val"]["time"]) > constant.S_CANCEL_EXPIRE_TIME:
+                               buy_exec_time) > constant.S_CANCEL_EXPIRE_TIME:
             return False, None
         l2_log.cancel_debug(code, "S绾ф槸鍚﹂渶瑕佹挙鍗曪紝鏁版嵁鑼冨洿锛歿}-{} ", start_index, end_index)
         logger_l2_s_cancel.debug(f"code-{code} S绾ф槸鍚﹂渶瑕佹挙鍗曪紝鏁版嵁鑼冨洿锛歿start_index}-{end_index}")
@@ -157,7 +157,8 @@
             #         if buy_index is not None and a_start_index <= buy_index <= a_end_index:
             #             # 鍦ㄤ拱鍏ヤ俊鍙蜂箣鍚�
             #             cls.__save_cancel_data(code, i)
-
+        range_seconds = cls.__sCancelParamsManager.get_buy_time_range(buy_volume_rate_index)
+        cancel_rate_threshold = cls.__sCancelParamsManager.get_cancel_rate(volume_rate_index)
         try:
             for i in range(start_index, end_index + 1):
                 data = total_data[i]
@@ -166,18 +167,23 @@
                 if process_index_old >= i:
                     # 宸茬粡澶勭悊杩囩殑鏁版嵁涓嶉渶瑕佸鐞�
                     continue
-                if not l2_data_util.is_big_money(val):
+                if val["num"] * float(val["price"]) <= constant.S_CANCEL_MIN_MONEY * 100:
                     continue
 
                 if L2DataUtil.is_limit_up_price_buy(val):
-                    buy_num += data["re"] * int(val["num"])
+                    # 濡傛灉鍦ㄥ泭鎷椂闂磋寖鍥村唴灏卞彲浠ヨ绠椾拱
+                    if tool.trade_time_sub(val["time"], buy_exec_time) <= range_seconds:
+                        buy_num += data["re"] * int(val["num"])
                 elif L2DataUtil.is_limit_up_price_buy_cancel(val):
                     # 鏌ヨ涔板叆浣嶇疆
                     buy_index = l2_data_source_util.L2DataSourceUtils.get_buy_index_with_cancel_data(code, data,
                                                                                                      local_today_num_operate_map.get(
                                                                                                          code))
                     if buy_index is not None and buy_single_index <= buy_index:
-                        cancel_num += total_data[buy_index]["re"] * int(total_data[buy_index]["val"]["num"])
+                        # 涔板叆鏃堕棿鍦ㄥ泭鎷寖鍥村唴
+                        if tool.trade_time_sub(tool.trade_time_add_second(buy_exec_time, range_seconds),
+                                               total_data[buy_index]["val"]["time"]) >= 0:
+                            cancel_num += total_data[buy_index]["re"] * int(total_data[buy_index]["val"]["num"])
                     elif buy_index is None:
                         # 鏈夐儴鍒嗘挙閿�浠庤�屽鑷寸殑鏃犳硶婧簮锛岃繖鏃跺氨闇�瑕佸垽鏂浼颁拱鍏ユ椂闂存槸鍚﹀湪a_start_index鍒癮_end_index鐨勬椂闂村尯闂�
                         min_space, max_space = l2_data_util.compute_time_space_as_second(val["cancelTime"],
@@ -187,28 +193,21 @@
                             buy_time = tool.trade_time_add_second(val["time"], 0 - min_space)
                             if int(total_data[buy_single_index]["val"]["time"].replace(":", "")) <= int(
                                     buy_time.replace(":", "")):
-                                cancel_num += data["re"] * int(val["num"])
+                                # 涔板叆鏃堕棿鍦ㄥ泭鎷寖鍥村唴
+                                if tool.trade_time_sub(tool.trade_time_add_second(buy_exec_time, range_seconds),
+                                                       total_data[buy_index]["val"]["time"]) >= 0:
+                                    cancel_num += data["re"] * int(val["num"])
 
                     # 淇濆瓨鏁版嵁
 
                     if need_cancel:
-                        cancel_rate_threshold = constant.S_CANCEL_FIRST_RATE
 
-                        if place_order_count <= 1:
-                            cancel_rate_threshold = constant.S_CANCEL_FIRST_RATE
-                        elif place_order_count <= 2:
-                            cancel_rate_threshold = constant.S_CANCEL_SECOND_RATE
-                        else:
-                            cancel_rate_threshold = constant.S_CANCEL_THIRD_RATE
-                        if is_first_code:
-                            cancel_rate_threshold += 0.1
-                            cancel_rate_threshold = round(cancel_rate_threshold, 2)
                         if cancel_num / max(buy_num, 1) > cancel_rate_threshold:
                             return True, total_data[i]
         finally:
 
-            l2_log.cancel_debug(code, "S绾уぇ鍗� 鑼冨洿锛歿}-{} 鍙栨秷璁$畻缁撴灉:{}/{},姣斾緥锛歿}", start_index, end_index, cancel_num,
-                                buy_num, round(cancel_num / max(buy_num, 1), 2))
+            l2_log.cancel_debug(code, "S绾уぇ鍗� 鑼冨洿锛歿}-{} 鍙栨秷璁$畻缁撴灉:{}/{},姣斾緥锛歿} 鐩爣姣斾緥:{} 璁$畻鏃堕棿鑼冨洿锛歿}", start_index, end_index, cancel_num,
+                                buy_num, round(cancel_num / max(buy_num, 1), 2), cancel_rate_threshold,range_seconds)
 
             # 淇濆瓨澶勭悊杩涘害涓庢暟鎹�
             cls.__save_compute_data(code, process_index, buy_num, cancel_num)
@@ -225,6 +224,7 @@
     __redis_manager = redis_manager.RedisManager(0)
     __tradeBuyQueue = TradeBuyQueue()
     __buyL2SafeCountManager = BuyL2SafeCountManager()
+    __hCancelParamsManager = l2_trade_factor.HCancelParamsManager()
 
     @classmethod
     def __getRedis(cls):
@@ -307,12 +307,14 @@
 
     @classmethod
     def need_cancel(cls, code, buy_exec_index, start_index, end_index, total_data, local_today_num_operate_map,
+                    buy_volume_index, volume_index,
                     is_first_code):
         time_space = tool.trade_time_sub(total_data[start_index]["val"]["time"],
                                          total_data[buy_exec_index]["val"]["time"])
         if time_space >= constant.S_CANCEL_EXPIRE_TIME - 1:
             # 寮�濮嬭绠楅渶瑕佺洃鎺х殑鍗�
-            cls.__compute_watch_indexs_after_exec(code, buy_exec_index, total_data, local_today_num_operate_map)
+            cls.__compute_watch_indexs_after_exec(code, buy_exec_index, total_data, local_today_num_operate_map,
+                                                  buy_volume_index)
 
         # 瀹堟姢30s浠ュ鐨勬暟鎹�
         if time_space <= constant.S_CANCEL_EXPIRE_TIME:
@@ -346,16 +348,7 @@
         l2_log.cancel_debug(code, "H绾ф槸鍚﹂渶瑕佹挙鍗曪紝鏁版嵁鑼冨洿锛歿}-{} ", start_index, end_index)
         # 鑾峰彇涓嬪崟娆℃暟
         place_order_count = trade_data_manager.placeordercountmanager.get_place_order_count(code)
-        cancel_rate_threshold = constant.H_CANCEL_FIRST_RATE
-        if place_order_count <= 1:
-            cancel_rate_threshold = constant.H_CANCEL_FIRST_RATE
-        elif place_order_count <= 2:
-            cancel_rate_threshold = constant.H_CANCEL_SECOND_RATE
-        else:
-            cancel_rate_threshold = constant.H_CANCEL_THIRD_RATE
-        if is_first_code:
-            cancel_rate_threshold += 0.1
-            cancel_rate_threshold = round(cancel_rate_threshold,2)
+        cancel_rate_threshold = cls.__hCancelParamsManager.get_cancel_rate(volume_index)
         process_index = start_index
         try:
             for i in range(start_index, end_index + 1):
@@ -374,9 +367,9 @@
                         if cancel_num / total_nums > cancel_rate_threshold:
                             return True, data
         finally:
-            l2_log.cancel_debug(code, "H绾ф挙鍗曡绠楃粨鏋� 鑼冨洿锛歿}-{} 澶勭悊杩涘害锛歿} 鍙栨秷璁$畻缁撴灉:{}/{}", start_index, end_index,
+            l2_log.cancel_debug(code, "H绾ф挙鍗曡绠楃粨鏋� 鑼冨洿锛歿}-{} 澶勭悊杩涘害锛歿} 鍙栨秷璁$畻缁撴灉:{}/{} 鐩爣鎾ゅ崟姣斾緥锛歿}", start_index, end_index,
                                 process_index, cancel_num,
-                                total_nums)
+                                total_nums,cancel_rate_threshold)
             logger_l2_h_cancel.info(
                 f"code-{code} H绾ф挙鍗曡绠楃粨鏋� 鑼冨洿锛歿start_index}-{end_index} 澶勭悊杩涘害锛歿process_index} 鐩爣姣斾緥锛歿cancel_rate_threshold} 鍙栨秷璁$畻缁撴灉:{cancel_num}/{total_nums}")
             # 淇濆瓨澶勭悊杩涘害涓庢暟鎹�
@@ -475,7 +468,7 @@
             if left_count > 0:
                 data = total_data[i]
                 val = data["val"]
-                if val["num"] * float(val["price"]) <= 9900:
+                if val["num"] * float(val["price"]) <= constant.H_CANCEL_MIN_MONEY*100:
                     continue
                 total_count += left_count
                 watch_set.add((i, val["num"], left_count))
@@ -492,7 +485,8 @@
 
     # 璁$畻鎵ц浣嶇疆涔嬪悗鐨勯渶瑕佺洃鍚殑鏁版嵁
     @classmethod
-    def __compute_watch_indexs_after_exec(cls, code, buy_exec_index, total_data, local_today_num_operate_map):
+    def __compute_watch_indexs_after_exec(cls, code, buy_exec_index, total_data, local_today_num_operate_map,
+                                          buy_volume_index):
         watch_list, process_index_old, total_count_old, big_num_count_old, finish = cls.__get_watch_index_set_after_exec(
             code)
         if watch_list and finish:
@@ -509,7 +503,7 @@
         big_num_count = big_num_count_old
         total_count = total_count_old
         # H鎾ゅ崟
-        MIN_H_COUNT = l2_trade_factor.L2TradeFactorUtil.get_h_cancel_min_count(code)
+        MIN_H_COUNT = cls.__hCancelParamsManager.get_max_watch_count(buy_volume_index)
 
         for i in range(buy_exec_index, total_data[-1]["index"] + 1):
             if i <= process_index_old:
@@ -523,7 +517,7 @@
             if left_count > 0:
                 data = total_data[i]
                 val = data["val"]
-                if val["num"] * float(val["price"]) <= 9900:
+                if val["num"] * float(val["price"]) <= constant.H_CANCEL_MIN_MONEY*100:
                     continue
                 total_count += left_count
                 watch_set.add((i, val["num"], left_count))
@@ -534,8 +528,8 @@
                 # 鍒ゆ柇鏄惁杈惧埌闃堝��
                 if total_count >= MIN_H_COUNT and big_num_count >= constant.H_CANCEL_MIN_BIG_NUM_COUNT:  # and total_num >= threshold_num
                     finished = True
-                    l2_log.cancel_debug(code, "鑾峰彇鍒癏鎾ょ洃鍚暟鎹細{},璁$畻鎴嚦浣嶇疆锛歿}", json.dumps(list(watch_set)),
-                                        total_data[-1]["index"])
+                    l2_log.cancel_debug(code, "鑾峰彇鍒癏鎾ょ洃鍚暟鎹細{},璁$畻鎴嚦浣嶇疆锛歿}锛岀洰鏍囪绠楁暟閲�:{}", json.dumps(list(watch_set)),
+                                        total_data[-1]["index"],MIN_H_COUNT)
                     break
 
         final_watch_list = list(watch_set)

--
Gitblit v1.8.0