refactor(core): 策略与信号全面去内置化, 转为用户自定义定义

- 策略: 引擎只加载 data/strategies/{custom,ai,composite} 与研究模板目录,
  原 25 个内置策略一次性迁移为用户自定义文件(ID 不变, 引用零迁移);
  研究模板移至 app/strategy/research, 打包 spec 同步; 新装环境策略库为空
- 信号: 管线不再硬编码任何信号表达式; 涨跌停判定价成为运行时列
  limit_up_price/limit_down_price(生效价∓0.005 容差), 20 个信号转为
  data/user_data/custom_signals 定义(显式 column 沿用 signal_* 原列名);
  依赖解析/注入顺序/当日路径 prev-join 全部定义驱动; 语义统一为历史路径
  口径(顺带修正当日路径 BOLL 比较符与翘板/炸板空值两处既有偏差)
- 前端: 信号库单列表(全部可编辑), SignalPicker/监控选项/信号标签全走
  定义接口; 回测页新增免责声明(模拟性质/数据源准确性不作保证/不构成
  投资建议)
- 测试: 25 个策略夹具与 20 个信号种子入库 tests/fixtures, 受影响测试
  全部自包含化(不依赖运行目录用户数据); 77 万行 MA 死叉新旧表达式对拍
  逐行一致; 回测实跑 45 笔卖点信号出场验证矩阵链路
- 同批包含工作区既有进度: 策略结果 ext 列同日投影修复(含测试)、数据源插件、fuyao/auth/api_gateway/data_integrity 调整、README 信号库
  描述与 strategy.md 导入路径补充

验证: 后端 2592 passed(空数据目录 CI 模拟 2588 passed, 4 例为模拟环境
伪影复验排除); 前端 vitest 125 passed + tsc 0 错 + vite build 通过
This commit is contained in:
shy3130
2026-10-10 21:10:44 +08:00
parent b65d2691d9
commit 918c7ade7e
188 changed files with 3407 additions and 1554 deletions
+2 -2
View File
@@ -180,7 +180,7 @@ begin
end;
// ── 卸载时询问是否删除用户数据 ─────────────────────────────────
// 用户数据在 {app}\data\ (策略/选股/回测/监控/行情), 与程序同处 {app} 总目录。
// 用户数据在 {app}\data\ (策略/回测/监控/行情), 与程序同处 {app} 总目录。
// Inno Setup 卸载默认只删它装过的程序文件, data\ 会被保留 (覆盖安装/常规卸载都不丢)。
// 这里仅在用户明确「彻底卸载」时, 才询问是否清理 data\ + {app} 空壳。
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
@@ -196,7 +196,7 @@ begin
if SuppressibleMsgBox(
'是否同时删除用户数据?' + #13#10 + #13#10 +
'位置: ' + DataDir + #13#10 +
'内容: 行情数据、策略、选股结果、回测记录、监控规则等' + #13#10 + #13#10 +
'内容: 行情数据、策略、策略结果、回测记录、监控规则等' + #13#10 + #13#10 +
'选「是」彻底卸载, 选「否」保留数据(重装后可恢复)。',
mbConfirmation, MB_YESNO or MB_DEFBUTTON2, IDNO) = IDYES then
begin
+6 -3
View File
@@ -31,7 +31,7 @@ block_cipher = None
ROOT = Path(SPECPATH).parent
FRONTEND_DIST = str(ROOT / "frontend" / "dist")
TIERS_YAML = str(ROOT / "tiers.yaml")
BUILTIN_STRATEGIES = str(ROOT / "backend" / "app" / "strategy" / "builtin")
RESEARCH_TEMPLATE = str(ROOT / "backend" / "app" / "strategy" / "research")
# 图标按平台选: Windows 用 brand/icon.ico, macOS 用 brand/icon.icns —
# 两者均由 brand/png/logo-tile-light-512.png 派生 (浅色圆角卡版, 品牌资产唯一来源,
# 见 brand/README 接入指引), 无需 CI 现场生成。
@@ -70,10 +70,13 @@ hiddenimports += collect_submodules("polars")
# 注: 出于合规暂不进桌面包 (与 GHCR 镜像口径一致), 需要时仿照添加。
datas += [
(str(ROOT / "backend" / "app" / "plugins" / "fuyao" / "plugin.yaml"), "app/plugins/fuyao"),
(str(ROOT / "backend" / "app" / "" / "plugin.yaml"), ""),
]
hiddenimports += [
"app.plugins.fuyao.provider",
"app.plugins.fuyao.client",
"app..provider",
"app..client",
]
# ── 后端源码扩展 (app/custom/*) ──────────────────────────────────────
@@ -146,8 +149,8 @@ datas += [(TIERS_YAML, ".")]
# frontend/package.json → 包根 (app/__init__.py frozen 模式读 _MEIPASS/package.json,
# __version__ 与安装包 AppVersion / 页面显示同源, 版本号只改 package.json 一处)
datas += [(str(ROOT / "frontend" / "package.json"), ".")]
# 内置策略 → app/strategy/builtin/ (importlib 动态加载, 不能进 PYZ)
datas += [(BUILTIN_STRATEGIES, "app/strategy/builtin")]
# 研究模板 → app/strategy/research/ (importlib 动态加载, 不能进 PYZ; 挖掘功能依赖)
datas += [(RESEARCH_TEMPLATE, "app/strategy/research")]
# ── 排除不需要的重型依赖 (主包不含 vectorbt 回测链) ──────────────────
excludes = [