알림목록 백테스팅 차트에서 이동평균선, 일목균형표, 볼린저 그래프 표시

This commit is contained in:
Macbook
2026-06-08 13:21:30 +09:00
parent 7f29bbd309
commit 1d1c277e3a
8 changed files with 182 additions and 36 deletions
@@ -25,7 +25,9 @@ import {
import { buildChartIndicatorConfig } from '../../utils/indicatorPaneMerge';
import {
applyPaperOverlayVisibility,
DEFAULT_PAPER_OVERLAY_VISIBILITY,
listPaperOverlayToggleItems,
paperOverlayVisibilityToChart,
type PaperOverlayToggleKey,
type PaperOverlayVisibility,
} from '../../utils/paperChartOverlayVisibility';
@@ -61,11 +63,6 @@ interface Props {
const noop = () => {};
/** PaperOverlayVisibility → ChartManager 동기화용 (candle 항상 true) */
function paperVisToChartVis(pv: PaperOverlayVisibility) {
return { ma: pv.ma, bollinger: pv.bollinger, ichimoku: pv.ichimoku, candle: true };
}
let _indSeq = 0;
function newIndId() {
_indSeq += 1;
@@ -128,12 +125,17 @@ const BacktestAnalysisChart: React.FC<Props> = ({
const [strategyLoading, setStrategyLoading] = useState(false);
/** 개별 지표 숨김 ID 집합 (실시간 차트와 동일한 per-indicator 숨김 지원) */
const [hiddenIndicatorIds, setHiddenIndicatorIds] = useState<ReadonlySet<string>>(new Set());
/** 백테스트·분석 레포트 — 세션 전용 오버레이 on/off (투자관리 탭은 부모 props 사용) */
const [internalOverlayVisibility, setInternalOverlayVisibility] = useState<PaperOverlayVisibility>(
() => ({ ...DEFAULT_PAPER_OVERLAY_VISIBILITY }),
);
const effectiveOverlayVisibility = overlayVisibility ?? internalOverlayVisibility;
const managerRef = useRef<ChartManager | null>(null);
const overlayVisibilityRef = useRef(overlayVisibility);
const overlayVisibilityRef = useRef(effectiveOverlayVisibility);
const logicalRangeUnsubRef = useRef<(() => void) | null>(null);
const viewportUnsubRef = useRef<(() => void) | null>(null);
const loadMoreRefRef = useRef<MutableRefObject<() => void>>({ current: () => {} });
overlayVisibilityRef.current = overlayVisibility;
overlayVisibilityRef.current = effectiveOverlayVisibility;
const signalsRef = useRef(signals);
signalsRef.current = signals;
const onHistoryBarsLoadedRef = useRef(onHistoryBarsLoaded);
@@ -193,9 +195,7 @@ const BacktestAnalysisChart: React.FC<Props> = ({
}, [strategy, strategyId, strategyLoading, getParams, getVisualConfig, chartTimeframe, overlayVisibility, showOscillatorPanel]);
const indicators = useMemo(() => {
let inds = overlayVisibility
? applyPaperOverlayVisibility(baseIndicators, overlayVisibility)
: baseIndicators;
let inds = applyPaperOverlayVisibility(baseIndicators, effectiveOverlayVisibility);
// 개별 지표 숨김 상태 반영 (per-indicator hidden toggle)
if (hiddenIndicatorIds.size > 0) {
inds = inds.map(ind =>
@@ -203,12 +203,12 @@ const BacktestAnalysisChart: React.FC<Props> = ({
);
}
return inds;
}, [baseIndicators, overlayVisibility, hiddenIndicatorIds]);
}, [baseIndicators, effectiveOverlayVisibility, hiddenIndicatorIds]);
const candleOverlayToggles = useMemo(() => {
if (!overlayVisibility || !onToggleOverlay) return undefined;
return listPaperOverlayToggleItems(baseIndicators, overlayVisibility);
}, [baseIndicators, overlayVisibility, onToggleOverlay]);
const candleOverlayToggles = useMemo(
() => listPaperOverlayToggleItems(baseIndicators, effectiveOverlayVisibility),
[baseIndicators, effectiveOverlayVisibility],
);
/**
* 캔들 오버레이 그룹 토글 — 실시간 차트와 동일하게 ChartManager 를 즉시 호출한 뒤
@@ -217,11 +217,15 @@ const BacktestAnalysisChart: React.FC<Props> = ({
const handleToggleCandleOverlay = useCallback((key: ChartOverlayToggleKey) => {
const pKey = key as PaperOverlayToggleKey;
const prev = overlayVisibilityRef.current;
if (prev && pKey in prev) {
if (pKey in prev) {
const newVisible = !prev[pKey];
managerRef.current?.setChartOverlayGroupVisible(key, newVisible);
}
onToggleOverlay?.(pKey);
if (onToggleOverlay) {
onToggleOverlay(pKey);
} else {
setInternalOverlayVisibility(prev => ({ ...prev, [pKey]: !prev[pKey] }));
}
}, [onToggleOverlay]);
/**
@@ -360,7 +364,7 @@ const BacktestAnalysisChart: React.FC<Props> = ({
managerRef.current = mgr;
// 실시간 차트와 동일하게: 마운트 시 오버레이 가시성 ChartManager 에 동기화
if (overlayVisibilityRef.current) {
mgr.setChartOverlayVisibility(paperVisToChartVis(overlayVisibilityRef.current));
mgr.setChartOverlayVisibility(paperOverlayVisibilityToChart(overlayVisibilityRef.current));
}
setupHistoryScroll(mgr);
setLoadedBarCount(mgr.getRawBarsLength());
@@ -472,7 +476,8 @@ const BacktestAnalysisChart: React.FC<Props> = ({
seriesPriceLabelsEnabled={priceLabels}
showHoverToolbar
candleOverlayToggles={candleOverlayToggles}
onToggleCandleOverlay={onToggleOverlay ? handleToggleCandleOverlay : undefined}
onToggleCandleOverlay={handleToggleCandleOverlay}
showCandleOverlayControls
onToggleIndicatorHidden={handleToggleIndicatorHidden}
/>
)}