From d54dc6e2ffd3d3bcd6d75f49467ca2aa9f8f5090 Mon Sep 17 00:00:00 2001 From: Macbook Date: Fri, 12 Jun 2026 19:12:47 +0900 Subject: [PATCH] =?UTF-8?q?=EC=A0=84=EB=9E=B5=ED=8F=89=EA=B0=80=20?= =?UTF-8?q?=ED=99=94=EB=A9=B4=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/StrategyEvaluationPage.tsx | 1 + .../StrategyEvaluationChart.tsx | 11 ++-- .../StrategyEvaluationSettingsTab.tsx | 43 +++++++++------ frontend/src/styles/strategyEvaluation.css | 53 +++++++++++++------ 4 files changed, 70 insertions(+), 38 deletions(-) diff --git a/frontend/src/components/StrategyEvaluationPage.tsx b/frontend/src/components/StrategyEvaluationPage.tsx index a73c46e..eeca78d 100644 --- a/frontend/src/components/StrategyEvaluationPage.tsx +++ b/frontend/src/components/StrategyEvaluationPage.tsx @@ -382,6 +382,7 @@ export default function StrategyEvaluationPage({ theme = 'dark' }: Props) { appliedParams={appliedIndicatorParams} onSave={handleSaveIndicatorParams} onReset={handleResetIndicatorParams} + applying={evalLoading || chartLoading} /> )} diff --git a/frontend/src/components/strategyEvaluation/StrategyEvaluationChart.tsx b/frontend/src/components/strategyEvaluation/StrategyEvaluationChart.tsx index c6d273a..b1b81be 100644 --- a/frontend/src/components/strategyEvaluation/StrategyEvaluationChart.tsx +++ b/frontend/src/components/strategyEvaluation/StrategyEvaluationChart.tsx @@ -268,11 +268,6 @@ const StrategyEvaluationChart: React.FC = ({ mgr.applyVisibleTimeRange(bar.time - barSec * 24, bar.time + barSec * 8); }, [chartMgr, bars]); - useEffect(() => { - if (bars.length === 0) return; - scrollToBar(Math.min(Math.max(0, selectedBarIndex), bars.length - 1)); - }, [selectedBarIndex, bars, scrollToBar]); - const onManagerReady = useCallback((mgr: ChartManager) => { managerRef.current = mgr; setChartMgr(mgr); @@ -299,8 +294,10 @@ const StrategyEvaluationChart: React.FC = ({ const goLatest = useCallback(() => { if (bars.length === 0) return; - onSelectedBarIndexChange(bars.length - 1); - }, [bars.length, onSelectedBarIndexChange]); + const lastIdx = bars.length - 1; + onSelectedBarIndexChange(lastIdx); + scrollToBar(lastIdx); + }, [bars.length, onSelectedBarIndexChange, scrollToBar]); useEffect(() => { const mgr = chartMgr; diff --git a/frontend/src/components/strategyEvaluation/StrategyEvaluationSettingsTab.tsx b/frontend/src/components/strategyEvaluation/StrategyEvaluationSettingsTab.tsx index 975833b..0bf66be 100644 --- a/frontend/src/components/strategyEvaluation/StrategyEvaluationSettingsTab.tsx +++ b/frontend/src/components/strategyEvaluation/StrategyEvaluationSettingsTab.tsx @@ -20,6 +20,7 @@ interface Props { appliedParams: EvalIndicatorParams | null; onSave: (params: EvalIndicatorParams) => void; onReset: () => void; + applying?: boolean; } function getEditableParamKeys( @@ -47,6 +48,7 @@ const StrategyEvaluationSettingsTab: React.FC = ({ appliedParams, onSave, onReset, + applying = false, }) => { const [draft, setDraft] = useState({}); const [expanded, setExpanded] = useState(null); @@ -56,23 +58,31 @@ const StrategyEvaluationSettingsTab: React.FC = ({ [strategy], ); + const resolveBaseline = useCallback((): EvalIndicatorParams => { + if (!strategy) return {}; + return appliedParams ?? buildEvalParamsFromStrategy(strategy, getParams); + }, [strategy, appliedParams, getParams]); + useEffect(() => { if (!strategy) { setDraft({}); setExpanded(null); return; } - const baseline = appliedParams ?? buildEvalParamsFromStrategy(strategy, getParams); - setDraft(JSON.parse(JSON.stringify(baseline)) as EvalIndicatorParams); + setDraft(JSON.parse(JSON.stringify(resolveBaseline())) as EvalIndicatorParams); setExpanded(indicatorTypes[0] ?? null); // eslint-disable-next-line react-hooks/exhaustive-deps }, [strategy?.id, appliedParams, indicatorTypes.join(',')]); const dirty = useMemo( - () => hasEvalParamsDiff(draft, appliedParams), - [draft, appliedParams], + () => hasEvalParamsDiff(draft, resolveBaseline()), + [draft, resolveBaseline], ); + const handleApply = useCallback(() => { + onSave(JSON.parse(JSON.stringify(draft)) as EvalIndicatorParams); + }, [draft, onSave]); + const patchParam = useCallback((type: string, key: string, raw: string | boolean) => { setDraft(prev => { const current = prev[type] ?? {}; @@ -115,8 +125,19 @@ const StrategyEvaluationSettingsTab: React.FC = ({ return (
-

{strategyName}

-

지표 값을 변경 후 저장하면 차트·일치율이 재계산됩니다

+
+

{strategyName}

+ +
+

지표 값을 변경한 뒤 적용을 누르면 차트·일치율이 갱신됩니다

@@ -163,18 +184,10 @@ const StrategyEvaluationSettingsTab: React.FC = ({
-