/** * Signal Panel — Displays active signals with lot sizing, SL/TP, and confluence details */ export class SignalPanel { constructor({ onTakeTrade }) { this.onTakeTrade = onTakeTrade; this.signals = []; this.signalHistory = []; } updateSignals(signals, symbol) { this.signals = signals || []; this._render(symbol); } _render(symbol) { const list = document.getElementById('signal-list'); const countBadge = document.getElementById('signal-count'); if (!list) return; if (countBadge) { countBadge.textContent = this.signals.length; } if (this.signals.length === 0) { list.innerHTML = `
📡

Scanning for setups...

Waiting for confluence at key levels

`; return; } list.innerHTML = this.signals.map((sig, idx) => this._renderSignalCard(sig, idx, symbol)).join(''); // Attach event listeners list.querySelectorAll('.btn-take-trade').forEach(btn => { btn.addEventListener('click', () => { const index = parseInt(btn.dataset.index); if (this.signals[index]) { this.onTakeTrade(this.signals[index]); } }); }); } _renderSignalCard(signal, index, symbol) { const isLong = signal.type === 'LONG'; const dirClass = isLong ? 'long' : 'short'; const decimals = this._getDecimals(signal.symbol || symbol); const gradeClass = `grade-${signal.quality.toLowerCase()}`; return `
${signal.type} ${signal.quality}
Entry ${signal.entry.toFixed(decimals)}
Stop Loss ${signal.sl.toFixed(decimals)}
TP1 (1:2) ${signal.tp1.toFixed(decimals)}
TP2 (1:3) ${signal.tp2 ? signal.tp2.toFixed(decimals) : '—'}
Lot Size ${signal.lotSize.toFixed(2)}
Risk $${signal.riskAmount.toFixed(2)}
R:R ${signal.rrRatio.toFixed(1)} ${signal.slPips ? signal.slPips.toFixed(1) + ' pips' : ''}
${(signal.confluences || []).map(c => `✓ ${c}`).join('')}
`; } _getDecimals(symbol) { if (symbol === 'XAUUSD') return 2; if (symbol === 'BTCUSDT' || symbol === 'ETHUSDT') return 2; return 5; } } export default SignalPanel;