From cbe19ea6066a600cbd0b5110db5d43f8252d14a8 Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期四, 13 六月 2024 11:23:53 +0800 Subject: [PATCH] L撤成交进度相关改进 --- l2/l2_data_source_util.py | 151 +++++++++++++++++++++++++++++++++++++++++--------- 1 files changed, 124 insertions(+), 27 deletions(-) diff --git a/l2/l2_data_source_util.py b/l2/l2_data_source_util.py index 14dfdb9..dab8a19 100644 --- a/l2/l2_data_source_util.py +++ b/l2/l2_data_source_util.py @@ -1,7 +1,9 @@ """ L2鏁版嵁婧簮 """ -import tool +import constant +from log_module.log import logger_l2_error +from utils import tool class L2DataSourceUtils(object): @@ -19,13 +21,13 @@ cls.__buy_and_cancel_map[code][buy_index] = cancel_index @classmethod - def __get_cancel_index(cls, code, buy_index): + def __get_cancel_index_cache(cls, code, buy_index): if code not in cls.__buy_and_cancel_map: return None return cls.__buy_and_cancel_map[code].get(buy_index) @classmethod - def __get_buy_index(cls, code, cancel_index): + def __get_buy_index_cache(cls, code, cancel_index): if code not in cls.__cancel_and_buy_map: return None return cls.__cancel_and_buy_map[code].get(cancel_index) @@ -52,35 +54,33 @@ # 灏忔椂 return __time * 3600, (__time + 1) * 3600 - # 鏍规嵁涔版挙鏁版嵁(涓庝粖鏃ユ�荤殑鏁版嵁)璁$畻涔板叆鏁版嵁 + # 鍗庨懌娓犻亾鐨凩2锛屾牴鎹拱鎾ゆ暟鎹煡鎵句拱鍏ユ暟鎹� @classmethod - def get_buy_index_with_cancel_data(cls, code, cancel_data, local_today_num_operate_map): - key = "{}-{}-{}".format(cancel_data["val"]["num"], "1", cancel_data["val"]["price"]) - cancel_datas = local_today_num_operate_map.get(key) - try: - cancel_datas.sort(key=lambda t: t["index"]) - except Exception as e: - print("娴嬭瘯") - for item in cancel_datas: - cls.__get_buy_index_with_cancel_data(code, item, local_today_num_operate_map) - - return cls.__get_buy_index_with_cancel_data(code, cancel_data, local_today_num_operate_map) - - @classmethod - def __get_buy_index_with_cancel_data(cls, code, cancel_data, local_today_num_operate_map): - buy_index = cls.__get_buy_index(code, cancel_data["index"]) - if buy_index is not None: - return buy_index - - min_space, max_space = cls.__compute_time_space_as_second(cancel_data["val"]["cancelTime"], - cancel_data["val"]["cancelTimeUnit"]) - max_time = tool.trade_time_add_second(cancel_data["val"]["time"], 0 - min_space) - min_time = tool.trade_time_add_second(cancel_data["val"]["time"], 0 - max_space) + def __get_buy_index_with_cancel_data_by_huaxin_l2(cls, code, cancel_data, local_today_num_operate_map): buy_datas = local_today_num_operate_map.get( "{}-{}-{}".format(cancel_data["val"]["num"], "0", cancel_data["val"]["price"])) if buy_datas is None: # 鏃犳暟鎹� return None + # orderNo + for bd in buy_datas: + # 鏍规嵁璁㈠崟鍙峰仛鍖归厤 + if bd["val"]["orderNo"] == cancel_data["val"]["orderNo"]: + return bd["index"] + return None + + # 鍚岃姳椤烘笭閬撶殑L2锛屾牴鎹拱鎾ゆ暟鎹煡鎵句拱鍏ユ暟鎹� + @classmethod + def __get_buy_index_with_cancel_data_by_ths_l2(cls, code, cancel_data, local_today_num_operate_map): + buy_datas = local_today_num_operate_map.get( + "{}-{}-{}".format(cancel_data["val"]["num"], "0", cancel_data["val"]["price"])) + if buy_datas is None: + # 鏃犳暟鎹� + return None + min_space, max_space = cls.__compute_time_space_as_second(cancel_data["val"]["cancelTime"], + cancel_data["val"]["cancelTimeUnit"]) + max_time = tool.trade_time_add_second(cancel_data["val"]["time"], 0 - min_space) + min_time = tool.trade_time_add_second(cancel_data["val"]["time"], 0 - max_space) # 鍖归厤鍒扮殑index suit_indexes = [] for i in range(0, len(buy_datas)): @@ -91,7 +91,7 @@ if int(data["val"]["num"]) != int(cancel_data["val"]["num"]): continue # 濡傛灉鑳芥壘鍒板搴旂殑涔版挙灏遍渶瑕佽繑鍥� - cancel_index = cls.__get_cancel_index(code, data["index"]) + cancel_index = cls.__get_cancel_index_cache(code, data["index"]) if cancel_index is not None and cancel_index != cancel_data["index"]: continue @@ -110,6 +110,103 @@ return suit_indexes[0] return None + @classmethod + def __get_buy_index_with_cancel_data(cls, code, cancel_data, local_today_num_operate_map): + buy_index = cls.__get_buy_index_cache(code, cancel_data["index"]) + if buy_index is not None: + return buy_index + if constant.L2_SOURCE_TYPE == constant.L2_SOURCE_TYPE_HUAXIN: + return cls.__get_buy_index_with_cancel_data_by_huaxin_l2(code, cancel_data, local_today_num_operate_map) + else: + return cls.__get_buy_index_with_cancel_data_by_ths_l2(code, cancel_data, local_today_num_operate_map) + + # 鏍规嵁涔版挙鏁版嵁(涓庝粖鏃ユ�荤殑鏁版嵁)璁$畻涔板叆鏁版嵁 + @classmethod + def get_buy_index_with_cancel_data(cls, code, cancel_data, local_today_num_operate_map): + key = "{}-{}-{}".format(cancel_data["val"]["num"], "1", cancel_data["val"]["price"]) + cancel_datas = local_today_num_operate_map.get(key) + if cancel_datas: + try: + cancel_datas.sort(key=lambda t: t["index"]) + except Exception as e: + print("娴嬭瘯") + for item in cancel_datas: + # 鎻愬墠鍋氳绠� + cls.__get_buy_index_with_cancel_data(code, item, local_today_num_operate_map) + + return cls.__get_buy_index_with_cancel_data(code, cancel_data, local_today_num_operate_map) + + # 鏍规嵁涔版挙鏁版嵁璁$畻涔板叆鏁版嵁锛堝崕閼師鐢烲2鏁版嵁閫傜敤锛� + @classmethod + def get_buy_index_with_cancel_data_v2(cls, cancel_data, buyno_map): + order_no = str(cancel_data["val"]["orderNo"]) + buy_data = buyno_map.get(order_no) + if buy_data: + return buy_data["index"] + return None + + # 鑾峰彇娌℃挙鐨勭瑪鏁� + @classmethod + def get_limit_up_buy_no_canceled_count(cls, code, index, total_data, local_today_num_operate_map): + data = None + try: + data = total_data[index] + except Exception as e: + logger_l2_error.error(f"鏈壘鍒颁拱鍏ョ储寮曞搴旂殑鏁版嵁锛歩ndex-{index} total_data闀垮害-{len(total_data) if total_data else 0} 閿欒鍘熷洜锛歿str(e)}") + val = data["val"] + # 鍒ゆ柇褰撳墠涔版槸鍚﹀凡缁忎拱鎾� + cancel_datas = local_today_num_operate_map.get( + "{}-{}-{}".format(val["num"], "1", val["price"])) + canceled = False + if cancel_datas: + for cancel_data in cancel_datas: + buy_index = cls.get_buy_index_with_cancel_data(code, cancel_data, local_today_num_operate_map) + if buy_index == index: + canceled = True + count = data["re"] - cancel_data["re"] + if count > 0: + return count + break + if not canceled: + count = data["re"] + return count + return 0 + + # 鑾峰彇娌℃挙鐨勭瑪鏁� + + # 鑾峰彇娑ㄥ仠涔版病鏈夋挙鍗曠殑鏁伴噺 + @classmethod + def get_limit_up_buy_no_canceled_count_v2(cls, code, index, total_data, canceled_buyno_map): + data = None + try: + data = total_data[index] + except Exception as e: + logger_l2_error.error( + f"鏈壘鍒颁拱鍏ョ储寮曞搴旂殑鏁版嵁锛歩ndex-{index} total_data闀垮害-{len(total_data) if total_data else 0} 閿欒鍘熷洜锛歿str(e)}") + val = data["val"] + order_no = str(val["orderNo"]) + canceled_data = canceled_buyno_map.get(order_no) + if canceled_data: + return data["re"] - canceled_data["re"] + else: + return data["re"] + + @classmethod + def get_limit_up_buy_canceled_data_v2(cls, code, index, total_data, canceled_buyno_map): + data = None + try: + data = total_data[index] + except Exception as e: + logger_l2_error.error( + f"鏈壘鍒颁拱鍏ョ储寮曞搴旂殑鏁版嵁锛歩ndex-{index} total_data闀垮害-{len(total_data) if total_data else 0} 閿欒鍘熷洜锛歿str(e)}") + val = data["val"] + order_no = str(val["orderNo"]) + canceled_data = canceled_buyno_map.get(order_no) + if canceled_data: + return canceled_data + else: + return None + # if __name__ == "__main__": # code = "000925" -- Gitblit v1.8.0