커스텀 수정
This commit is contained in:
@@ -71,6 +71,7 @@ import {
|
||||
type ChartCustomOverlaySlotId,
|
||||
createDefaultChartCustomOverlaySelection,
|
||||
isCustomIchimokuCloudVisible,
|
||||
isCustomOverlayPlotControlledType,
|
||||
isCustomPlotSelected,
|
||||
} from './chartCustomOverlay';
|
||||
import type { PlotDef, HLineStyle } from './indicatorRegistry';
|
||||
@@ -1372,12 +1373,14 @@ export class ChartManager {
|
||||
}
|
||||
|
||||
const showPriceLabel = this.shouldShowSeriesPriceLabel(_config, info.lastVal, pane);
|
||||
const lineVisible = this._resolveSeriesVisible(_config, info.id);
|
||||
const series = this.chart.addSeries(LineSeries, {
|
||||
color: info.color,
|
||||
lineWidth: 1,
|
||||
priceLineVisible: false,
|
||||
lastValueVisible: showPriceLabel,
|
||||
title: showPriceLabel ? info.title : '',
|
||||
lastValueVisible: showPriceLabel && lineVisible,
|
||||
title: showPriceLabel && lineVisible ? info.title : '',
|
||||
visible: lineVisible,
|
||||
}, pane);
|
||||
series.setData(seriesData);
|
||||
seriesList.push(series);
|
||||
@@ -2435,9 +2438,13 @@ export class ChartManager {
|
||||
|
||||
/** 사용자 hidden + 세션 오버레이 토글 — entry.config.hidden 은 사용자 의도만 반영 */
|
||||
private _isIndicatorEffectivelyVisible(config: IndicatorConfig): boolean {
|
||||
if (config.hidden === true) return false;
|
||||
if (this._isCustomOverlayApplied() && isCustomOverlayPlotControlledType(config.type)) {
|
||||
return true;
|
||||
}
|
||||
const overlayKey = chartOverlayKeyForType(config.type);
|
||||
if (overlayKey && !this._chartOverlayVisibility[overlayKey]) return false;
|
||||
return config.hidden !== true;
|
||||
return true;
|
||||
}
|
||||
|
||||
getChartCustomOverlayActive(slot: ChartCustomOverlaySlotId = 'custom'): boolean {
|
||||
@@ -2458,14 +2465,15 @@ export class ChartManager {
|
||||
selection: ChartCustomOverlaySelection,
|
||||
slot: ChartCustomOverlaySlotId = 'custom',
|
||||
): void {
|
||||
const defaults = createDefaultChartCustomOverlaySelection();
|
||||
this._customOverlaySlots[slot].selection = {
|
||||
smaPlots: { ...selection.smaPlots },
|
||||
bollinger: { ...selection.bollinger },
|
||||
ichimoku: { ...selection.ichimoku },
|
||||
smaPlots: { ...defaults.smaPlots, ...selection.smaPlots },
|
||||
bollinger: { ...defaults.bollinger, ...selection.bollinger },
|
||||
ichimoku: { ...defaults.ichimoku, ...selection.ichimoku },
|
||||
candle: selection.candle,
|
||||
};
|
||||
if (this._customOverlaySlots[slot].active) {
|
||||
this.syncChartOverlayVisibility();
|
||||
this._syncCustomOverlayVisibilityToChart();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2477,7 +2485,18 @@ export class ChartManager {
|
||||
const other: ChartCustomOverlaySlotId = slot === 'custom' ? 'custom1' : 'custom';
|
||||
this._customOverlaySlots[other].active = false;
|
||||
}
|
||||
this._syncCustomOverlayVisibilityToChart();
|
||||
}
|
||||
|
||||
/** Custom 적용 중 — plot·캔들·구름 가시성을 선택값과 동기화 */
|
||||
private _syncCustomOverlayVisibilityToChart(): void {
|
||||
this.syncChartOverlayVisibility();
|
||||
if (!this._isCustomOverlayApplied()) return;
|
||||
for (const entry of this.indicators.values()) {
|
||||
const config = entry.config;
|
||||
if (!config || !isCustomOverlayPlotControlledType(config.type)) continue;
|
||||
this.applyIndicatorStyle(config);
|
||||
}
|
||||
}
|
||||
|
||||
/** custom 미적용 시 지표 설정 plotVisibility, 적용 시 custom 선택만 반영 */
|
||||
@@ -2496,9 +2515,11 @@ export class ChartManager {
|
||||
}
|
||||
|
||||
private _resolveCandleVisible(): boolean {
|
||||
if (this._isCustomOverlayApplied()) {
|
||||
return this._getAppliedCustomOverlaySelection().candle;
|
||||
}
|
||||
if (!this._chartOverlayVisibility.candle) return false;
|
||||
if (!this._isCustomOverlayApplied()) return true;
|
||||
return this._getAppliedCustomOverlaySelection().candle;
|
||||
return true;
|
||||
}
|
||||
|
||||
private _shouldShowBbBandFillForConfig(config: IndicatorConfig): boolean {
|
||||
|
||||
@@ -1,4 +1,41 @@
|
||||
import type { Timeframe } from '../types';
|
||||
import type { ChartType, Timeframe } from '../types';
|
||||
|
||||
export function toUpbitMarket(symbol: string): string {
|
||||
return symbol.startsWith('KRW-') ? symbol : `KRW-${symbol}`;
|
||||
}
|
||||
|
||||
const TIMEFRAME_KO: Record<Timeframe, string> = {
|
||||
'1m': '1분',
|
||||
'3m': '3분',
|
||||
'5m': '5분',
|
||||
'10m': '10분',
|
||||
'15m': '15분',
|
||||
'30m': '30분',
|
||||
'1h': '1시간',
|
||||
'4h': '4시간',
|
||||
'1D': '1일',
|
||||
'1W': '1주',
|
||||
'1M': '1월',
|
||||
};
|
||||
|
||||
/** 차트·목록용 시간봉 한글 라벨 */
|
||||
export function formatTimeframeKo(raw: string | undefined): string {
|
||||
const tf = normalizeChartTimeframe(raw);
|
||||
return TIMEFRAME_KO[tf] ?? tf;
|
||||
}
|
||||
|
||||
const CHART_TYPE_KO: Record<ChartType, string> = {
|
||||
candlestick: '캔들스틱',
|
||||
bar: '바',
|
||||
line: '라인',
|
||||
area: '영역',
|
||||
baseline: '기준선',
|
||||
};
|
||||
|
||||
export function formatChartTypeKo(type: ChartType | string | undefined): string {
|
||||
if (!type) return '캔들스틱';
|
||||
return CHART_TYPE_KO[type as ChartType] ?? String(type);
|
||||
}
|
||||
|
||||
export function normalizeChartTimeframe(raw: string | undefined): Timeframe {
|
||||
const t = (raw ?? '1h').trim();
|
||||
|
||||
@@ -88,6 +88,17 @@ export const ICHIMOKU_CUSTOM_ROWS: Array<{
|
||||
{ key: 'bearishCloud', label: '하락 구름' },
|
||||
];
|
||||
|
||||
/** Custom 적용 시 plot 단위로 표시를 제어하는 지표 type */
|
||||
export const CUSTOM_OVERLAY_PLOT_CONTROLLED_TYPES = [
|
||||
'SMA',
|
||||
'BollingerBands',
|
||||
'IchimokuCloud',
|
||||
] as const;
|
||||
|
||||
export function isCustomOverlayPlotControlledType(type: string): boolean {
|
||||
return (CUSTOM_OVERLAY_PLOT_CONTROLLED_TYPES as readonly string[]).includes(type);
|
||||
}
|
||||
|
||||
/** 지표 설정 plotVisibility 와 무관 — custom 적용 시 이 맵만 사용 */
|
||||
export function isCustomPlotSelected(
|
||||
sel: ChartCustomOverlaySelection,
|
||||
|
||||
Reference in New Issue
Block a user