From 892b50e242e3c59a738b92dfdfee1bf1ff8932f2 Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期五, 21 十月 2022 16:59:58 +0800
Subject: [PATCH] 新策略修改

---
 l2_trade_factor.py |  162 ++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 104 insertions(+), 58 deletions(-)

diff --git a/l2_trade_factor.py b/l2_trade_factor.py
index aa783ba..cda2229 100644
--- a/l2_trade_factor.py
+++ b/l2_trade_factor.py
@@ -18,53 +18,57 @@
             yi = 1
         return 5000000 + (yi - 1) * 500000
 
-    # 鑷敱娴侀�氬競鍊煎奖鍝嶆瘮渚�
-    @classmethod
-    def get_zylt_rate(cls, zyltgb):
-        yi = round(zyltgb / 100000000)
-        if yi < 1:
-            yi = 1
-        if yi <= 30:
-            rate = -0.04 + 0.01 * (yi - 1)
-            if rate > 0.1:
-                rate = 0.1
-        else:
-            rate = 0.09 - (yi - 31) * 0.002
-            if rate < -0.1:
-                rate = -0.1
-        return round(rate, 4)
-
     # 鑾峰彇琛屼笟褰卞搷姣斾緥
     # total_limit_percent涓虹粺璁$殑姣斾緥涔嬪拰涔樹互100
     @classmethod
     def get_industry_rate(cls, total_limit_percent):
         t = total_limit_percent / 10
-        rate = t / 0.5 * 0.02 + 0.26
-        if rate > 0.52:
-            rate = 0.52
-        return round(rate, 2)
+        if t < 0.9:
+            return 0
+        elif t <= 1.1:
+            return 0.2
+        elif t <= 1.6:
+            return 0
+        elif t <= 2.1:
+            return 0.03
+        elif t <= 2.6:
+            return 0.06
+        elif t <= 3.1:
+            return 0.09
+        elif t <= 3.6:
+            return 0.12
+        elif t <= 4.1:
+            return 0.15
+        elif t <= 4.6:
+            return 0.18
+        elif t <= 5.1:
+            return 0.21
+        elif t <= 5.6:
+            return 0.24
+        elif t <= 6.1:
+            return 0.27
+        else:
+            return 0.30
 
     # 鑾峰彇閲忓奖鍝嶆瘮渚�
     @classmethod
     def get_volumn_rate(cls, day60_max, yest, today):
         old_volumn = yest
-        base_rate = 0.49
         if day60_max > yest:
             old_volumn = day60_max
-            base_rate = 0.50
         r = round(today / old_volumn, 2)
+        if r < 0.01:
+            r = 0.01
         print("姣斾緥锛�", r)
         rate = 0
-        if r <= 0.25:
-            rate = base_rate - (r - 0.01) * 2
-        elif r <= 0.5:
-            rate = 0.25 - r + (0.01 if day60_max > yest else 0)
-        elif r < 0.75:
-            rate = r - 0.75 + (0.01 if day60_max > yest else 0)
-        elif r < 1.74:
-            rate = base_rate - (r - 0.75)
+        if r < 0.5:
+            rate = 0.3 - (r - 0.01)
+        elif r <= 0.75:
+            rate = -0.2 + (r - 0.5) * 2
+        elif r <= 1.35:
+            rate = 0.3 - (r - 0.75)
         else:
-            rate = base_rate - 0.99
+            rate = -0.3
         return round(rate, 4)
 
     # 褰撳墠鑲$エ棣栨娑ㄥ仠鏃堕棿鐨勫奖鍝嶆瘮渚�
@@ -74,36 +78,33 @@
         start_m = 9 * 60 + 30
         m = int(times[0]) * 60 + int(times[1])
         dif = m - start_m
-        base_rate = 0.5
+        base_rate = 0.3
         rate = 0
         if dif < 1:
             rate = base_rate
-        elif dif <= 5:
-            rate = base_rate - dif * 0.02
         elif dif <= 120:
             # 11:30涔嬪墠
-            rate = 0.39 - (dif - 6) * 0.004
+            rate = base_rate - dif * 0.0035
         else:
-            rate = 0.39 - (120 - 6) * 0.004 - (dif - 210 + 1) * 0.004
-            if rate < -0.5:
-                rate = -0.5
+            rate = base_rate - (dif - 89) * 0.0035
+            if rate < -0.3020:
+                rate = -0.3020
         return round(rate, 4)
 
     # 绾竾鎵嬪摜褰卞搷鍊硷紙鎵嬫暟銆�=9000 OR 閲戦銆�=500w锛�
     @classmethod
     def get_big_money_rate(cls, num):
-        if num < 0:
-            num = 0
-        if num >= 10:
-            return 0.5
-        else:
-            return round(num * 0.05, 2)
+        if num < 4:
+            return 0
+        rate = (num - 4) * 0.035 / 4 + 0.06
+        if rate > 0.9:
+            rate = 0.9
+        return round(rate, 4)
 
     @classmethod
     def compute_rate(cls, zyltgb, total_industry_limit_percent, volumn_day60_max, volumn_yest, volumn_today,
                      limit_up_time, big_money_num):
-        # 鑷敱娴侀�氳偂鏈奖鍝嶆瘮渚�
-        zyltgb_rate = cls.get_zylt_rate(zyltgb)
+
         # 琛屼笟娑ㄥ仠褰卞搷姣斾緥
         industry_rate = 0
         if total_industry_limit_percent is not None:
@@ -121,16 +122,23 @@
         if big_money_num is not None:
             big_money_rate = cls.get_big_money_rate(big_money_num)
         print(
-            "zyltgb_rate锛歿} industry_rate锛歿} volumn_rate锛歿} limit_up_time_rate锛歿} big_money_rate锛歿}".format(zyltgb_rate,
-                                                                                                            industry_rate,
-                                                                                                            volumn_rate,
-                                                                                                            limit_up_time_rate,
-                                                                                                            big_money_rate))
+            "industry_rate锛歿} volumn_rate锛歿} limit_up_time_rate锛歿} big_money_rate锛歿}".format(industry_rate,
+                                                                                             volumn_rate,
+                                                                                             limit_up_time_rate,
+                                                                                             big_money_rate))
 
-        return round(1 - (zyltgb_rate + industry_rate + volumn_rate + limit_up_time_rate + big_money_rate), 4)
+        final_rate = round(1 - (industry_rate + volumn_rate + limit_up_time_rate + big_money_rate), 4)
+        if final_rate < 0.1:
+            final_rate = 0.1
+        return final_rate
 
     @classmethod
     def compute_rate_by_code(cls, code):
+        factors = cls.__get_rate_factors(code)
+        return cls.compute_rate(factors[0], factors[1], factors[2], factors[3], factors[4], factors[5], factors[6])
+
+    @classmethod
+    def __get_rate_factors(cls, code):
         zyltgb = global_util.zyltgb_map.get(code)
         # 鑾峰彇琛屼笟鐑害
         industry = global_util.code_industry_map.get(code)
@@ -139,6 +147,11 @@
             industry = global_util.code_industry_map.get(code)
 
         total_industry_limit_percent = global_util.industry_hot_num.get(industry) if industry is not None else None
+        # 褰撳墠绁ㄦ槸鍚︽定鍋�
+        if total_industry_limit_percent is not None:
+            if code in global_util.limit_up_codes_percent:
+                total_industry_limit_percent -= global_util.limit_up_codes_percent[code]
+
         # 鑾峰彇閲�
         volumn_day60_max, volumn_yest, volumn_today = global_util.max60_volumn.get(
             code), global_util.yesterday_volumn.get(code), global_util.today_volumn.get(code)
@@ -154,8 +167,22 @@
         big_money_num = global_util.big_money_num.get(code)
         if big_money_num is None:
             big_money_num = big_money_num_manager.get_num(code)
-        return cls.compute_rate(zyltgb, total_industry_limit_percent, volumn_day60_max, volumn_yest, volumn_today,
-                                limit_up_time, big_money_num)
+        return (
+            zyltgb, total_industry_limit_percent, volumn_day60_max, volumn_yest, volumn_today, limit_up_time,
+            big_money_num)
+
+    @classmethod
+    def factors_to_string(cls, code):
+        vals = cls.__get_rate_factors(code)
+        return "zyltgb:%s, total_industry_limit_percent:%s, volumn_day60_max:%s, volumn_yest:%s, volumn_today:%s,limit_up_time:%s, big_money_num:%s" % vals
+
+    @classmethod
+    def __get_zyltgb(cls, code):
+        zyltgb = global_util.zyltgb_map.get(code)
+        if zyltgb is None:
+            global_util.load_zyltgb()
+            zyltgb = global_util.zyltgb_map.get(code)
+        return zyltgb
 
     @classmethod
     def compute_m_value(cls, code):
@@ -166,12 +193,24 @@
             if zyltgb is None:
                 print("娌℃湁鑾峰彇鍒拌嚜鐢辨祦閫氬競鍊�")
                 return 10000000
-        if code == '002476':
-            print("")
         zyltgb = cls.get_base_safe_val(zyltgb)
         rate = cls.compute_rate_by_code(code)
         # print("m鍊艰幏鍙栵細", code, round(zyltgb * rate))
         return round(zyltgb * rate)
+
+    # 鑾峰彇瀹夊叏绗旀暟
+    @classmethod
+    def get_safe_buy_count(cls, code):
+        gb = cls.__get_zyltgb(code)
+        if not gb:
+            # 榛樿10绗�
+            return 8
+        count = gb // 100000000
+        if count > 30:
+            return 30
+        if count < 5:
+            return 5
+        return count
 
 
 # l2鍥犲瓙褰掑洜鏁版嵁
@@ -191,7 +230,14 @@
 
 
 if __name__ == "__main__":
-    L2TradeFactorUtil.compute_m_value("000036")
-    # print(L2TradeFactorUtil.get_big_money_rate(1))
+    # print(L2TradeFactorUtil.get_rate_factors("003004"))
+    # print(L2TradeFactorUtil.factors_to_string("003004"))
+    print(L2TradeFactorUtil.get_limit_up_time_rate("09:30:30"))
+    print(L2TradeFactorUtil.get_limit_up_time_rate("11:30:00"))
+    print(L2TradeFactorUtil.get_limit_up_time_rate("13:00:00"))
+    print(L2TradeFactorUtil.get_limit_up_time_rate("13:48:00"))
+    print(L2TradeFactorUtil.get_limit_up_time_rate("13:53:23"))
+    print(L2TradeFactorUtil.get_limit_up_time_rate("14:23:23"))
+
     # print(L2TradeFactorUtil.get_big_money_rate(2))
     # print(L2TradeFactorUtil.get_big_money_rate(3))

--
Gitblit v1.8.0