From 2c707e6083d8d60b088a7f91a0020370e65c8c7f Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期二, 29 十月 2024 17:10:24 +0800
Subject: [PATCH] 昨日跌幅过大不扫入/添加日志记录

---
 trade/trade_result_manager.py         |   11 ++-
 code_attribute/code_nature_analyse.py |   30 ++++++++-
 trade/radical_buy_data_manager.py     |    9 ++
 code_attribute/gpcode_manager.py      |   18 +++++-
 servers/huaxin_trade_server.py        |    8 ++
 l2/l2_data_manager_new.py             |   75 +++++++++++++------------
 6 files changed, 101 insertions(+), 50 deletions(-)

diff --git a/code_attribute/code_nature_analyse.py b/code_attribute/code_nature_analyse.py
index 0984759..269b26a 100644
--- a/code_attribute/code_nature_analyse.py
+++ b/code_attribute/code_nature_analyse.py
@@ -220,8 +220,8 @@
     p11 = __is_latest_open_limit_up(code, record_datas, 5)
     # 90澶╁唴鏄惁鏈夋定鍋�
     p12 = __has_limit_up(code, record_datas, 90)
-    # 鏈�杩�5澶╂槸鍚﹁穼鍋�
-    p13 = __is_latest_limit_down(code, record_datas, 5)
+    # 涓婁釜浜ゆ槗鏃ユ槸鍚﹁穼骞呰繃澶�
+    p13 = __is_pre_day_limit_rate_too_low(code, record_datas)
     # 60涓氦鏄撴棩鏄惁鏇炬定鍋�
     p14 = __has_limited_up(code, record_datas, 60)
     # 鏄ㄦ棩鏄惁娑ㄥ仠杩�
@@ -578,6 +578,26 @@
     return False
 
 
+def __is_pre_day_limit_rate_too_low(code, datas):
+    """
+    涓婁釜浜ゆ槗鏃ユ槸鍚﹁穼骞呰繃澶�
+    @param code:
+    @param datas:
+    @return:
+    """
+    datas = copy.deepcopy(datas)
+    datas.sort(key=lambda x: x["bob"])
+    items = datas[-1:]
+    for item in items:
+        # 鏄惁鏈夎穼鍋�
+        # 鑾峰彇褰撴棩娑ㄥ箙
+        rate = (item["close"] - item["pre_close"])/item["pre_close"]
+        threshold_rate_ = round(0 - ((1 - tool.get_limit_down_rate(code))*0.9), 2)
+        if rate < threshold_rate_:
+            return True
+    return False
+
+
 # V瀛楀舰
 def __is_v_model(code, datas):
     datas = copy.deepcopy(datas)
@@ -738,6 +758,6 @@
 
 
 if __name__ == "__main__":
-    HighIncreaseCodeManager().add_code("000333")
-    print(HighIncreaseCodeManager().is_in("000333"))
-    print(HighIncreaseCodeManager().is_in("000222"))
+    code = "000333"
+    threshold_rate = 0 - ((1 - tool.get_limit_down_rate(code)) * 0.9)
+    print(threshold_rate)
diff --git a/code_attribute/gpcode_manager.py b/code_attribute/gpcode_manager.py
index 98f25de..64bd83d 100644
--- a/code_attribute/gpcode_manager.py
+++ b/code_attribute/gpcode_manager.py
@@ -22,6 +22,17 @@
 class CodesNameManager:
     __mysqldb = Mysqldb()
     __code_name_dict = {}
+    __instance = None
+
+    def __new__(cls, *args, **kwargs):
+        if not cls.__instance:
+            cls.__instance = super(CodesNameManager, cls).__new__(cls, *args, **kwargs)
+            cls.__load_data()
+        return cls.__instance
+
+    @classmethod
+    def __load_data(cls):
+        cls.__code_name_dict = cls.list_code_name_dict()
 
     @classmethod
     def list_code_name_dict(cls):
@@ -98,6 +109,7 @@
 # 鎯宠涔扮殑浠g爜
 class WantBuyCodesManager:
     __instance = None
+    __db = 0
     redisManager = redis_manager.RedisManager(0)
     __redis_key = "want_buy_codes"
 
@@ -126,7 +138,7 @@
 
     def remove_code(self, code):
         self.__want_buy_codes_cache.discard(code)
-        RedisUtils.srem(self.__get_redis(), self.__redis_key, code)
+        RedisUtils.srem_async(self.__db, self.__redis_key, code)
 
     def sync(self):
         codes = self.list_code()
@@ -397,7 +409,7 @@
 
     def remove_code(self, code):
         self.__codes_set.discard(code)
-        RedisUtils.srem(self.__get_redis(), "green-trade-codes", code)
+        RedisUtils.srem_async(self.__db, "green-trade-codes", code)
 
     def is_in(self, code):
         return RedisUtils.sismember(self.__get_redis(), "green-trade-codes", code)
@@ -532,7 +544,7 @@
 
 # 鑾峰彇浠g爜鐨勫悕绉�
 def get_code_name(code):
-    return CodesNameManager.get_code_name(code)
+    return CodesNameManager().get_code_name(code)
 
 
 def get_name_codes():
diff --git a/l2/l2_data_manager_new.py b/l2/l2_data_manager_new.py
index a93f09d..1f6c604 100644
--- a/l2/l2_data_manager_new.py
+++ b/l2/l2_data_manager_new.py
@@ -724,7 +724,8 @@
             return False, True, f"14:57鍚庝笉鑳戒氦鏄�", True
 
         if cls.__TradeTargetCodeModeManager.get_mode_cache() == TradeTargetCodeModeManager.MODE_ONLY_BUY_WANT_CODES:
-            if not cls.__WantBuyCodesManager.is_in_cache(code) and not gpcode_manager.GreenListCodeManager().is_in_cache(code):
+            if not cls.__WantBuyCodesManager.is_in_cache(
+                    code) and not gpcode_manager.GreenListCodeManager().is_in_cache(code):
                 return False, True, f"鍙拱鎯充拱锛氭病鍦ㄦ兂涔板崟鍜岀豢鍗�", True
 
         return True, False, f"", False
@@ -1156,10 +1157,7 @@
         k_format = code_nature_analyse.CodeNatureRecordManager().get_k_format_cache(code)
         # 鏄惁鏈夎鲸璇嗗害
         is_special = True if k_format and k_format[8][0] else False
-        # 涓�5涓氦鏄撴棩鏈夌偢鏉夸箣鍚�
-        has_open_limit_up_in_5 = True if k_format and len(k_format) >= 11 and k_format[10] else False
-        # 涓�5涓氦鏄撴棩鏈夎穼鍋�
-        has_limit_down_in_5 = True if k_format and len(k_format) >= 13 and k_format[12] else False
+
         # 鏄惁鏄己鍔�10鍒嗛挓
         is_in_strong_time = now_timestamp <= int("094000")
         # 鏄惁鏄己鍔�30鍒嗛挓
@@ -1519,7 +1517,7 @@
                                                      max_num_set=set(),
                                                      buy_volume_rate=buy_volume_rate,
                                                      mode=OrderBeginPosInfo.MODE_RADICAL,
-                                                     mode_desc="鎬绘姏鍘嬪皬鎵叆",
+                                                     mode_desc=f"鎬绘姏鍘嬪皬鎵叆",
                                                      sell_info=sell_info,
                                                      threshold_money=threshold_money)
             order_begin_pos_info.at_limit_up = cls.__is_at_limit_up_buy(code)
@@ -1933,43 +1931,48 @@
         @param end_index:
         @return: (鏄惁鑾峰彇鍒颁俊鍙�, 淇″彿浣嶇疆, 娑堟伅)
         """
+
         # 婵�杩涗拱淇″彿鐨勬椂闂�
+
+        def __can_order():
+            # 鍒ゆ柇鏄惁鏄澘涓婃斁閲�
+            if cls.__is_at_limit_up_buy(code, start_index):
+                return False, None, "鏉夸笂鏀鹃噺"
+            total_datas = local_today_datas[code]
+            min_num = int(29900 / gpcode_manager.get_limit_up_price_as_num(code))
+            # 濡傛灉鏈夊ぇ鍗曟垚浜ゅ氨涓嶉渶瑕佺湅澶у崟
+            deal_money_list = BigOrderDealManager().get_total_buy_money_list(code)
+            if deal_money_list:
+                for m in deal_money_list:
+                    if m >= 2990000:
+                        min_num = int(5000 / gpcode_manager.get_limit_up_price_as_num(code))
+                        break
+
+            single_index = None
+            for i in range(start_index, end_index + 1):
+                data = total_datas[i]
+                val = data["val"]
+                if not L2DataUtil.is_limit_up_price_buy(val):
+                    continue
+                if val["num"] < min_num:
+                    continue
+                if int(val["orderNo"]) <= radical_data[1]:
+                    # 涓诲姩涔板崟鍚庣殑鏁版嵁涓嶇畻
+                    continue
+                single_index = i
+                break
+            if single_index is not None:
+                return True, single_index, "鏈夊ぇ鍗�"
+            return False, None, "鏃犲ぇ鍗�"
 
         radical_data = RadicalBuyDealCodesManager.buy_by_l2_delegate_expire_time_dict.get(code)
         if not radical_data:
             return False, None, "涓嶆弧瓒虫縺杩涗拱鐨勬潯浠�"
         if t.time() > radical_data[0]:
             return False, None, "瓒呰繃鐢熸晥鏃堕棿"
-
-        # 鍒ゆ柇鏄惁鏄澘涓婃斁閲�
-        if cls.__is_at_limit_up_buy(code, start_index):
-            return False, None, "鏉夸笂鏀鹃噺"
-        total_datas = local_today_datas[code]
-        min_num = int(29900 / gpcode_manager.get_limit_up_price_as_num(code))
-        # 濡傛灉鏈夊ぇ鍗曟垚浜ゅ氨涓嶉渶瑕佺湅澶у崟
-        deal_money_list = BigOrderDealManager().get_total_buy_money_list(code)
-        if deal_money_list:
-            for m in deal_money_list:
-                if m >= 2990000:
-                    min_num = int(5000 / gpcode_manager.get_limit_up_price_as_num(code))
-                    break
-
-        single_index = None
-        for i in range(start_index, end_index + 1):
-            data = total_datas[i]
-            val = data["val"]
-            if not L2DataUtil.is_limit_up_price_buy(val):
-                continue
-            if val["num"] < min_num:
-                continue
-            if int(val["orderNo"]) <= radical_data[1]:
-                # 涓诲姩涔板崟鍚庣殑鏁版嵁涓嶇畻
-                continue
-            single_index = i
-            break
-        if single_index is not None:
-            return True, single_index, "鏈夊ぇ鍗�"
-        return False, None, "鏃犲ぇ鍗�"
+        result = __can_order()
+        l2_log.debug(code, f"L2鎵叆鍒ゆ柇锛歿result}")
+        return result
 
     @classmethod
     def test__compute_active_order_begin_pos(cls, code, continue_count, start_index, end_index):
diff --git a/servers/huaxin_trade_server.py b/servers/huaxin_trade_server.py
index b688be3..88940e2 100644
--- a/servers/huaxin_trade_server.py
+++ b/servers/huaxin_trade_server.py
@@ -18,7 +18,7 @@
 from cancel_strategy.s_l_h_cancel_strategy import SCancelBigNumComputer
 from code_attribute import gpcode_manager, code_volumn_manager, global_data_loader, zyltgb_util, code_nature_analyse
 from code_attribute.code_l1_data_manager import L1DataManager
-from code_attribute.gpcode_manager import CodePrePriceManager
+from code_attribute.gpcode_manager import CodePrePriceManager, CodesNameManager
 from huaxin_client import l2_data_transform_protocol
 from huaxin_client.trade_transform_protocol import TradeResponse
 from l2 import l2_data_manager_new, l2_log, code_price_manager, l2_data_util, transaction_progress, \
@@ -232,6 +232,7 @@
                         # 鑾峰彇level1鐨勪唬鐮�
                         list_ = JueJinApi.get_exchanges_codes(["SHSE", "SZSE"])
                         fdatas = []
+                        code_name_map = {}
                         for d in list_:
                             if not tool.is_target_code(d["sec_id"]):
                                 continue
@@ -244,6 +245,11 @@
                                     days=100)).timestamp() > datetime.datetime.now().timestamp():
                                 continue
                             fdatas.append(d["sec_id"])
+                            code_name_map[d["sec_id"]] = d["sec_name"]
+                        # 淇濆瓨浠g爜鍚嶇О
+                        for k in code_name_map:
+                            CodesNameManager.add_code_name(k, code_name_map[k])
+
                         sk.sendall(
                             socket_util.load_header(json.dumps({"code": 0, "data": fdatas}).encode(encoding='utf-8')))
 
diff --git a/trade/radical_buy_data_manager.py b/trade/radical_buy_data_manager.py
index 8aaa89a..e68e42a 100644
--- a/trade/radical_buy_data_manager.py
+++ b/trade/radical_buy_data_manager.py
@@ -50,8 +50,13 @@
             zyltgb_as_yi = round(zyltgb / 100000000, 2)
             if zyltgb_as_yi > constant.MAX_CODE_RADICAL_BUY_ZYLTGB_AS_YI:
                 return False, "鑷敱娴侀�氬競鍊艰繃澶�"
-            elif  zyltgb_as_yi < constant.MIN_CODE_RADICAL_BUY_ZYLTGB_AS_YI:
+            elif zyltgb_as_yi < constant.MIN_CODE_RADICAL_BUY_ZYLTGB_AS_YI:
                 return False, "鑷敱娴侀�氬競鍊艰繃灏�"
+        # 鍒ゆ柇鏄ㄦ棩鏄惁璺屽箙杩囧ぇ
+        k_format = code_nature_analyse.CodeNatureRecordManager().get_k_format_cache(code)
+        if k_format and len(k_format) > 12 and k_format[12]:
+            return False, "涓婁釜浜ゆ槗鏃ヨ穼骞呰繃澶�"
+
         if gpcode_manager.BlackListCodeManager().is_in_cache(code):
             if deal_codes is not None and code in deal_codes:
                 pass
@@ -93,7 +98,7 @@
             cls.__deal_big_order_nos_dict[code].clear()
 
     @classmethod
-    def add_big_buy_order_deal(cls, code, order_nos:list):
+    def add_big_buy_order_deal(cls, code, order_nos: list):
         if code not in cls.__deal_big_order_nos_dict:
             cls.__deal_big_order_nos_dict[code] = set()
         for order_no in order_nos:
diff --git a/trade/trade_result_manager.py b/trade/trade_result_manager.py
index 71c454e..86d164f 100644
--- a/trade/trade_result_manager.py
+++ b/trade/trade_result_manager.py
@@ -4,7 +4,7 @@
 from cancel_strategy.s_l_h_cancel_strategy import HourCancelBigNumComputer
 from cancel_strategy.s_l_h_cancel_strategy import LCancelBigNumComputer
 from cancel_strategy.s_l_h_cancel_strategy import SCancelBigNumComputer
-from code_attribute.gpcode_manager import MustBuyCodesManager, GreenListCodeManager
+from code_attribute.gpcode_manager import MustBuyCodesManager, GreenListCodeManager, WantBuyCodesManager
 from l2 import l2_data_manager, place_order_single_data_manager
 from l2.cancel_buy_strategy import FCancelBigNumComputer, \
     NewGCancelBigNumComputer, JCancelBigNumComputer, NBCancelBigNumComputer
@@ -142,7 +142,11 @@
         __latest_cancel_l2_data_dict[code] = total_datas[-1]
 
     # 鎾ゅ崟鎴愬姛闇�瑕佺Щ闄ょ孩鍚嶅崟
-    if not GreenListCodeManager().is_in_cache(code):
+    if GreenListCodeManager().is_in_cache(code):
+        GreenListCodeManager().remove_code(code)
+        if WantBuyCodesManager().is_in_cache(code):
+            WantBuyCodesManager().remove_code(code)
+    if MustBuyCodesManager().is_in_cache(code):
         MustBuyCodesManager().remove_code(code)
 
 
@@ -151,7 +155,8 @@
     if code not in __latest_cancel_l2_data_dict:
         return True
     threshold_time_space = buy_condition_util.get_cancel_and_buy_space_time(code)
-    if L2DataUtil.time_sub_as_ms(buy_exec_data["val"], __latest_cancel_l2_data_dict[code]["val"]) >= threshold_time_space:
+    if L2DataUtil.time_sub_as_ms(buy_exec_data["val"],
+                                 __latest_cancel_l2_data_dict[code]["val"]) >= threshold_time_space:
         return True
     return False
 

--
Gitblit v1.8.0