迭代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 通过
This commit is contained in:
@@ -0,0 +1,98 @@
|
||||
# 验收标准: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 + B1–B12)。
|
||||
|
||||
## 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. 判定线
|
||||
|
||||
**通过(全部满足)**
|
||||
- A1–A11 与 B1–B12 全部通过;
|
||||
- 回归脚本全绿 + typecheck/build 通过;
|
||||
- 老师人工验收确认。
|
||||
|
||||
**任一即不通过**
|
||||
- 计算字段写入 `values` 列(或落任何库表);
|
||||
- 公式可执行表达式以外的行为(无 `eval/Function`、不可触达进程/文件能力);
|
||||
- 无 formula 字段的策略出现额外取数开销或行为变化(回归);
|
||||
- 既有四类字段编辑、列设置、历史持仓、份额/归属任一回归失败;
|
||||
- 策略仍可被增删改名(静态化未达成)。
|
||||
|
||||
## 8. 明确不在本次验收范围
|
||||
|
||||
- 策略级聚合(跨行求和)、QMT 账户域/交易记录作为变量源、公式引用公式、历史时点计算、布尔型公式结果、公式框实时高亮/自动补全、完整 T-006 数据池;
|
||||
- 自建策略的历史数据清理(本机无自建策略;如未来出现,另行讨论)。
|
||||
Reference in New Issue
Block a user