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