백테스트 전략이름, 이동평균선 그래프 오류 수정
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
import React, { useCallback, useEffect, useMemo, useRef, useState, type MutableRefObject } from 'react';
|
||||
import TradingChart from '../TradingChart';
|
||||
import type { BacktestSignal, StrategyDto } from '../../utils/backendApi';
|
||||
import { loadStrategy } from '../../utils/backendApi';
|
||||
import { loadStrategyForNotification } from '../../utils/backendApi';
|
||||
import type { ChartType, IndicatorConfig, OHLCVBar, Theme, Timeframe } from '../../types';
|
||||
import { loadAnalysisCandles } from '../../utils/analysisChartData';
|
||||
import type { ChartManager } from '../../utils/ChartManager';
|
||||
@@ -22,12 +22,6 @@ import {
|
||||
chartPaneFlexRatio,
|
||||
countNonOverlayIndicatorPanes,
|
||||
} from '../../utils/strategyOscillatorSeries';
|
||||
import {
|
||||
createDefaultSmaPlotVisibility,
|
||||
normalizeSmaConfig,
|
||||
smaPeriodKey,
|
||||
smaPlotId,
|
||||
} from '../../utils/smaConfig';
|
||||
import { buildChartIndicatorConfig } from '../../utils/indicatorPaneMerge';
|
||||
import {
|
||||
applyPaperOverlayVisibility,
|
||||
@@ -87,15 +81,7 @@ function defaultOverlayIndicators(
|
||||
const cfg = buildChartIndicatorConfig('SMA', newIndId(), getParams, getVisualConfig, {
|
||||
timeframeVisibility: ALL_TF_VISIBLE,
|
||||
});
|
||||
if (!cfg) return [];
|
||||
// 전략 미선택 시 MA1(14)만 표시
|
||||
const p = { ...cfg.params };
|
||||
p[smaPeriodKey(1)] = 14;
|
||||
const plotVisibility = createDefaultSmaPlotVisibility();
|
||||
for (let i = 0; i < 11; i++) {
|
||||
plotVisibility[smaPlotId(i)] = i === 0;
|
||||
}
|
||||
return [normalizeSmaConfig({ ...cfg, params: p, plotVisibility })];
|
||||
return cfg ? [cfg] : [];
|
||||
}
|
||||
|
||||
/** 전략 미선택 시 기본 오실레이터(RSI, MACD)를 TradingChart sub-pane 으로 추가 */
|
||||
@@ -139,6 +125,7 @@ const BacktestAnalysisChart: React.FC<Props> = ({
|
||||
const [error, setError] = useState<string | null>(null);
|
||||
const [chartType] = useState<ChartType>('candlestick');
|
||||
const [strategy, setStrategy] = useState<StrategyDto | undefined>();
|
||||
const [strategyLoading, setStrategyLoading] = useState(false);
|
||||
/** 개별 지표 숨김 ID 집합 (실시간 차트와 동일한 per-indicator 숨김 지원) */
|
||||
const [hiddenIndicatorIds, setHiddenIndicatorIds] = useState<ReadonlySet<string>>(new Set());
|
||||
const managerRef = useRef<ChartManager | null>(null);
|
||||
@@ -162,11 +149,16 @@ const BacktestAnalysisChart: React.FC<Props> = ({
|
||||
useEffect(() => {
|
||||
if (!strategyId) {
|
||||
setStrategy(undefined);
|
||||
setStrategyLoading(false);
|
||||
return;
|
||||
}
|
||||
let cancelled = false;
|
||||
void loadStrategy(strategyId).then(s => {
|
||||
if (!cancelled) setStrategy(s ?? undefined);
|
||||
setStrategyLoading(true);
|
||||
void loadStrategyForNotification(strategyId).then(s => {
|
||||
if (!cancelled) {
|
||||
setStrategy(s ?? undefined);
|
||||
setStrategyLoading(false);
|
||||
}
|
||||
});
|
||||
return () => { cancelled = true; };
|
||||
}, [strategyId]);
|
||||
@@ -181,27 +173,24 @@ const BacktestAnalysisChart: React.FC<Props> = ({
|
||||
const showOscillatorPanel = !overlayVisibility;
|
||||
|
||||
const baseIndicators = useMemo(() => {
|
||||
if (strategyId && strategyLoading) return [];
|
||||
|
||||
let inds: IndicatorConfig[];
|
||||
if (strategy) {
|
||||
inds = buildVirtualTradingChartIndicators(strategy, getParams, getVisualConfig);
|
||||
inds = inds.filter(i => i.timeframeVisibility?.[chartTimeframe] !== false);
|
||||
// 전략 지표가 모두 캔들 오버레이(SMA/EMA/일목 등)인 경우 기본 오실레이터(RSI·MACD)를 추가.
|
||||
// 기존 SVG 기반 StrategyOscillatorPanes 의 fallback 동작과 동일.
|
||||
if (showOscillatorPanel && inds.every(i => isOverlayType(i.type))) {
|
||||
inds = [...inds, ...defaultOscillatorIndicators(getParams, getVisualConfig)];
|
||||
}
|
||||
} else {
|
||||
inds = defaultOverlayIndicators(getParams, getVisualConfig);
|
||||
// 전략 미선택 시 기본 오실레이터(RSI, MACD)도 TradingChart sub-pane 으로 추가
|
||||
if (showOscillatorPanel) {
|
||||
inds = [...inds, ...defaultOscillatorIndicators(getParams, getVisualConfig)];
|
||||
}
|
||||
}
|
||||
if (overlayVisibility) {
|
||||
inds = ensurePaperChartOverlays(inds, getParams, getVisualConfig);
|
||||
}
|
||||
inds = ensurePaperChartOverlays(inds, getParams, getVisualConfig);
|
||||
return inds;
|
||||
}, [strategy, getParams, getVisualConfig, chartTimeframe, overlayVisibility, showOscillatorPanel]);
|
||||
}, [strategy, strategyId, strategyLoading, getParams, getVisualConfig, chartTimeframe, overlayVisibility, showOscillatorPanel]);
|
||||
|
||||
const indicators = useMemo(() => {
|
||||
let inds = overlayVisibility
|
||||
|
||||
Reference in New Issue
Block a user