Files
tick-stock-panel/backend/app/strategy/prompt_builder.py
T
shy3130 918c7ade7e 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 通过
2026-10-10 21:10:44 +08:00

86 lines
2.8 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
"""策略提示词组装器 — 两步定制流程的提示词生成。
职责: 加载对应步骤的 Markdown 指南,拼接用户输入,组装 LLM 提示词。
不知道: LLM 调用、API、前端、引擎执行。
"""
from __future__ import annotations
from pathlib import Path
# 运行时依赖的提示词文档(随 backend/app 打包进 Docker,避免 .dockerignore 排除 docs/ 导致运行时缺失)
_DOCS_DIR = Path(__file__).resolve().parent / "prompts"
_cache: dict[str, str] = {}
def _load_doc(name: str) -> str:
if name not in _cache:
path = _DOCS_DIR / name
_cache[name] = path.read_text(encoding="utf-8") if path.exists() else ""
return _cache[name]
DIRECTION_CN = {"long": "做多", "short": "做空", "monitor": "监控"}
def _format_basic_filter(basic_filter: dict) -> str:
"""dict → Python 字面量单行 (True/False/None 保持 Python 语法, 供 AI 直接抄进 META)。"""
return repr(dict(basic_filter))
def build_step1(
name: str,
description: str,
direction: str,
rules: str,
strategy_id: str = "",
execution_backend: str = "polars_expr",
basic_filter: dict | None = None,
) -> str:
"""步骤1:规则 → 完整策略代码(参数 + 信号 + 评分)
注意: 生成规范已在 ai_generator.py 的 system prompt 中加载,
此处只拼用户输入以降低网关超时概率。
basic_filter: 用户「默认基础参数」(策略页设置); None = 不约束, AI 自行默认。
"""
id_line = f"\n策略ID(必须使用此ID):{strategy_id}" if strategy_id else ""
bf_line = (
f"\n用户默认基础过滤参数(META 的 basic_filter 必须严格使用以下值,"
f"除非策略规则与之明确冲突并在代码注释中说明):\n{_format_basic_filter(basic_filter)}\n"
if basic_filter
else ""
)
return f"""请根据以下用户输入生成完整策略代码:
策略名称:{name}{id_line}
策略描述:{description}
策略方向:{DIRECTION_CN.get(direction, direction)}
执行后端:{execution_backend}
{bf_line}策略规则:
{rules}
输出要求:
1. 严格遵循系统提示中的策略文件结构和安全限制。
2. 严格使用指定执行后端;matrix_native 只定义 MATRIX_STRATEGY,polars_expr 只定义 filter()。若 polars 规则确需历史窗口,改用 python_history_legacy + filter_history()。
3. META 必须声明 asset_types 和 timeframes,并生成完整执行与交易元数据。
4. 只输出 Python 代码。"""
def build_step2(current_code: str, instruction: str) -> str:
"""步骤2:修改策略任意部分"""
guide = _load_doc("strategy-builder-step2.md")
return f"""{guide}
---
当前策略代码:
```python
{current_code}
```
用户修改指令:
{instruction}
只输出修改后的完整 Python 代码。"""