fix(strategy): 实例做实审计补漏6项——①回测表单提交透传instance_id(CTA/组合两页原只预填不传,四格回写链路断头;组合页补档案预填max_pool/benchmark/pool)②模拟盘/实盘列表支持?instance=N按档案过滤(策略库行加模拟历史/实盘历史按钮,过滤中提示条可退出)③live创建补D1快照(setting用档案参数,API直调不绕过)④实盘账户也标参数漂移角标(D2只亮不同步;account_params_drifted兼容live setting字段)⑤paper页PORTFOLIO_LABELS换STRATEGY_LABELS共享⑥同步生效时机实证标注(实走每日结算重读DB次晚生效;影子进程常驻内存需重启,实证live_step/runner.py均从DB读);921绿+build绿 [vps]
CI/CD / test (push) Successful in 14s
CI/CD / nas-deploy (push) Successful in 45s
CI/CD / nas-verify (push) Successful in 10s

This commit is contained in:
2026-08-15 22:54:02 +08:00
parent 256820d36f
commit 2580b5c080
12 changed files with 79 additions and 18 deletions
+1
View File
@@ -167,6 +167,7 @@ async function onSubmit(): Promise<void> {
commission_rate: Number(form.commission_rate),
stamp_duty_rate: Number(form.stamp_duty_rate),
slippage: Number(form.slippage),
instance_id: route.query.instance && !Array.isArray(route.query.instance) ? Number(route.query.instance) : null,
})
ElMessage.success('回测已提交')
void tid
@@ -6,6 +6,7 @@ import type { EChartsCoreOption } from 'echarts'
import { useChart } from '@/composables/useChart'
import { darkTitle, darkTooltip, darkGrid, darkAxis } from '@/utils/echartsDark'
import { getTaskParams } from '@/api/backtest'
import { apiClient } from '@/api/client'
import { disableFutureDate } from '@/utils/dates'
import { INTERVAL_OPTIONS } from '@/constants/intervals'
import {
@@ -370,6 +371,7 @@ async function onSubmit(): Promise<void> {
min_commission: Number(form.min_commission),
slippage: Number(form.slippage),
interval: form.interval,
instance_id: route.query.instance && !Array.isArray(route.query.instance) ? Number(route.query.instance) : null,
})
ElMessage.success('回测已提交,后台运行中')
router.push('/backtest/history') // 跳任务中心(历史任务页)看进度/结果
@@ -391,8 +393,27 @@ onMounted(() => {
// 从任务列表「点任务ID」跳转:按该任务参数完整预填
void prefillFromTask(fromTaskId.value)
}
// §12.6 从策略库档案发起:按档案参数预填(max_pool/benchmark 等)
const instQ = route.query.instance
if (instQ && !Array.isArray(instQ)) void prefillFromInstance(Number(instQ))
})
async function prefillFromInstance(instId: number): Promise<void> {
try {
const { data } = await apiClient.get<{
instance: { name?: string; code_file: string; params: Record<string, unknown>; symbol_or_pool?: string }
}>(`/strategy/instances/${instId}`)
const inst = data.instance
if (inst.code_file) form.strategy = inst.code_file.replace(/\.py$/, '')
const p = inst.params || {}
if (typeof p.max_pool === 'number') form.max_pool = p.max_pool
if (typeof p.benchmark === 'string') form.benchmark = p.benchmark
if (inst.symbol_or_pool && inst.symbol_or_pool !== '') form.pool = inst.symbol_or_pool
} catch {
/* 预填失败走默认 */
}
}
async function prefillFromTask(tid: string): Promise<void> {
try {
const tp = await getTaskParams(tid)