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]
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user