ec02a791ee
- R-027 静态化:策略恒为内置两项(不可增删改名,保留显隐/排序);设置页移除「策略分组」; 字段配置入口迁到策略 tab 内「列设置」旁(FieldConfigDialog + schema-update 单策略写入) - R-026 计算字段:自写公式引擎(中文变量、四则/括号/round·abs·min·max、缺值短路→—)+ 变量目录(行情/合约/持仓/自定义字段)+ strategy-positions 逐行现算(只读内存缓存,不落库、列只读) - R-028 判定型:比较运算 + and/or + inferResultKind + 结果类型一致性校验 + 判定列 ✓/— 渲染; 网格超市落地 可下空单=涨停价>基准值+网格大小、可下多单=跌停价<基准值-网格大小 - 变量选择改标签平铺(老师反馈);公式手册 docs/99-其他材料/计算字段公式说明.md - 约束同步:产品约束-002/003/004/009/013/014、技术约束-014/015/022/023/024、UI约束-002/003/005/008 - 回归:新增 test-r026/test-r027,更新 r011/r013/r017,17 个脚本全绿;typecheck/build 通过
8.1 KiB
8.1 KiB
验收标准:22-策略计算字段与策略 tab 静态化
依据:R-027(第一阶段)+ R-026(第二阶段)+ PLAN-019 +
技术实现方案.md| 日期:2026-09-10 | 状态:待实施后验收 验收线在哪里:本文件(分阶段清单 + 判定线);配套证据:回归脚本输出、typecheck/build 输出、老师人工页面确认
1. 验收目标
- 第一阶段:策略 tab 变成插件内置静态 tab(不可增删改名,保留显隐/排序),设置页「策略分组」消失,字段配置入口落到策略 tab 内、列设置旁;
- 第二阶段:「计算(formula)」字段类型可用——用户写中文变量公式(引用行情/合约/持仓账本/本行手填字段),服务端按持仓行实时算出列值,不落库、列只读、缺数据
—; - 既有能力(四类手填字段、列设置、历史持仓、份额账本、交易归属)零回归。
2. 验收标准线 · 第一阶段(R-027 重构)
| # | 验收项 | 判定 |
|---|---|---|
| A1 | 设置页子 tab 仅「Tab 设置 / QMT 连接配置」 | 页面无「策略分组」入口 |
| A2 | 无任何策略新增/重命名/删除入口 | 设置页与策略 tab 均无该入口;服务端调用 strategies/add|remove|update 返回 unknown method |
| A3 | 策略 tab 恒为「网格超市 / 手动做T」 | 重启、改配置、增删数据后仍恒两项 |
| A4 | Tab 设置中策略行与内置行同权 | 可拖拽排序(间隙高亮线)、可显隐开关;现有偏好(策略置顶 / 全部持仓·关注列表隐藏)保留 |
| A5 | 策略 tab 顶栏有「字段配置」与「列设置」两个按钮 | 位置:字段配置在左、列设置在其右 |
| A6 | 字段配置弹层显示本策略现有字段 | 网格超市 5 个(网格上边界/下边界/基准值/网格大小/网格交易量);手动做T 1 个(T仓成本价) |
| A7 | 弹层内可添加/编辑/删除字段并保存 | 保存走 strategies/schema-update;成功 Toast;另一策略定义不受影响 |
| A8 | 字段增删后表格列自动跟随 | 新增列出现在表格(列设置中可勾选/排序);删除字段后该列消失 |
| A9 | 未保存改动时关闭弹层 | 出现「确定放弃?」二次确认(D-8) |
| A10 | 重启后字段定义仍在 | 存储落 strategyFields(旧 strategies[].configSchema 首次保存后被取代,无迁移脚本) |
| A11 | 数据零影响 | strategy_holdings 行数(13 / 3)、交易归属、份额不变 |
3. 验收标准线 · 第二阶段(R-026 计算字段)
| # | 验收项 | 判定 |
|---|---|---|
| B1 | 字段类型下拉含「计算」 | 选中后隐藏默认值,出现公式框 + 变量选择器 + 试算 + 小数位(0–4,默认 2) |
| B2 | 变量选择器按分组列出可用变量 | 行情(现价/昨收/今开/最高/最低/成交量/成交额)、合约(涨停价/跌停价)、持仓(份额/成本价/最后成交价)、自定义字段(本策略手填字段的展示名) |
| B3 | 公式用中文变量且可算出结果(四式用例) | ① (现价 - 成本价) × 份额 ② (现价 ÷ 成本价 - 1) × 100 ③ (涨停价 - 现价) ÷ 现价 × 100 ④ 现价 × 份额(或 × 网格交易量)——每行值正确(与手工核算一致) |
| B4 | 试算可用 | 点「试算」用该策略一行真实持仓算出并显示(含代码/名称/格式化结果);无持仓 → 「暂无可试算的持仓数据」 |
| B5 | 保存校验生效 | 语法错误(如 现价 ×)→ 拒绝 + 公式框描红 + 定位文案;未知变量 → 拒绝;字段展示名与内置变量冲突(如叫「现价」)→ 拒绝;同策略展示名重复 → 拒绝 |
| B6 | 计算列只读且可辨识 | 表头 ƒ 前缀;点击单元格不进入编辑;悬停列头/单元格显示公式原文 |
| B7 | 格式化正确 | 按小数位 + 单位显示(如 6.67 %、700.00 元) |
| B8 | 缺数据不炸表 | 无行情 / 除零 / 非有限 / 手填字段值非数字 → 该格 —(不显示 NaN、不报错、其余列正常) |
| B9 | 计算字段不落库 | strategy_holdings.values 无 formula 字段键;重启后公式仍在(存 settings)、值仍为实时计算 |
| B10 | 历史持仓行 | 已清仓行的计算列显示 —(不做历史时点计算) |
| B11 | 列设置联动 | 计算列与手填列同列混排(名称带 ƒ 前缀),显隐/拖拽排序正常 |
| B12 | 零回归 | 四类手填字段编辑、列设置、历史持仓开关与范围、份额操作、交易归属、Tab 设置全部照旧 |
4. 边界与异常用例
| 场景 | 期望 |
|---|---|
| 公式引用已删除的字段 | 保存时被拒(未知变量);已存在的旧公式运行时该列 —,字段列表 ⚠ 标记 + 悬停原因(D-4) |
| 公式引用另一个计算字段 | 被拒(变量目录不含 formula 字段,零循环依赖) |
| 公式为空 / 只有空格 | 拒绝保存「请填写公式」 |
| 极长公式 / 深层括号 | 不崩溃(解析器深度限制,超出 → 语法错误提示) |
| 手填字段值为文本(非数字) | 参与计算时按 null 处理 → —(不报错) |
| QMT 断开 | 该策略计算列大面积 —;表格其余功能正常 |
| 无 formula 字段的策略 | 行为与重构前完全一致(无额外取数开销) |
| 弹层打开时保存失败(服务端异常) | Toast 错误、弹层不关闭、改动保留可重试 |
5. 验收方法
- 回归脚本(独立数据目录,技术约束-011)
node scripts/test-r027-static-strategies.mjs→ 全绿(内置策略常量 / 旧定义兼容 / 单策略写入 / tabs 归一化 / 端点退役);node scripts/test-r026-formula-fields.mjs→ 全绿(引擎 / 目录 / 校验 / 附着 computed / 试算);node scripts/test-r011-tabs.mjs、node scripts/test-r013-custom-fields.mjs(已更新)→ 全绿;
- 静态检查:
pnpm typecheck+pnpm build通过; - 老师人工验收(按 §6 步骤逐条确认,A1–A11 + B1–B12)。
6. 老师配合项(人工验收步骤)
- 打开设置页 → 确认只有「Tab 设置 / QMT 连接配置」(A1/A2);
- Tab 设置 → 拖动两个策略 tab、切换显隐(A3/A4);
- 进入策略 tab(网格超市)→ 顶栏
[字段配置] [列设置]→ 打开字段配置 → 看到原有 5 个字段(A5/A6); - 添加计算字段(例:展示名「网格占用」、类型「计算」、单位「元」、小数位 2、公式
现价 × 份额)→ 插入变量 → 试算 → 保存(B1/B2/B4); - 表格中该列出现并显示数值;悬停看公式;点击不可编辑(B3/B6/B7);
- 再配两个计算字段验证其余用例:
(现价 - 成本价) × 份额、(现价 ÷ 成本价 - 1) × 100(单位 %)(B3); - 故意写坏公式(
现价 ×)、引用未知变量、把字段命名为「现价」→ 均应被拒绝并提示(B5); - 造缺数据场景(如某 code 无行情)→ 该格
—,表格正常(B8); - 清仓一只持仓 → 历史行计算列
—(B10); - 重启插件 → 字段定义仍在、值重新现算(A10/B9);
- 抽查数据库:
strategy_holdings.values不含 formula 键(B9)。
7. 判定线
通过(全部满足)
- A1–A11 与 B1–B12 全部通过;
- 回归脚本全绿 + typecheck/build 通过;
- 老师人工验收确认。
任一即不通过
- 计算字段写入
values列(或落任何库表); - 公式可执行表达式以外的行为(无
eval/Function、不可触达进程/文件能力); - 无 formula 字段的策略出现额外取数开销或行为变化(回归);
- 既有四类字段编辑、列设置、历史持仓、份额/归属任一回归失败;
- 策略仍可被增删改名(静态化未达成)。
8. 明确不在本次验收范围
- 策略级聚合(跨行求和)、QMT 账户域/交易记录作为变量源、公式引用公式、历史时点计算、布尔型公式结果、公式框实时高亮/自动补全、完整 T-006 数据池;
- 自建策略的历史数据清理(本机无自建策略;如未来出现,另行讨论)。