diff --git a/frontend/src/api/backtest.ts b/frontend/src/api/backtest.ts index 82a77f8..0feb593 100644 --- a/frontend/src/api/backtest.ts +++ b/frontend/src/api/backtest.ts @@ -11,6 +11,8 @@ export interface CtaSubmit { slippage?: number commission_rate?: number stamp_duty_rate?: number + // §12.6 可选关联档案(带了则结果回写档案四格) + instance_id?: number | null } export interface TaskStatus { diff --git a/frontend/src/api/portfolio.ts b/frontend/src/api/portfolio.ts index 213734e..753e084 100644 --- a/frontend/src/api/portfolio.ts +++ b/frontend/src/api/portfolio.ts @@ -15,6 +15,8 @@ export interface PortfolioBacktestReq { slippage?: number // K线周期(组合回放暂仅日线 d) interval?: string + // §12.6 可选关联档案(带了则结果回写档案四格) + instance_id?: number | null } export interface EquityPoint { diff --git a/frontend/src/views/backtest/New.vue b/frontend/src/views/backtest/New.vue index 3d2edc4..5cdee21 100644 --- a/frontend/src/views/backtest/New.vue +++ b/frontend/src/views/backtest/New.vue @@ -167,6 +167,7 @@ async function onSubmit(): Promise { 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 diff --git a/frontend/src/views/backtest/PortfolioBacktest.vue b/frontend/src/views/backtest/PortfolioBacktest.vue index 64240ab..0bf39cb 100644 --- a/frontend/src/views/backtest/PortfolioBacktest.vue +++ b/frontend/src/views/backtest/PortfolioBacktest.vue @@ -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 { 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 { + try { + const { data } = await apiClient.get<{ + instance: { name?: string; code_file: string; params: Record; 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 { try { const tp = await getTaskParams(tid) diff --git a/frontend/src/views/live/List.vue b/frontend/src/views/live/List.vue index 408724b..e459221 100644 --- a/frontend/src/views/live/List.vue +++ b/frontend/src/views/live/List.vue @@ -1,6 +1,6 @@