From 6a0d3ff5832e57ee1b1374d086f24b3c1679b332 Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期五, 05 九月 2025 18:22:24 +0800 Subject: [PATCH] bug修复/降低测撤单率 --- l2/l2_limitup_sell_data_manager.py | 147 ++++++++++++++++++++++++++++++------------------ 1 files changed, 91 insertions(+), 56 deletions(-) diff --git a/l2/l2_limitup_sell_data_manager.py b/l2/l2_limitup_sell_data_manager.py index f0f24af..674ee5a 100644 --- a/l2/l2_limitup_sell_data_manager.py +++ b/l2/l2_limitup_sell_data_manager.py @@ -3,8 +3,10 @@ """ from code_attribute import gpcode_manager from l2 import l2_log +from l2.l2_data_util import L2DataUtil from log_module import async_log_util, log_export -from log_module.log import hx_logger_l2_sell_delegate, hx_logger_l2_sell_deal +from log_module.log import hx_logger_l2_sell_delegate, hx_logger_l2_sell_deal, logger_debug +from utils import tool class L2LimitUpSellDataManager: @@ -23,11 +25,11 @@ __delegating_sell_num_dict = {} @classmethod - def add_l2_origin_data(cls, code, origin_datas): + def add_l2_data(cls, code, add_datas): """ 娣诲姞L2濮旀墭鍘熷鏁版嵁 @param code: 浠g爜 - @param origin_datas: 鍘熷鏁版嵁 + @param add_datas: 鏂板鐨勬牸寮忓寲鏁版嵁 @return: """ try: @@ -39,25 +41,23 @@ cls.__delegating_sell_num_dict[code] = 0 limit_up_price = gpcode_manager.get_limit_up_price_as_num(code) - for d in origin_datas: - order_no, price, volume = d[8], d[1], d[2] - if price != limit_up_price: - continue - if d[9] == 'D': - if d[3] != '1': - # 鍗栨挙 - cls.__order_no_set_dict[code].discard(order_no) - cls.__delegating_sell_num_dict[code] -= volume - async_log_util.l2_data_log.info(hx_logger_l2_sell_delegate, - f"{code}-鍗栨挙-{order_no, price, volume}") - else: - if d[3] != '1': - # 鍗� - cls.__order_no_data_map_dict[code][order_no] = (order_no, price, volume) - cls.__order_no_set_dict[code].add(order_no) - cls.__delegating_sell_num_dict[code] += volume - async_log_util.l2_data_log.info(hx_logger_l2_sell_delegate, - f"{code}-鍗�-{order_no, price, volume}") + for d in add_datas: + val = d["val"] + if L2DataUtil.is_limit_up_price_sell(val): + # 鍗� + order_no, price, volume = val["orderNo"], val["price"], val["num"] * 100 + cls.__order_no_data_map_dict[code][order_no] = (order_no, price, volume) + cls.__order_no_set_dict[code].add(order_no) + cls.__delegating_sell_num_dict[code] += volume + async_log_util.l2_data_log.info(hx_logger_l2_sell_delegate, + f"{code}-鍗�-{(order_no, price, volume)}-{cls.__delegating_sell_num_dict[code]}") + elif L2DataUtil.is_limit_up_price_sell_cancel(val): + # 鍗栨挙 + order_no, price, volume = val["orderNo"], val["price"], val["num"] * 100 + cls.__order_no_set_dict[code].discard(order_no) + cls.__delegating_sell_num_dict[code] -= volume + async_log_util.l2_data_log.info(hx_logger_l2_sell_delegate, + f"{code}-鍗栨挙-{(order_no, price, volume)}-{cls.__delegating_sell_num_dict[code]}") except: pass @@ -71,41 +71,42 @@ return cls.__delegating_sell_num_dict.get(code) @classmethod - def set_deal_datas(cls, code, datas): + def set_deal_datas(cls, code, fdatas): """ 璁剧疆鎴愪氦鐨勫崠鍗� @param code: - @param datas: q.append((data['SecurityID'], data['TradePrice'], data['TradeVolume'],data['OrderTime'], data['MainSeq'], data['SubSeq'], data['BuyNo'],data['SellNo'], data['ExecType'])) + @param fdatas: 鏁版嵁鏈韩鏍煎紡锛� (data['SecurityID'], data['TradePrice'], data['TradeVolume'],data['OrderTime'], data['MainSeq'], data['SubSeq'], data['BuyNo'],data['SellNo'], data['ExecType']) + [(鏁版嵁鏈韩, 鏄惁涓诲姩涔�, 鏄惁娑ㄥ仠, 鎬绘垚浜ら, 涓嶅惈ms鏃堕棿锛屽惈ms鏃堕棿)] @return: 鏄惁瑙﹀彂璁$畻 """ try: - limit_up_price = gpcode_manager.get_limit_up_price_as_num(code) - has_limit_up_active_buy = False order_no_set = cls.__order_no_set_dict.get(code) if order_no_set is None: order_no_set = set() - for d in datas: - if d[1] != limit_up_price: - continue + # 缁熻娑ㄥ仠鍗栧崟鐨勬垚浜� + # 鍗栧崟鎴愪氦瀛楀吀 + __deal_order_volume_dict = {} + for d in fdatas: # 鏄惁鏈夋定鍋滀富鍔ㄤ拱鎴愪氦 - if d[6] < d[7]: + if not d[1] or not d[2]: continue - has_limit_up_active_buy = True - break - total_deal_volume = 0 - if code in cls.__delegating_sell_num_dict: - for d in datas: - # 鍑忓幓 - if d[7] in order_no_set: - total_deal_volume += d[2] - cls.__delegating_sell_num_dict[code] -= total_deal_volume + if d[0][7] not in __deal_order_volume_dict: + __deal_order_volume_dict[d[0][7]] = 0 + __deal_order_volume_dict[d[0][7]] += d[0][2] - if has_limit_up_active_buy: + # 鍑忓幓 + add_order_nos = order_no_set & __deal_order_volume_dict.keys() + _total_deal_volume = sum([__deal_order_volume_dict[x] for x in add_order_nos]) + if code in cls.__delegating_sell_num_dict: + cls.__delegating_sell_num_dict[code] -= _total_deal_volume + if _total_deal_volume > 0: + l2_log.info(code, hx_logger_l2_sell_deal, + f"娑ㄥ仠涓诲姩涔版垚浜わ細{_total_deal_volume}") # 鎵撳嵃鏃ュ織 - async_log_util.l2_data_log.info(hx_logger_l2_sell_deal, - f"鏈夋定鍋滀富鍔ㄥ崠锛歿code}-{datas[-1][3]}-{cls.__delegating_sell_num_dict.get(code)}, 鎴愪氦閲�-{total_deal_volume}") - except: - pass + l2_log.info(code, hx_logger_l2_sell_deal, + f"鏈夋定鍋滀富鍔ㄥ崠锛歿code}-{fdatas[-1][0][3]}-{cls.__delegating_sell_num_dict.get(code)}, 鎴愪氦閲�-{_total_deal_volume}") + except Exception as e: + logger_debug.exception(e) @classmethod def clear_data(cls, code): @@ -114,22 +115,56 @@ @param code: @return: """ - if code in cls.__order_no_set_dict: - cls.__order_no_set_dict.pop(code) + if cls.__order_no_set_dict.get(code): + cls.__order_no_set_dict[code].clear() - if code in cls.__order_no_data_map_dict: - cls.__order_no_data_map_dict.pop(code) + if cls.__order_no_data_map_dict.get(code): + cls.__order_no_data_map_dict[code].clear() - if code in cls.__delegating_sell_num_dict: - cls.__delegating_sell_num_dict.pop(code) + if cls.__delegating_sell_num_dict.get(code): + cls.__delegating_sell_num_dict[code] = 0 + l2_log.info(code, hx_logger_l2_sell_delegate, + f"鍑虹幇涓诲姩鍗栨竻闄ゆ暟鎹細{code}") if __name__ == "__main__": - code = "300479" - datas = log_export.load_huaxin_l2_sell_deal(code).get(code) + # 娴嬭瘯娑ㄥ仠鎬诲崠鍚冩帀鐨勬儏鍐� + code = "002681" + datas = log_export.load_huaxin_l2_sell_deal_list(code).get(code) print(datas) - total_volume = sum([x[1] for x in datas]) - print("娑ㄥ仠鍗栨垚浜�", total_volume * 20.41) + deal_datas = [] + deal_order_nos = set() + for i in range(len(datas)): + if 100100 <= int(datas[i][0].replace(":", "")) <= 100230: + deal_datas.append(datas[i]) + for x in deal_datas: + for xx in x[1]: + deal_order_nos.add(xx[7]) + + total_deal_volume = sum([sum([xx[2] for xx in x[1]]) for x in deal_datas]) + print("娑ㄥ仠鍗栨垚浜ら噺", total_deal_volume) datas = log_export.load_huaxin_l2_sell_delegate(code).get(code) - total_delegate = sum([x[2][2] for x in datas]) - print("鎬诲鎵�",total_delegate) + fdatas = [] + for x in datas: + # if int("101821") < int(x[0].replace(":", "")) < int("102841"): + if 14578165 >= x[2][0] >= 14565438: + fdatas.append(x) + delegate_order_nos = set() + total_delegate = 0 + for x in fdatas: + if x[1] == '鍗�': + total_delegate += x[2][2] + delegate_order_nos.add(x[2][0]) + elif x[1] == '鍗栨挙': + total_delegate -= x[2][2] + delegate_order_nos.discard(x[2][0]) + print(fdatas) + for d in fdatas: + print(d) + print("鎬绘垚浜�", total_deal_volume, total_deal_volume * 17.28) + print("鎬诲鎵�", total_delegate, total_delegate * 17.28) + print("濮旀墭鍓╀綑", total_delegate - total_deal_volume, (total_delegate - total_deal_volume) * 17.28) + + not_deal_order_nos = delegate_order_nos - deal_order_nos + for x in not_deal_order_nos: + print("鏈垚浜わ細", x) -- Gitblit v1.8.0