Files
one_divine_lot/docs/04-迭代记录/22-策略计算字段与策略tab静态化/验收标准.md
T
kyugao ec02a791ee 迭代22+23: 策略tab静态化 + 计算字段(数字/判定型)+ 网格超市信号字段
- 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 通过
2026-09-10 14:05:06 +08:00

99 lines
8.1 KiB
Markdown
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.
# 验收标准: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. 验收方法
1. **回归脚本**(独立数据目录,技术约束-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`(已更新)→ 全绿;
2. **静态检查**`pnpm typecheck` + `pnpm build` 通过;
3. **老师人工验收**(按 §6 步骤逐条确认,A1–A11 + B1B12)。
## 6. 老师配合项(人工验收步骤)
1. 打开设置页 → 确认只有「Tab 设置 / QMT 连接配置」(A1/A2);
2. Tab 设置 → 拖动两个策略 tab、切换显隐(A3/A4);
3. 进入策略 tab(网格超市)→ 顶栏 `[字段配置] [列设置]` → 打开字段配置 → 看到原有 5 个字段(A5/A6);
4. 添加计算字段(例:展示名「网格占用」、类型「计算」、单位「元」、小数位 2、公式 `现价 × 份额`)→ 插入变量 → 试算 → 保存(B1/B2/B4);
5. 表格中该列出现并显示数值;悬停看公式;点击不可编辑(B3/B6/B7);
6. 再配两个计算字段验证其余用例:`(现价 - 成本价) × 份额``(现价 ÷ 成本价 - 1) × 100`(单位 %)(B3);
7. 故意写坏公式(`现价 ×`)、引用未知变量、把字段命名为「现价」→ 均应被拒绝并提示(B5);
8. 造缺数据场景(如某 code 无行情)→ 该格 `—`,表格正常(B8);
9. 清仓一只持仓 → 历史行计算列 `—`B10);
10. 重启插件 → 字段定义仍在、值重新现算(A10/B9);
11. 抽查数据库:`strategy_holdings.values` 不含 formula 键(B9)。
## 7. 判定线
**通过(全部满足)**
- A1A11 与 B1B12 全部通过;
- 回归脚本全绿 + typecheck/build 通过;
- 老师人工验收确认。
**任一即不通过**
- 计算字段写入 `values` 列(或落任何库表);
- 公式可执行表达式以外的行为(无 `eval/Function`、不可触达进程/文件能力);
- 无 formula 字段的策略出现额外取数开销或行为变化(回归);
- 既有四类字段编辑、列设置、历史持仓、份额/归属任一回归失败;
- 策略仍可被增删改名(静态化未达成)。
## 8. 明确不在本次验收范围
- 策略级聚合(跨行求和)、QMT 账户域/交易记录作为变量源、公式引用公式、历史时点计算、布尔型公式结果、公式框实时高亮/自动补全、完整 T-006 数据池;
- 自建策略的历史数据清理(本机无自建策略;如未来出现,另行讨论)。