알림목록 캔들차트 매매 시그널 표시
This commit is contained in:
@@ -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);
|
||||
}
|
||||
Reference in New Issue
Block a user