From 15ee75f52d3258b14670d0487b36eae15a4e9dbc Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期四, 18 四月 2024 17:07:42 +0800
Subject: [PATCH] 共享内存/zeromq通信测试

---
 l2/l2_transaction_data_manager.py |  177 ++++++++++++++++++++++++++++++++++++----------------------
 1 files changed, 109 insertions(+), 68 deletions(-)

diff --git a/l2/l2_transaction_data_manager.py b/l2/l2_transaction_data_manager.py
index 147463e..d5ddc06 100644
--- a/l2/l2_transaction_data_manager.py
+++ b/l2/l2_transaction_data_manager.py
@@ -8,9 +8,10 @@
 from l2 import l2_log
 from l2.huaxin import l2_huaxin_util
 from l2.l2_data_util import local_today_sellno_map, local_today_datas
+from l2.place_order_single_data_manager import L2TradeSingleDataProcessor, L2TradeSingleDataManager
 
 from log_module import async_log_util
-from log_module.log import hx_logger_l2_transaction_desc, hx_logger_l2_transaction_sell_order
+from log_module.log import hx_logger_l2_transaction_desc, hx_logger_l2_transaction_sell_order, hx_logger_l2_active_sell
 
 from utils import tool
 
@@ -104,15 +105,17 @@
     # 鏈�杩戞墍鏈夌殑鍗栧崟
     __latest_all_sell_orders_dict = {}
 
+    # 淇濆瓨鏈�杩戞垚浜ょ殑浠锋牸
+    __latest_trade_price_dict = {}
+
+    __last_trade_data_dict = {}
+
     # 杩斿洖鏈�杩�1s鐨勫ぇ鍗曞崠锛�(鎬诲崠閲戦,[(鍗栧崟鍙�,鎬绘墜鏁�,浠锋牸,锛�'寮�濮嬫椂闂�',涔板崟鍙凤級,锛�'缁撴潫鏃堕棿',涔板崟鍙凤級),...])
     @classmethod
-    def add_transaction_datas(cls, code, datas, buy_exec_index=None):
+    def add_transaction_datas(cls, code, datas, limit_up_price=None):
         # 鏄惁涓轰富鍔ㄥ崠
-        def is_active_sell(sell_no):
-            if buy_exec_index is not None:
-                return sell_no > int(total_datas[buy_exec_index]["val"]["orderNo"])
-            else:
-                return f"{sell_no}" not in sell_no_map
+        def is_active_sell(sell_no, buy_no):
+            return sell_no > buy_no
 
         # q.append((data['SecurityID'], data['TradePrice'], data['TradeVolume'],
         #           data['OrderTime'], data['MainSeq'], data['SubSeq'], data['BuyNo'],
@@ -134,36 +137,64 @@
         total_datas = local_today_datas.get(code)
         if not sell_no_map:
             sell_no_map = {}
-        for d in datas:
-            cls.__latest_sell_order_info_list_dict[code].append(d)
-            if code not in cls.__latest_sell_order_dict:
-                cls.__latest_sell_order_dict[code] = [d[7], d[2], d[1], (d[3], d[6]), (d[3], d[6])]
-            else:
-                if cls.__latest_sell_order_dict[code][0] == d[7]:
-                    cls.__latest_sell_order_dict[code][1] += d[2]
-                    cls.__latest_sell_order_dict[code][2] = d[1]
-                    cls.__latest_sell_order_dict[code][4] = (d[3], d[6])
-                else:
-                    info = cls.__latest_sell_order_dict[code]
 
-                    # 涓婁釜鍗栧崟鎴愪氦瀹屾垚
-                    # 灏佸瓨鏁版嵁锛岃绠楁柊璧风偣
-                    # 澶т簬50w鐨勫崠鍗曟墠浼氫繚瀛�
-                    # 澶т簬50w鍔犲叆鍗栧崟
-                    cls.__latest_all_sell_orders_dict[code].append(info)
-                    money = info[1] * info[2]
-                    if money >= 500000:
-                        if is_active_sell(info[0]):
+        # 淇濆瓨鏈�杩戠殑鎴愪氦浠锋牸:(浠锋牸,鎴愪氦鏃堕棿)
+        cls.__latest_trade_price_dict[code] = (datas[-1][1], datas[-1][3])
+
+        L2TradeSingleDataProcessor.process_passive_limit_up_sell_data(code, datas, limit_up_price)
+
+        for d in datas:
+            # 鑾峰彇褰撳墠鏄惁涓轰富鍔ㄤ拱
+            try:
+                _is_active_sell = is_active_sell(d[7], d[6])
+                if not _is_active_sell:
+                    continue
+
+                if d[1] == limit_up_price:
+                    # 娑ㄥ仠涓诲姩鍗�
+                    L2TradeSingleDataProcessor.add_active_limit_up_sell_data(d)
+
+                # 鍒ゆ柇鏄惁鏄定鍋滆鍔ㄥ彉涓诲姩
+                last_trade_data = cls.__last_trade_data_dict.get(code)
+                if last_trade_data and not is_active_sell(last_trade_data[7], last_trade_data[6]) and last_trade_data[
+                    1] == limit_up_price:
+                    if d[1] == limit_up_price:
+                        # 娑ㄥ仠琚姩鍙樹富鍔�
+                        L2TradeSingleDataManager.set_sell_passive_to_active_datas(code, last_trade_data, d)
+                cls.__latest_sell_order_info_list_dict[code].append(d)
+                if code not in cls.__latest_sell_order_dict:
+                    cls.__latest_sell_order_dict[code] = [d[7], d[2], d[1], (d[3], d[6]), (d[3], d[6])]
+                else:
+                    if cls.__latest_sell_order_dict[code][0] == d[7]:
+                        cls.__latest_sell_order_dict[code][1] += d[2]
+                        cls.__latest_sell_order_dict[code][2] = d[1]
+                        cls.__latest_sell_order_dict[code][4] = (d[3], d[6])
+                    else:
+                        info = cls.__latest_sell_order_dict[code]
+
+                        # 涓婁釜鍗栧崟鎴愪氦瀹屾垚
+                        # 灏佸瓨鏁版嵁锛岃绠楁柊璧风偣
+                        # 澶т簬50w鐨勫崠鍗曟墠浼氫繚瀛�
+                        # 澶т簬50w鍔犲叆鍗栧崟
+                        money = info[1] * info[2]
+                        if money >= 500000:
+                            # 璁㈠崟閲岄潰鏈夋垚浜ゆ槸涓诲姩鍗栧氨绠椾富鍔ㄥ崠
                             l2_log.info(code, hx_logger_l2_transaction_sell_order,
                                         f"{cls.__latest_sell_order_dict[code]}")
                             cls.__big_sell_order_ids_dict[code].add(info[0])
                             cls.__big_sell_order_info_dict[code][info[0]] = info
                             cls.__big_sell_order_info_list_dict[code].append(info)
-                    # 鍙繚鐣�10w浠ヤ笂鐨勫崟
-                    if money > 100000:
-                        cls.__latest_all_sell_orders_dict[code].append(info)
+                        # 鍙繚鐣�10w浠ヤ笂鐨勫崟
+                        if money > 100000:
+                            cls.__latest_all_sell_orders_dict[code].append(info)
+                        if limit_up_price == info[2]:
+                            # 灏嗘定鍋滀富鍔ㄥ崠璁板叆鏃ュ織
+                            l2_log.info(code, hx_logger_l2_active_sell, f"{info}")
 
-                    cls.__latest_sell_order_dict[code] = [d[7], d[2], d[1], (d[3], d[6]), (d[3], d[6])]
+                        cls.__latest_sell_order_dict[code] = [d[7], d[2], d[1], (d[3], d[6]), (d[3], d[6])]
+            finally:
+                cls.__last_trade_data_dict[code] = d
+
         latest_time = l2_huaxin_util.convert_time(datas[-1][3], with_ms=True)
         min_time = tool.trade_time_add_millionsecond(latest_time, -1000)
         min_time_int = int(min_time.replace(":", "").replace(".", ""))
@@ -171,62 +202,72 @@
         total_big_sell_datas = cls.__big_sell_order_info_list_dict.get(code)
 
         total_sell_info = [0, None]  # 鎬昏祫閲�,寮�濮嬫垚浜や俊鎭�,缁撴潫鎴愪氦淇℃伅
-        latest_sell_order_info = cls.__latest_sell_order_dict[code]
-        big_sell_order_ids = cls.__big_sell_order_ids_dict[code]
-        # print("澶у崠鍗�", big_sell_order_ids)
-        big_sell_orders = []
-        temp_sell_order_ids = set()
-        # 缁熻宸茬粡缁撶畻鍑虹殑澶у崟
-        for i in range(len(total_big_sell_datas) - 1, -1, -1):
-            bd = total_big_sell_datas[i]
-            if min_time_int > int(
-                    l2_huaxin_util.convert_time(bd[3][0], with_ms=True).replace(":", "").replace(".", "")):
-                break
-            if bd[0] != latest_sell_order_info[0]:
-                # 涓嶆槸鏈�杩戠殑鎴愪氦涓斾笉鏄ぇ鍗曠洿鎺ヨ繃婊�
-                if bd[0] not in big_sell_order_ids:
-                    continue
+        latest_sell_order_info = cls.__latest_sell_order_dict.get(code)
+        if latest_sell_order_info:
+            # 涓嶆槸绗竴娆¢潪涓诲姩鍗栦笂浼�
+            big_sell_order_ids = cls.__big_sell_order_ids_dict[code]
+            # print("澶у崠鍗�", big_sell_order_ids)
+            big_sell_orders = []
+            temp_sell_order_ids = set()
+            # 缁熻宸茬粡缁撶畻鍑虹殑澶у崟
+            for i in range(len(total_big_sell_datas) - 1, -1, -1):
+                bd = total_big_sell_datas[i]
+                if min_time_int > int(
+                        l2_huaxin_util.convert_time(bd[3][0], with_ms=True).replace(":", "").replace(".", "")):
+                    break
+                if bd[0] != latest_sell_order_info[0]:
+                    # 涓嶆槸鏈�杩戠殑鎴愪氦涓斾笉鏄ぇ鍗曠洿鎺ヨ繃婊�
+                    if bd[0] not in big_sell_order_ids:
+                        continue
+                    else:
+                        if bd[0] not in temp_sell_order_ids:
+                            big_sell_orders.append(cls.__big_sell_order_info_dict[code].get(bd[0]))
+                            temp_sell_order_ids.add(bd[0])
                 else:
-                    if bd[0] not in temp_sell_order_ids:
-                        big_sell_orders.append(cls.__big_sell_order_info_dict[code].get(bd[0]))
-                        temp_sell_order_ids.add(bd[0])
-            else:
-                # 鏄渶杩戠殑浣嗕笉鏄ぇ鍗曢渶瑕佽繃婊�
-                if latest_sell_order_info[1] * latest_sell_order_info[2] < 500000:
-                    continue
-                else:
-                    if latest_sell_order_info[0] not in temp_sell_order_ids:
-                        big_sell_orders.append(latest_sell_order_info)
-                        temp_sell_order_ids.add(latest_sell_order_info[0])
+                    # 鏄渶杩戠殑浣嗕笉鏄ぇ鍗曢渶瑕佽繃婊�
+                    if latest_sell_order_info[1] * latest_sell_order_info[2] < 500000:
+                        continue
+                    else:
+                        if latest_sell_order_info[0] not in temp_sell_order_ids:
+                            big_sell_orders.append(latest_sell_order_info)
+                            temp_sell_order_ids.add(latest_sell_order_info[0])
 
-            # 缁熻鏈�杩�1s鐨勫ぇ鍗栧崟鏁版嵁
-            total_sell_info[0] += int(bd[1] * bd[2])
-        # 缁熻鏈�杩戠殑澶у崟
-        if latest_sell_order_info[1] * latest_sell_order_info[2] >= 500000:
-            if latest_sell_order_info[0] not in temp_sell_order_ids:
-                if is_active_sell(latest_sell_order_info[0]):
+                # 缁熻鏈�杩�1s鐨勫ぇ鍗栧崟鏁版嵁
+                total_sell_info[0] += int(bd[1] * bd[2])
+            # 缁熻鏈�杩戠殑澶у崟
+            if latest_sell_order_info[1] * latest_sell_order_info[2] >= 500000:
+                if latest_sell_order_info[0] not in temp_sell_order_ids:
+                    # if is_active_sell(latest_sell_order_info[0], latest_sell_order_info[3][1]):
                     big_sell_orders.append(latest_sell_order_info)
                     temp_sell_order_ids.add(latest_sell_order_info[0])
                     total_sell_info[0] += int(latest_sell_order_info[1] * latest_sell_order_info[2])
-        big_sell_orders.reverse()
-        total_sell_info[1] = big_sell_orders
+            big_sell_orders.reverse()
+            total_sell_info[1] = big_sell_orders
         return total_sell_info
 
     # 鑾峰彇鏈�杩戞垚浜ゆ暟鎹�
     @classmethod
-    def get_latest_transaction_datas(cls, code, min_sell_order_no=None):
+    def get_latest_transaction_datas(cls, code, min_sell_order_no=None, min_deal_time=None):
         total_orders = []
         sell_orders = cls.__latest_all_sell_orders_dict.get(code)
         if sell_orders:
             for i in range(len(sell_orders) - 1, -1, -1):
-                if min_sell_order_no and min_sell_order_no > sell_orders[i][0]:
+                if min_deal_time and tool.trade_time_sub(min_deal_time,
+                                                         l2_huaxin_util.convert_time(sell_orders[i][3][0])) > 0:
                     break
+
+                if min_sell_order_no and min_sell_order_no > sell_orders[i][0]:
+                    continue
                 total_orders.append(sell_orders[i])
-            total_orders.extend(sell_orders)
         if code in cls.__latest_sell_order_dict:
-            if min_sell_order_no :
+            if min_sell_order_no:
                 if cls.__latest_sell_order_dict[code][0] >= min_sell_order_no:
                     total_orders.append(cls.__latest_sell_order_dict[code])
             else:
                 total_orders.append(cls.__latest_sell_order_dict[code])
         return total_orders
+
+    # 鑾峰彇鏈�杩戞垚浜や环鏍间俊鎭�, 杩斿洖鏍煎紡锛氾紙浠锋牸,鏃堕棿锛�
+    @classmethod
+    def get_latest_trade_price_info(cls, code):
+        return cls.__latest_trade_price_dict.get(code)

--
Gitblit v1.8.0