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