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