From bb2c567db00cc12b16808fc71bbb4c91615d110b Mon Sep 17 00:00:00 2001 From: Administrator <admin@example.com> Date: 星期一, 30 六月 2025 17:20:18 +0800 Subject: [PATCH] bug修复/策略完善 --- server/local_data_server.py | 71 +++++++++++++++++++++++++++++++++++ 1 files changed, 70 insertions(+), 1 deletions(-) diff --git a/server/local_data_server.py b/server/local_data_server.py index a48e96e..e9b3684 100644 --- a/server/local_data_server.py +++ b/server/local_data_server.py @@ -2,19 +2,30 @@ 鏈湴http鏈嶅姟鍣� """ import json +import threading +import uuid from http.server import SimpleHTTPRequestHandler, HTTPServer import urllib.parse as urlparse from urllib.parse import parse_qs import constant +from code_attribute import gpcode_manager from db.mysql_data_delegate import Mysqldb from strategy.data.data_manager import LowSuctionOriginDataExportManager +from strategy.strategy_variable_factory import DataLoader +from strategy.time_series_backtest import BackTest from third_data import kpl_util from utils import tool, output_util, huaxin_util +# 姝e湪杩愯鐨勫洖娴嬩换鍔″瓧鍏� +running_task_dict = {} + class CORSRequestHandler(SimpleHTTPRequestHandler): + # 鏁版嵁鍔犺浇瀛楀吀 + __data_loader_dict = {} + def end_headers(self): # 娣诲姞 CORS 澶� self.send_header('Access-Control-Allow-Origin', '*') @@ -146,9 +157,67 @@ sql = f" select code, jx_blocks from kpl_code_blocks where day = '{date}' and " + " and ".join( [f"jx_blocks like '%{p}%'" for p in plates]) datas = Mysqldb().select_all(sql) - fdatas = [(x[0], "銆�".join([ f"<red>{dd}</red>" if dd in plates else dd for dd in json.loads(x[1])])) for x in datas if len(set(json.loads(x[1])) & plates) == len(plates)] + fdatas = [(x[0], gpcode_manager.get_code_name(x[0]), + "銆�".join([f"<red>{dd}</red>" if dd in plates else dd for dd in json.loads(x[1])])) for x in + datas if len(set(json.loads(x[1])) & plates) == len(plates)] response_data = json.dumps({"code": 0, "data": fdatas}) + elif url.path == "/get_codes_by_limit_up_count": + # 鏍规嵁绮鹃�夋澘鍧楄幏鍙栦唬鐮� + plates = ps_dict.get("plates") + date = ps_dict.get("date") + plates = set(json.loads(plates)) + if date not in self.__data_loader_dict: + self.__data_loader_dict[date] = DataLoader(date) + + dates = set(self.__data_loader_dict.keys()) + dates.discard(date) + for d in dates: + self.__data_loader_dict.pop(d) + results = self.__data_loader_dict[date].load_target_plate_and_codes() + codes = set() + for p in plates: + codes |= set(results.get(p)) + fdatas = [(code, gpcode_manager.get_code_name(code)) for code in codes] + response_data = json.dumps({"code": 0, "data": fdatas}) + + elif url.path == "/start_run_backtest": + def run_backtest(task_id): + __back_test = BackTest(date, r"D:\workspace\trade_low_suction\strategy\strategy_script_v6.py", + target_codes=codes) + running_task_dict[task_id] = __back_test + __back_test.run() + + date = ps_dict.get("date") + codes = ps_dict.get("codes") + codes = json.loads(codes) + # 寮�濮嬭繍琛屽洖鎾� + task_id = str(uuid.uuid1()) + threading.Thread(target=lambda: run_backtest(task_id), daemon=True).start() + response_data = json.dumps({"code": 0, "data": {"task_id": task_id}}) + elif url.path == "/stop_run_backtest": + task_id = ps_dict.get("task_id") + if task_id not in running_task_dict: + response_data = json.dumps({"code": 1, "msg": "浠诲姟涓嶅瓨鍦�"}) + else: + backtest: BackTest = running_task_dict.pop(task_id) + del backtest + response_data = json.dumps({"code": 0, "data": {}}) + + elif url.path == "/get_backtest_result": + task_id = ps_dict.get("task_id") + if task_id not in running_task_dict: + response_data = json.dumps({"code": 1, "msg": "浠诲姟涓嶅瓨鍦�"}) + else: + backtest: BackTest = running_task_dict.get(task_id) + progress = tool.trade_time_sub(backtest.current_time, backtest.RANGE_TIMES[0]) / tool.trade_time_sub( + backtest.RANGE_TIMES[1], backtest.RANGE_TIMES[0]) + backtest.backtest_results.sort(key=lambda x: (0 if x[3][0] else 1, x[0])) + response_data = json.dumps( + {"code": 0, "data": {"results": backtest.backtest_results, "finish": backtest.finish, + "progress": round(progress * 100, 2)}}, + cls=tool.SetEncoder) + print("GET璇锋眰") self.send_response(200) # 鍙戠粰璇锋眰瀹㈡埛绔殑鍝嶅簲鏁版嵁 -- Gitblit v1.8.0