From 9a4bdcd07dfe999f123a8226608d4c90213fae5b Mon Sep 17 00:00:00 2001 From: shy3130 <415333856@qq.com> Date: Tue, 8 Sep 2026 22:16:21 +0800 Subject: [PATCH] =?UTF-8?q?feat(backtest):=20=E7=8E=AF=E5=A2=83=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=BC=BA=E5=8F=A3=E4=B8=80=E9=94=AE=E8=A1=A5=E7=AE=97?= =?UTF-8?q?=E5=B9=B6=E8=87=AA=E5=8A=A8=E9=87=8D=E8=B7=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 回测报错横幅识别环境数据缺失文案(提取缺失首日), 显示「补算环境数据并重跑」按钮 - 点击后调用已有 /api/regime/recompute 补算缺口区间, 完成后自动重跑本次回测 - 补算请求超时放宽到 5 分钟(需扫全市场 enriched 数据) - 预热区间不足的报错变体不显示按钮(补算无法解决, 文案自说明) --- frontend/src/lib/api.ts | 3 +- .../src/pages/backtest/StrategyBacktest.tsx | 62 +++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api.ts index 171d415..f55cb0f 100644 --- a/frontend/src/lib/api.ts +++ b/frontend/src/lib/api.ts @@ -2560,7 +2560,8 @@ export const api = { if (start) params.set('start', start) if (end) params.set('end', end) const qs = params.toString() - return request<{ ok: boolean; computed: number; phase_days?: number; mainline_rows?: number }>(`/api/regime/recompute${qs ? `?${qs}` : ''}`, { method: 'POST' }) + // 补算需扫 enriched 全市场数据, 大区间耗时超过默认超时, 放宽到 5 分钟 + return request<{ ok: boolean; computed: number; phase_days?: number; mainline_rows?: number }>(`/api/regime/recompute${qs ? `?${qs}` : ''}`, { method: 'POST', timeoutMs: 300_000 }) }, regimePhases: (start?: string, end?: string) => { const params = new URLSearchParams() diff --git a/frontend/src/pages/backtest/StrategyBacktest.tsx b/frontend/src/pages/backtest/StrategyBacktest.tsx index 16c0fc0..e285822 100644 --- a/frontend/src/pages/backtest/StrategyBacktest.tsx +++ b/frontend/src/pages/backtest/StrategyBacktest.tsx @@ -208,6 +208,31 @@ const ADVANCED_TABS: { id: AdvancedSettingsTab; label: string }[] = [ { id: 'range', label: '回测范围' }, ] const toSignalId = (sig: string) => (sig.startsWith('signal_') || sig.startsWith('csg_')) ? sig : `signal_${sig}` + +/** 环境数据缺口的一键补算入口: 补算区间后自动重跑回测 */ +function RegimeRecomputeButton({ from, to, pending, onClick }: { + from: string + to?: string + pending: boolean + onClick: () => void +}) { + return ( +