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