From b92c5507bc73f043882ccf39fa5376686b4684d6 Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期五, 12 四月 2024 11:07:13 +0800
Subject: [PATCH] 新版深证下单完善

---
 l2/place_order_single_data_manager.py |   96 ++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 93 insertions(+), 3 deletions(-)

diff --git a/l2/place_order_single_data_manager.py b/l2/place_order_single_data_manager.py
index 9b37b6c..0446460 100644
--- a/l2/place_order_single_data_manager.py
+++ b/l2/place_order_single_data_manager.py
@@ -2,10 +2,12 @@
 涓嬪崟淇″彿绠$悊
 """
 from l2 import l2_log
+from l2.huaxin import l2_huaxin_util
 from log_module.log import logger_l2_trade_buy, logger_debug
+from utils import tool
 
 
-class L2TradeSingleManager:
+class L2TradeSingleDataProcessor:
     """
     L2閫愮瑪鎴愪氦鏁版嵁淇″彿绠$悊
     """
@@ -23,7 +25,6 @@
         @param data:
         @return:
         """
-        l2_log.info(code, logger_l2_trade_buy, f"娑ㄥ仠鍗栨暟鎹細{data['val']['orderNo']}")
         if code not in cls.__latest_limit_up_sell_list_dict:
             cls.__latest_limit_up_sell_list_dict[code] = []
         cls.__latest_limit_up_sell_list_dict[code].append(data)
@@ -69,15 +70,104 @@
                 else:
                     cls.__latest_sell_data[code] = [sell_no, data[2]]
             # 鍒ゆ柇鏄惁鏄渶鍚庝竴绗斿崠鍗�
+            l2_log.info(code, logger_l2_trade_buy, f"琚姩鍗栨暟鎹細{data}")
 
             # 鍒ゆ柇杩欎釜璁㈠崟鍙锋槸鍚︽垚浜ゅ畬
             sell_list = cls.__latest_limit_up_sell_list_dict.get(code)
             if not sell_list:
                 return
             sell_info = sell_list[-1]
+            l2_log.info(code, logger_l2_trade_buy, f"鏈�杩戞定鍋滃崠锛歿sell_info['val']['orderNo']}")
             if sell_no == sell_info['val']['orderNo'] and sell_info["val"]["num"] == cls.__latest_sell_data[code][
                 1] // 100:
                 # 鎴愪氦瀹屾垚
-                l2_log.info(code, logger_l2_trade_buy, f"鎵惧埌鏈�杩戠殑琚姩娑ㄥ仠鍗栧崟鏁版嵁锛歿data['val']['orderNo']}, 鍙互瑙﹀彂涓嬪崟")
+                L2TradeSingleDataManager.set_latest_sell_data(code, data)
+                logger_l2_trade_buy.info(f"{code}#鎵惧埌鏈�杩戠殑琚姩娑ㄥ仠鍗栧崟鏁版嵁锛歿data['val']['orderNo']}, 鍙互瑙﹀彂涓嬪崟")
+                # l2_log.info(code, logger_l2_trade_buy, f"鎵惧埌鏈�杩戠殑琚姩娑ㄥ仠鍗栧崟鏁版嵁锛歿data['val']['orderNo']}, 鍙互瑙﹀彂涓嬪崟")
         except Exception as e:
             logger_debug.exception(e)
+
+
+class L2TradeSingleDataManager:
+    TYPE_PASSIVE = 0
+    TYPE_ACTIVE = 1
+
+    """
+    涔板叆淇″彿绠$悊
+    """
+    # 鏈�杩戠殑娑ㄥ仠鍗栬鍔ㄦ垚浜ゆ暟鎹�
+    __latest_sell_data_dict = {}  # 鏍煎紡涓猴細{code:(閫愮瑪鎴愪氦鏁版嵁,鐢熸晥鏃堕棿锛堝甫ms锛�)}
+
+    # 鐢辫鍔ㄥ悜涓诲姩鍗栨垚浜よ浆鍙樼殑鏁版嵁
+    __latest_sell_active_deal_data_dict = {}  # 鏍煎紡涓猴細{code:(閫愮瑪鎴愪氦鏁版嵁,鐢熸晥鏃堕棿锛堝甫ms锛�)}
+
+    @classmethod
+    def set_latest_sell_data(cls, code, data):
+        """
+        璁剧疆鏈�杩戞垚浜ょ殑娑ㄥ仠鍗栬鍔ㄦ垚浜ゆ暟鎹�
+        @param code: 浠g爜
+        @param data: L2閫愮瑪鎴愪氦鏁版嵁  鏁版嵁鏍煎紡锛�(data['SecurityID'], data['TradePrice'], data['TradeVolume'],
+        #           data['OrderTime'], data['MainSeq'], data['SubSeq'], data['BuyNo'],
+        #           data['SellNo'], data['ExecType'])
+        @return:
+        """
+        deal_time = l2_huaxin_util.convert_time(data[3], True)
+        # 鐢熸晥鏃堕棿鍦�1s浠ュ唴
+        cls.__latest_sell_data_dict[code] = (data, tool.trade_time_add_millionsecond(deal_time, 1000))
+
+    @classmethod
+    def set_sell_passive_to_active_datas(cls, code, passive_data, active_data):
+        """
+        璁剧疆琚姩鍗栨垚浜ゅ悜涓诲姩鍗栨垚浜ょ殑杞彉鏁版嵁
+        @param code: 浠g爜
+        @param passive_data: 琚姩鍗栨垚浜ら�愮瑪
+        @param active_data: 涓诲姩鍗栨垚浜ら�愮瑪
+        @return:
+        """
+        deal_time = l2_huaxin_util.convert_time(passive_data[3], True)
+        # 鐢熸晥鏃堕棿鍦�1s浠ュ唴
+        cls.__latest_sell_active_deal_data_dict[code] = (
+            active_data, tool.trade_time_add_millionsecond(deal_time, 1000))
+
+    @classmethod
+    def get_valid_trade_single(cls, code, latest_time_with_ms):
+        """
+        鑾峰彇鏈夋晥鐨勬垚浜や笅鍗曚俊鍙�
+        @param code:
+        @param latest_time_with_ms:
+        @return: 锛堥�愮瑪鎴愪氦鏁版嵁, 绫诲瀷锛�
+        """
+        # 濡傛灉鏈夋渶杩戝崠娑ㄥ仠鎴愪氦瀹屽氨鐢ㄦ渶杩戠殑鏁版嵁
+        data = cls.__latest_sell_data_dict.get(code)
+        if data and tool.trade_time_sub_with_ms(latest_time_with_ms, data[1]) <= 0:
+            return data, cls.TYPE_PASSIVE
+        data = cls.__latest_sell_active_deal_data_dict.get(code)
+        if data and tool.trade_time_sub_with_ms(latest_time_with_ms, data[1]) <= 0:
+            return data, cls.TYPE_ACTIVE
+        return None
+
+    @classmethod
+    def is_can_place_order(cls, code, buy_data):
+        """
+        鏄惁鍙互涓嬪崟
+        @param code: 浠g爜
+        @param buy_data: L2閫愮瑪濮旀墭澶т簬50w鐨勪拱鍏ユ暟鎹�
+        @return: (鏄惁鍙互涓嬪崟, 鍘熷洜)
+        """
+        buy_data_time_with_ms = tool.to_time_with_ms(buy_data['val']['time'], buy_data['val']['tms'])
+        single = cls.get_valid_trade_single(code, buy_data_time_with_ms)
+        if not single:
+            return False, "娌℃湁鎵惧埌鍙敤淇″彿"
+        if single[0][6] < buy_data['val']['orderNo']:
+            # 淇″彿浣嶇疆鐨勬垚浜や拱鍗曞彿瑕佸皬浜庝拱鍏ユ暟鎹殑涔板崟鍙锋墠琛�
+            return True, f"鎵惧埌淇″彿锛歿single}"
+        else:
+            return False, f"涔板崟娌℃湁鍦ㄤ俊鍙蜂綅涔嬪悗 淇″彿锛歿single}"
+
+    @classmethod
+    def clear_data(cls, code):
+        if code in cls.__latest_sell_data_dict:
+            cls.__latest_sell_data_dict.pop(code)
+
+        if code in cls.__latest_sell_active_deal_data_dict:
+            cls.__latest_sell_active_deal_data_dict.pop(code)

--
Gitblit v1.8.0