ENTRY PRICE
${signal.entry.toFixed(signal.pair.includes("JPY") ? 2 : 4)}
STOP LOSS
${signal.stopLoss.toFixed(signal.pair.includes("JPY") ? 2 : 4)}
TAKE PROFIT
${signal.takeProfit.toFixed(signal.pair.includes("JPY") ? 2 : 4)}
Rationale: ${signal.rationale}
`;
placeholder.classList.add('hidden');
display.classList.remove('hidden');
}
function renderHistory() {
const log = document.getElementById('history-log');
log.innerHTML = ''; // Clear existing
signalHistory.slice(0, 10).forEach(s => { // Show last 10
const pipDigits = s.pair.includes("JPY") ? 2 : 4;
log.innerHTML += `
| ${s.time.toLocaleTimeString()} |
${s.pair} |
${s.type} |
${s.entry.toFixed(pipDigits)} |
${s.stopLoss.toFixed(pipDigits)} |
${s.takeProfit.toFixed(pipDigits)} |
`;
});
}
// --- PDF Generation ---
function downloadPdf() {
if (signalHistory.length === 0) return;
const { jsPDF } = window.jspdf;
const pdf = new jsPDF();
pdf.setFont('helvetica', 'bold');
pdf.setFontSize(22);
pdf.text('Forex Signal Log', 105, 20, { align: 'center' });
const head = [['Time', 'Pair', 'Signal', 'Entry', 'Stop Loss', 'Take Profit', 'Strategy']];
const body = signalHistory.map(s => {
const pipDigits = s.pair.includes("JPY") ? 2 : 4;
return [
s.time.toLocaleString(),
s.pair,
s.type,
s.entry.toFixed(pipDigits),
s.stopLoss.toFixed(pipDigits),
s.takeProfit.toFixed(pipDigits),
s.strategy
];
});
pdf.autoTable({
startY: 30, head: head, body: body, theme: 'grid',
headStyles: { fillColor: '#111827' }
});
pdf.save('Forex_Signal_Log.pdf');
}
document.getElementById('generate-btn').addEventListener('click', generateSignal);
document.getElementById('download-pdf-btn').addEventListener('click', downloadPdf);
});