From fd088787bc52e93bbce8f6aeb080fa8f472015aa Mon Sep 17 00:00:00 2001
From: Administrator <admin@example.com>
Date: 星期一, 09 六月 2025 18:13:07 +0800
Subject: [PATCH] 功能完善

---
 strategy/test.py                      |    8 +-
 strategy/低吸脚本_辨识度_v6.py               |    2 
 third_data/history_k_data_util.py     |    5 +
 strategy/time_series_backtest.py      |    2 
 strategy/strategy_variable_factory.py |    2 
 strategy/strategy_params_settings.py  |    2 
 api/outside_api_callback.py           |   66 +++++++++++++++++++---
 strategy/env_info.py                  |   14 ++++
 third_data/history_k_data_manager.py  |   46 +++++++++++++++
 9 files changed, 128 insertions(+), 19 deletions(-)

diff --git a/api/outside_api_callback.py b/api/outside_api_callback.py
index fb743cf..529a7e5 100644
--- a/api/outside_api_callback.py
+++ b/api/outside_api_callback.py
@@ -1,10 +1,14 @@
 import json
 import logging
+import threading
 
 from api.outside_api_command_manager import ActionCallback
 from huaxin_client.client_network import SendResponseSkManager
-from strategy import strategy_params_settings
-from utils import socket_util, middle_api_protocol
+from strategy import strategy_params_settings, env_info
+from strategy.env_info import RealTimeEnvInfo
+from strategy.strategy_variable_factory import DataLoader
+from third_data.history_k_data_manager import TradeDateManager
+from utils import socket_util, middle_api_protocol, tool
 
 
 class MyAPICallback(ActionCallback):
@@ -40,21 +44,65 @@
         @return:
         """
         result = strategy_params_settings.settings.to_json_str()
-        return json.dumps({"code": 0, "data": result})
+        return {"code": 0, "data": result}
 
     def __on_get_env(self):
         """
         鑾峰彇鐜淇℃伅
         @return:
         """
-        return json.dumps({"code": 0, "data": {}, "msg": "娴嬭瘯缁撴灉"})
+        fdata = {}
+        # 瀹炴椂鏁版嵁
+        fdata["real_time_data"] = RealTimeEnvInfo().to_dict()
+        # 鍘嗗彶鏁版嵁
+        fdata["history_data"] = {}
+        if tool.get_now_time_str() < '16:00:00':
+            # 濡傛灉鍦�16:00涔嬪墠閲囩敤褰撳墠鏃ユ湡
+            day = tool.get_now_date_str()
+        else:
+            # 濡傛灉鍦�16:00涔嬪悗閲囩敤涓嬩竴涓氦鏄撴棩
+            day = TradeDateManager().get_next_trade_day(tool.get_now_date_str())
+        fdata["history_data"]["leading_limit_up_block_codes_count"] = env_info.get_leading_limit_up_block_codes_count(
+            day)
+
+        if tool.get_now_time_str() < '16:00:00':
+            # 濡傛灉鍦�16:00涔嬪墠閲囩敤褰撳墠鏃ユ湡
+            day = TradeDateManager().get_previous_trade_day(tool.get_now_date_str())
+        else:
+            # 濡傛灉鍦�16:00涔嬪悗閲囩敤涓嬩竴涓氦鏄撴棩
+            day = tool.get_now_date_str()
+        fdata["history_data"]["k_bars_count"] = env_info.get_history_k_bars(day)
+        return {"code": 0, "data": fdata, "msg": "娴嬭瘯缁撴灉"}
+
+    def __on_update_leading_limit_up_datas(self):
+        """
+        鏇存柊棰嗘定浠g爜淇℃伅
+        @return:
+        """
+
+        def update():
+            plates = __DataLoader.get_limit_up_reasons_with_plate_code()
+            for p in plates:
+                print(p)
+                __DataLoader.load_plate_codes(p[0], p[1])
+
+        if tool.get_now_time_str() < '16:00:00':
+            # 濡傛灉鍦�16:00涔嬪墠閲囩敤褰撳墠鏃ユ湡
+            day = tool.get_now_date_str()
+        else:
+            # 濡傛灉鍦�16:00涔嬪悗閲囩敤涓嬩竴涓氦鏄撴棩
+            day = TradeDateManager().get_next_trade_day(tool.get_now_date_str())
+        __DataLoader = DataLoader(day)
+        threading.Thread(target=lambda: update(), daemon=True).start()
+        return {"code": 0}
 
     def OnCommonRequest(self, client_id, request_id, data):
         ctype = data["ctype"]
-        result_str = ''
+        result_json = {}
         if ctype == "get_settings":
-            result_str = self.__on_get_settings()
+            result_json = self.__on_get_settings()
         elif ctype == 'get_env':
-            result_str = self.__on_get_env()
-
-        self.send_response(result_str, client_id, request_id)
+            result_json = self.__on_get_env()
+        elif ctype == 'update_leading_limit_up_datas':
+            result_json = self.__on_update_leading_limit_up_datas()
+        self.send_response(result_json, client_id, request_id)
diff --git a/strategy/env_info.py b/strategy/env_info.py
index 8a9bf4f..b4129bd 100644
--- a/strategy/env_info.py
+++ b/strategy/env_info.py
@@ -1,6 +1,8 @@
 """
 鐜淇℃伅
 """
+import json
+
 from strategy.strategy_variable_factory import DataLoader
 from third_data.history_k_data_manager import HistoryKDataManager
 from utils import tool
@@ -22,6 +24,18 @@
         # Tick鏁版嵁(鏇存柊鏃堕棿, 鏁版嵁鏁伴噺)
         self.ticks = ('', 0)
 
+    def to_dict(self):
+        d = self.__dict__
+        return d
+
+    @classmethod
+    def to_obj(cls, json_str):
+        result = json.loads(json_str)
+        obj = RealTimeEnvInfo()
+        for k in result:
+            setattr(obj, k, result[k])
+        return obj
+
 
 def get_leading_limit_up_block_codes_count(day):
     """
diff --git a/strategy/strategy_params_settings.py b/strategy/strategy_params_settings.py
index c7048dd..dd86b73 100644
--- a/strategy/strategy_params_settings.py
+++ b/strategy/strategy_params_settings.py
@@ -49,7 +49,7 @@
         # 鏄惁鍙拱浠婃棩娑ㄥ仠杩囩殑绁�
         self.can_buy_limited_up = False
         # 鏈�浣庡紑鐩樻定骞�
-        self.min_open_rate = -0.02
+        self.min_open_rate = -0.21
         # 鍙拱鐨勬定骞呮瘮渚�
         self.avaiable_rates = (-0.03, 0.07)
         # 浠婃棩娑ㄥ仠浠烽渶绐佺牬XX鏃ユ渶楂樹环,None琛ㄧず姝ゆ潯鏁版嵁涓嶇敓鏁�
diff --git a/strategy/strategy_variable_factory.py b/strategy/strategy_variable_factory.py
index 3f674ae..4409b12 100644
--- a/strategy/strategy_variable_factory.py
+++ b/strategy/strategy_variable_factory.py
@@ -420,6 +420,8 @@
         """
         datas = self.load_all_codes_of_plates(is_for_buy=True)
         fdata = {}
+        if not datas:
+            return fdata
         for plate_code in datas:
             plate_name = datas[plate_code][0]
             codes_info = datas[plate_code][1]
diff --git a/strategy/test.py b/strategy/test.py
index 7654d94..8f80074 100644
--- a/strategy/test.py
+++ b/strategy/test.py
@@ -18,10 +18,8 @@
 
 
 if __name__ == "__main__":
-    print("======2涓エ娑ㄥ仠涔嬪悗涔�")
-    statistic_average(r"C:\Users\Administrator\Desktop\2涓エ娑ㄥ仠涔嬪悗涔�.txt")
-    print("======3涓エ娑ㄥ仠涔嬪悗涔�")
+    print("======3涓エ娑ㄥ仠涔嬪悗涔�+寮�鐩樹环>=-3")
     statistic_average(r"C:\Users\Administrator\Desktop\3涓エ娑ㄥ仠涔嬪悗涔�.txt")
-    print("======4涓エ娑ㄥ仠涔嬪悗涔�")
-    statistic_average(r"C:\Users\Administrator\Desktop\4涓エ娑ㄥ仠涔嬪悗涔�.txt")
+    print("======3涓エ娑ㄥ仠涔嬪悗涔�+寮�鐩樹环>=-2")
+    statistic_average(r"C:\Users\Administrator\Desktop\3涓エ娑ㄥ仠涔嬪悗涔癬寮�鐩樻定骞�-2浠ヤ笂.txt")
 
diff --git a/strategy/time_series_backtest.py b/strategy/time_series_backtest.py
index 9701205..97215ee 100644
--- a/strategy/time_series_backtest.py
+++ b/strategy/time_series_backtest.py
@@ -780,7 +780,7 @@
 if __name__ == "__main__":
     back_test_dict = {}
     # days = ["2025-05-06", "2025-05-07", "2025-05-08", "2025-05-09", "2025-05-12", "2025-05-13", "2025-05-14",
-    #         "2025-05-15", "2025-05-16"]
+    #         "2025-05-15", "2025-05-16", "2025-05-19", "2025-05-20"]
     days = ["2025-05-12", "2025-05-13", "2025-05-14", "2025-05-15", "2025-05-16", "2025-05-19", "2025-05-20",
             "2025-05-21", "2025-05-22", "2025-05-23", "2025-05-26", "2025-05-27", "2025-05-28", "2025-05-29",
             "2025-05-30", "2025-06-03", "2025-06-04", "2025-06-05", "2025-06-06", "2025-06-09"]
diff --git "a/strategy/\344\275\216\345\220\270\350\204\232\346\234\254_\350\276\250\350\257\206\345\272\246_v6.py" "b/strategy/\344\275\216\345\220\270\350\204\232\346\234\254_\350\276\250\350\257\206\345\272\246_v6.py"
index e05a88f..8757c61 100644
--- "a/strategy/\344\275\216\345\220\270\350\204\232\346\234\254_\350\276\250\350\257\206\345\272\246_v6.py"
+++ "b/strategy/\344\275\216\345\220\270\350\204\232\346\234\254_\350\276\250\350\257\206\345\272\246_v6.py"
@@ -142,7 +142,7 @@
 
     limit_up_codes_count = max([(p, len(sv.寮�鐩樺暒鏈�姝f澘鍧楁定鍋�.get(p, []))) for p in can_buy_plates], key=lambda x: x[1])[1]
 
-    threshold_money *= max(10 - limit_up_codes_count + 1, 5)/10
+    threshold_money *= max(min(10 - limit_up_codes_count + 3, 10), 5)/10
 
     # print(target_code, sv.鑷敱娴侀�氬競鍊�, threshold_money, limit_up_codes_count)
 
diff --git a/third_data/history_k_data_manager.py b/third_data/history_k_data_manager.py
index cb995d5..3df8182 100644
--- a/third_data/history_k_data_manager.py
+++ b/third_data/history_k_data_manager.py
@@ -11,6 +11,7 @@
 from huaxin_client import l1_subscript_codes_manager
 from log_module.log import logger_debug
 from third_data import history_k_data_util
+from third_data.history_k_data_util import HistoryKDatasUtils
 from utils import tool, init_data_util
 
 
@@ -186,5 +187,48 @@
         return codes
 
 
+@tool.singleton
+class TradeDateManager:
+    # {"鏃ユ湡":鏃ユ湡鍒楄〃}
+    __date_list_dict = {}
+    """
+    浜ゆ槗鏃ユ湡绠$悊
+    """
+
+    def __load_dates(self, now_day):
+        if self.__date_list_dict.get(now_day):
+            return
+        # 鑾峰彇鍓嶅悗涓�涓湀鐨勪氦鏄撴棩鏈�
+        start_date = tool.date_sub(now_day, 30)
+        end_date = tool.date_sub(now_day, -30)
+        dates = HistoryKDatasUtils.get_trading_dates(start_date, end_date)
+        self.__date_list_dict[now_day] = dates
+
+    def get_next_trade_day(self, now_day):
+        """
+        鑾峰彇涓嬩竴涓氦鏄撴棩
+        @param now_day:
+        @return:
+        """
+        self.__load_dates(now_day)
+        for day in self.__date_list_dict[now_day]:
+            if day > now_day:
+                return day
+        return None
+
+    def get_previous_trade_day(self, now_day):
+        """
+        鑾峰彇涓婁竴涓氦鏄撴棩
+        @param now_day:
+        @return:
+        """
+        self.__load_dates(now_day)
+        for day in reversed(self.__date_list_dict[now_day]):
+            if day < now_day:
+                return day
+        return None
+
+
 if __name__ == "__main__":
-    print(HistoryKDataManager().get_history_bars_codes("2024-12-31"))
+    print(TradeDateManager().get_next_trade_day("2025-06-09"))
+    print(TradeDateManager().get_previous_trade_day("2025-06-09"))
diff --git a/third_data/history_k_data_util.py b/third_data/history_k_data_util.py
index a24ffc5..bc1c44a 100644
--- a/third_data/history_k_data_util.py
+++ b/third_data/history_k_data_util.py
@@ -390,7 +390,10 @@
 
     @classmethod
     def get_trading_dates(cls, start_date, end_date):
-        return hx_qc_value_util.get_trade_calendar(start_date, end_date)
+        if constant.is_windows():
+            return JueJinApi.get_trading_dates(start_date, end_date)
+        else:
+            return hx_qc_value_util.get_trade_calendar(start_date, end_date)
 
     @classmethod
     def get_now_price(cls, codes):

--
Gitblit v1.8.0