迭代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:
@@ -1,7 +1,7 @@
|
||||
/**
|
||||
* R-013 回归测试:策略自定义字段(定义随策略 configSchema + 值落 strategy_holdings.values)
|
||||
* 覆盖(独立数据目录,技术约束-011):
|
||||
* 1. settings.configSchema:schema 归一化(旧策略无 configSchema → []);updateStrategies 保留定义
|
||||
* 1. settings.configSchema:schema 归一化(旧策略无 configSchema → []);updateStrategyFields 单策略写入
|
||||
* 2. SqliteStore:_ensureHoldingValuesColumn 幂等补列;openHolding 后 values=null;readValues/writeValues 读写
|
||||
* 3. PositionManager.updateHoldingValues:定位持仓 → 按所属策略 configSchema 校验(number/enum/boolean)
|
||||
* → 写回;空值放行;非法值拒绝(field-validation);额外键放行(可扩展);null 清除
|
||||
@@ -14,7 +14,7 @@ import { join } from 'node:path';
|
||||
import { SqliteStore } from '../src/storage/SqliteStore.js';
|
||||
import { DataStore } from '../src/storage/DataStore.js';
|
||||
import { PositionManager } from '../src/position/PositionManager.js';
|
||||
import { getStrategies, updateStrategies, addStrategy } from '../src/settings.js';
|
||||
import { getStrategies, getStrategyFields, updateStrategyFields } from '../src/settings.js';
|
||||
|
||||
let pass = 0, fail = 0;
|
||||
function assert(cond, msg) {
|
||||
@@ -56,9 +56,16 @@ assert(grid && Array.isArray(grid.configSchema) && grid.configSchema.length ===
|
||||
const manual = all.find((s) => s.id === 'manual-t');
|
||||
assert(manual && Array.isArray(manual.configSchema) && manual.configSchema.length === 0, '旧策略 manual-t configSchema 归一化为 [](Q4)');
|
||||
|
||||
// updateStrategies 整表更新保留定义
|
||||
await updateStrategies(scope, [{ id: 'manual-t', name: '手动做T' }, { id: 'grid-supermarket', name: '网格超市', configSchema: gridSchema }]);
|
||||
assert(getStrategies(scope).find((s) => s.id === 'grid-supermarket').configSchema.length === 4, 'updateStrategies 整表保留 configSchema');
|
||||
// updateStrategyFields 单策略写入(R-027 唯一写路径)
|
||||
await updateStrategyFields(scope, 'grid-supermarket', gridSchema);
|
||||
assert(getStrategyFields(scope, 'grid-supermarket').length === 4, 'updateStrategyFields 写入后读回 4 字段');
|
||||
assert(getStrategyFields(scope, 'manual-t').length === 0, '写入只影响目标策略(manual-t 仍无定义)');
|
||||
try {
|
||||
await updateStrategyFields(scope, 'long-term', gridSchema);
|
||||
assert(false, '未知 strategyId 应抛错');
|
||||
} catch (e) {
|
||||
assert(e.code === 'strategy-not-found', '未知 strategyId 抛 strategy-not-found');
|
||||
}
|
||||
|
||||
// ---------- 2. SqliteStore values 列 ----------
|
||||
section('2. SqliteStore values 列');
|
||||
|
||||
Reference in New Issue
Block a user