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