From 3ed09cd96666371f908c3ff35142ddba97195f0a Mon Sep 17 00:00:00 2001 From: Macbook Date: Wed, 17 Jun 2026 13:16:51 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B3=B4=EC=A1=B0=EC=A7=80=ED=91=9C=20?= =?UTF-8?q?=EA=B4=80=EB=A0=A8=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../StrategyEvaluationChart.tsx | 9 +-- frontend/src/utils/indicatorMainConfig.ts | 2 +- frontend/src/utils/indicatorRegistry.ts | 5 +- .../src/utils/strategyToChartIndicators.ts | 56 +++++++++++++++++++ 4 files changed, 62 insertions(+), 10 deletions(-) diff --git a/frontend/src/components/strategyEvaluation/StrategyEvaluationChart.tsx b/frontend/src/components/strategyEvaluation/StrategyEvaluationChart.tsx index 3bb9e17..db503dc 100644 --- a/frontend/src/components/strategyEvaluation/StrategyEvaluationChart.tsx +++ b/frontend/src/components/strategyEvaluation/StrategyEvaluationChart.tsx @@ -39,10 +39,7 @@ import { type ChartOverlayToggleKey, type ChartOverlayVisibility, } from '../../utils/chartOverlayVisibility'; -import { - buildVirtualTradingChartIndicators, - ensurePaperChartOverlays, -} from '../../utils/strategyToChartIndicators'; +import { buildStrategyEvaluationChartIndicators } from '../../utils/strategyToChartIndicators'; import { buildEvalParamsFromStrategy } from '../../utils/strategyEvaluationParams'; import { indicatorDefaultsFingerprint } from '../../utils/indicatorDefaultsFingerprint'; import { repairUtf8Mojibake } from '../../utils/textEncoding'; @@ -173,9 +170,7 @@ const StrategyEvaluationChart: React.FC = ({ const baseIndicators = useMemo(() => { if (!strategy) return [] as IndicatorConfig[]; - let inds = buildVirtualTradingChartIndicators(strategy, getParams, getVisualConfig); - inds = ensurePaperChartOverlays(inds, getParams, getVisualConfig); - return inds; + return buildStrategyEvaluationChartIndicators(strategy, getParams, getVisualConfig); }, [strategy, getParams, getVisualConfig, settingsRevision]); const indicators = useMemo( diff --git a/frontend/src/utils/indicatorMainConfig.ts b/frontend/src/utils/indicatorMainConfig.ts index 819a10f..d2947bb 100644 --- a/frontend/src/utils/indicatorMainConfig.ts +++ b/frontend/src/utils/indicatorMainConfig.ts @@ -32,7 +32,7 @@ function overlayWorkspaceVisualOntoStrategyIndicator( id: ind.id, hidden: ind.hidden, mergedWith: ind.mergedWith, - plotVisibility: { plot0: true, plot1: true, ...ws.plotVisibility }, + plotVisibility: ws.plotVisibility ?? ind.plotVisibility, }); } diff --git a/frontend/src/utils/indicatorRegistry.ts b/frontend/src/utils/indicatorRegistry.ts index 6abb766..79aaf38 100644 --- a/frontend/src/utils/indicatorRegistry.ts +++ b/frontend/src/utils/indicatorRegistry.ts @@ -586,8 +586,9 @@ function normalizeSignalLineIndicatorPlots( return order.indexOf(a.id) - order.indexOf(b.id); }); const nextVis = { ...plotVisibility }; - nextVis.plot0 = true; - nextVis.plot1 = true; + for (const p of nextPlots) { + if (nextVis[p.id] === undefined) nextVis[p.id] = true; + } return { plots: nextPlots, plotVisibility: nextVis }; } diff --git a/frontend/src/utils/strategyToChartIndicators.ts b/frontend/src/utils/strategyToChartIndicators.ts index e47378e..5f8aeef 100644 --- a/frontend/src/utils/strategyToChartIndicators.ts +++ b/frontend/src/utils/strategyToChartIndicators.ts @@ -14,6 +14,8 @@ import { import { initializeIndicatorConfigForEditor } from './indicatorSettingsEditor'; import { mergeGlobalDefaultsOntoChartIndicators } from './indicatorMainConfig'; import { buildChartIndicatorConfig } from './indicatorPaneMerge'; +import { normalizeSmaConfig } from './smaConfig'; +import { normalizeIchimokuConfig } from './ichimokuConfig'; import type { EditorConditionState } from './strategyConditionSerde'; import { collectUiEvaluationTimeframes } from './strategyTimeframeSync'; @@ -339,3 +341,57 @@ export function buildVirtualTradingCardChartIndicators( ): IndicatorConfig[] { return buildStrategyChartIndicators(strategy, getParams, getVisual).slice(0, 1); } + +/** + * DB 보조지표 설정(플롯 on/off·색·선유형·굵기·수평선)을 strat_* 지표에 반영. + * 워크스페이스 ind_* 인스턴스 plots/hidden 은 사용하지 않는다. + */ +export function applyDbVisualSettingsForStrategyChart( + config: IndicatorConfig, + getVisual: GetVisual, +): IndicatorConfig { + const def = getIndicatorDef(config.type); + if (!def) return enrichIndicatorConfig(config); + + let cfg = initializeIndicatorConfigForEditor( + { + ...config, + plots: [], + hlines: [], + cloudColors: undefined, + bandBackground: undefined, + plotVisibility: undefined, + }, + undefined, + (type, defaultPlots, defaultHlines) => getVisual(type, defaultPlots ?? [], defaultHlines ?? []), + ); + + if (cfg.type === 'SMA') cfg = normalizeSmaConfig(cfg); + else if (cfg.type === 'IchimokuCloud') cfg = normalizeIchimokuConfig(cfg); + return enrichIndicatorConfig(cfg); +} + +/** + * 전략 평가 차트 — 전략 DSL 지표 + 기본 오버레이. + * 보조지표 설정 DB의 플롯 on/off·스타일을 따르고, + * 워크스페이스 차트 on/off(hidden)와 무관하게 전략에 쓰인 지표 pane 은 항상 표시한다. + */ +export function buildStrategyEvaluationChartIndicators( + strategy: StrategyDto | undefined, + getParams: GetParams, + getVisual: GetVisual, +): IndicatorConfig[] { + if (!strategy) return []; + + const strategyTypes = new Set(collectStrategyRegistryTypes(strategy)); + let inds = buildVirtualTradingChartIndicators(strategy, getParams, getVisual); + inds = ensurePaperChartOverlays(inds, getParams, getVisual); + + return inds.map(ind => { + let cfg = applyDbVisualSettingsForStrategyChart(ind, getVisual); + if (strategyTypes.has(cfg.type)) { + cfg = { ...cfg, hidden: false }; + } + return cfg; + }); +}