알림목록 캔들차트 매매 시그널 표시

This commit is contained in:
Macbook
2026-06-09 00:55:37 +09:00
parent c9b0441500
commit 8a2d8054ad
5 changed files with 125 additions and 8 deletions
@@ -0,0 +1,65 @@
/**
* 알림 목록 미니 차트 — 매매 시그널 마커
*/
import type { ChartManager } from './ChartManager';
export interface TradeSignalChartMarker {
candleTime: number;
signalType: 'BUY' | 'SELL';
price: number;
}
/** 알림 candleTime → 차트 bar time (정확 일치 또는 최근접 bar) */
export function resolveSignalMarkerBarTime(
mgr: ChartManager,
candleTimeSec: number,
): number | null {
if (!Number.isFinite(candleTimeSec) || candleTimeSec <= 0) return null;
if (mgr.getBarAtTime(candleTimeSec)) return candleTimeSec;
const bars = mgr.getRawBars();
if (bars.length === 0) return null;
let bestTime = bars[0].time;
let bestDist = Math.abs(bars[0].time - candleTimeSec);
for (let i = 1; i < bars.length; i++) {
const t = bars[i].time;
const dist = Math.abs(t - candleTimeSec);
if (dist < bestDist) {
bestDist = dist;
bestTime = t;
}
}
const maxSnapSec = Math.max(86400, estimateBarIntervalSec(bars) * 2);
return bestDist <= maxSnapSec ? bestTime : null;
}
function estimateBarIntervalSec(bars: { time: number }[]): number {
if (bars.length < 2) return 60;
const last = bars[bars.length - 1].time - bars[bars.length - 2].time;
return last > 0 ? last : 60;
}
export function buildNotificationSignalMarkers(
mgr: ChartManager,
marker: TradeSignalChartMarker | undefined,
): Array<{ time: number; type: string; price: number }> {
if (!marker || !Number.isFinite(marker.price) || marker.price <= 0) return [];
const time = resolveSignalMarkerBarTime(mgr, marker.candleTime);
if (time == null) return [];
return [{ time, type: marker.signalType, price: marker.price }];
}
export function applyNotificationSignalMarkers(
mgr: ChartManager,
marker: TradeSignalChartMarker | undefined,
showPrice = false,
): void {
const signals = buildNotificationSignalMarkers(mgr, marker);
if (signals.length === 0) {
mgr.clearBacktestMarkers();
return;
}
mgr.setBacktestMarkers(signals, showPrice);
}