From 8d93b8fe98e57bb2d0d1fd7752d286d746d3784c Mon Sep 17 00:00:00 2001 From: im47cn <67424112+im47cn@users.noreply.github.com> Date: Sun, 12 Jul 2026 14:10:15 +0800 Subject: [PATCH] =?UTF-8?q?fix(walkforward):=20=E5=89=8D=E7=AB=AF=E5=AF=B9?= =?UTF-8?q?=E9=BD=90=E4=BC=98=E5=8C=96=E5=99=A8=E5=B7=B2=E6=9C=89=E9=98=B2?= =?UTF-8?q?=E6=8A=A4=20(=E5=88=87=E7=AD=96=E7=95=A5=E5=81=9C=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=20+=20=E5=9D=8F=E7=BD=91=E6=A0=BC=E6=8B=A6=E6=88=AA)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 对抗式审查发现 WF 页面偏离了 StrategyOptimizer 已修好的两处防护: - 切策略时直接传 clearWalkForward (只清前端状态), 不停后端任务 —— 对齐优化器 改为 if(pending) stopWalkForward() else clearWalkForward(), 真正 cancel+关SSE+清storage。 - canRun 缺 !sweep.gridError, 且 CombosHint 未传 gridError prop —— 坏网格(步长越界等) 既不显示错误也能提交到后端。补齐, 与优化器一致。 --- frontend/src/pages/backtest/StrategyWalkForward.tsx | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/frontend/src/pages/backtest/StrategyWalkForward.tsx b/frontend/src/pages/backtest/StrategyWalkForward.tsx index d61fda2..cb9a205 100644 --- a/frontend/src/pages/backtest/StrategyWalkForward.tsx +++ b/frontend/src/pages/backtest/StrategyWalkForward.tsx @@ -67,7 +67,11 @@ export function StrategyWalkForward() { const { data: stratData } = useQuery({ queryKey: ['strategies'], queryFn: api.strategyList }) const strategies: StrategyDetail[] = stratData?.strategies ?? [] - const sweep = useParamSweep(strategies, clearWalkForward) + // 切策略: 有任务在跑时先真正取消 (关 SSE + 后端 cancel + 清 localStorage), 不能静默丢 + const sweep = useParamSweep(strategies, () => { + if (task?.isPending) stopWalkForward() + else clearWalkForward() + }) const [objective, setObjective] = useState('sortino') const [start, setStart] = useState(THREE_YEARS_AGO) const [end, setEnd] = useState(TODAY) @@ -82,6 +86,7 @@ export function StrategyWalkForward() { }, []) const canRun = sweep.strategyId && sweep.combos > 0 && sweep.combos <= GRID_MAX_COMBINATIONS + && !sweep.gridError && Number(trainDays) > 0 && Number(testDays) > 0 && Number(stepDays) > 0 && !task?.isPending const onRun = () => { @@ -160,7 +165,7 @@ export function StrategyWalkForward() { - +
每折跑 {sweep.combos || 0} 组优化 × N 折,耗时较长
{task?.isPending ? (