Files
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

8.1 KiB
Raw Permalink Blame History

验收标准: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.mjsnode 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 数据池;
  • 自建策略的历史数据清理(本机无自建策略;如未来出现,另行讨论)。