// TradeFlow Bot - Main JavaScript // Mock Data Generators const generateMockSignal = (index = 0) => { const actions = ['BUY', 'SELL']; const pairs = ['BTC/USDT', 'ETH/USDT', 'SOL/USDT', 'AVAX/USDT', 'MATIC/USDT']; const strategies = ['TrendMaster v2.1', 'ScalpPro 3.0', 'MoonSignal Alpha', 'GridFlow Pro']; const statuses = ['executed', 'pending', 'failed']; return { id: `sig_${Date.now()}_${index}`, timestamp: new Date(Date.now() - Math.random() * 3600000), pair: pairs[Math.floor(Math.random() * pairs.length)], action: actions[Math.floor(Math.random() * actions.length)], price: (Math.random() * 50000 + 1000).toFixed(2), strategy: strategies[Math.floor(Math.random() * strategies.length)], exchange: ['Bitget', 'Pionex', 'Bybit'][Math.floor(Math.random() * 3)], status: statuses[Math.floor(Math.random() * statuses.length)], pnl: (Math.random() * 200 - 50).toFixed(2) }; }; const generateMockTrade = (index = 0) => { const signal = generateMockSignal(index); return { ...signal, executionTime: new Date(Date.now() - Math.random() * 86400000), filledPrice: (parseFloat(signal.price) * (1 + (Math.random() - 0.5) * 0.001)).toFixed(2), filledAmount: (Math.random() * 2 + 0.1).toFixed(4) }; }; // DOM Manipulation Helpers const formatTime = (date) => { return new Intl.DateTimeFormat('en-US', { hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false }).format(date); }; const formatDate = (date) => { return new Intl.DateTimeFormat('en-US', { month: 'short', day: 'numeric', hour: '2-digit', minute: '2-digit' }).format(date); }; const getStatusBadge = (status) => { const classes = { 'executed': 'status-connected', 'pending': 'status-pending', 'failed': 'status-disconnected' }; const icons = { 'executed': 'check-circle', 'pending': 'clock', 'failed': 'x-circle' }; return ` ${status} `; }; // Signal Feed Manager class SignalFeedManager { constructor(containerId) { this.container = document.getElementById(containerId); this.signals = []; this.maxSignals = 10; } addSignal(signal) { this.signals.unshift(signal); if (this.signals.length > this.maxSignals) { this.signals.pop(); } this.render(); } render() { if (!this.container) return; const signalsHTML = this.signals.map(signal => `
${signal.action} ${signal.pair}
$${signal.price} Price
${signal.strategy} ${signal.exchange} ${formatTime(signal.timestamp)}
${getStatusBadge(signal.status)} ${signal.pnl ? `Est. PnL: $${signal.pnl}` : ''}
`).join(''); this.container.innerHTML = signalsHTML; feather.replace(); } startLiveFeed() { // Initial load for (let i = 0; i < 5; i++) { setTimeout(() => { this.addSignal(generateMockSignal(i)); }, i * 200); } // Live updates every 3-7 seconds const scheduleNext = () => { const delay = Math.random() * 4000 + 3000; setTimeout(() => { this.addSignal(generateMockSignal()); scheduleNext(); }, delay); }; scheduleNext(); } } // Trades Table Manager class TradesTableManager { constructor(containerId) { this.container = document.getElementById(containerId); this.trades = []; this.maxTrades = 8; } addTrade(trade) { this.trades.unshift(trade); if (this.trades.length > this.maxTrades) { this.trades.pop(); } this.render(); } render() { if (!this.container) return; const tradesHTML = this.trades.map(trade => ` ${formatDate(trade.executionTime)} ${trade.pair} ${trade.action} ${trade.exchange} ${getStatusBadge(trade.status)} ${parseFloat(trade.pnl) > 0 ? '+' : ''}$${trade.pnl} `).join(''); this.container.innerHTML = tradesHTML; feather.replace(); } loadInitial() { for (let i = 0; i < this.maxTrades; i++) { this.trades.push(generateMockTrade(i)); } this.render(); } } // Initialize App document.addEventListener('DOMContentLoaded', () => { // Initialize signal feed const signalManager = new SignalFeedManager('signal-feed'); signalManager.startLiveFeed(); // Initialize trades table const tradesManager = new TradesTableManager('trades-table'); tradesManager.loadInitial(); // Auto-update stats const updateStats = () => { const statsCards = document.querySelectorAll('tf-stats-card'); statsCards.forEach(card => { if (card.getAttribute('title') === 'Total PnL') { const currentValue = parseFloat(card.getAttribute('value').replace(/[$,]/g, '')); const change = (Math.random() - 0.5) * 100; const newValue = (currentValue + change).toFixed(2); card.setAttribute('value', `$${newValue.replace(/\B(?=(\d{3})+(?!\d))/g, ',')}`); } if (card.getAttribute('title') === 'Total Trades') { const currentValue = parseInt(card.getAttribute('value')); if (Math.random() > 0.8) { card.setAttribute('value', (currentValue + 1).toString()); } } }); }; // Update stats every 10 seconds setInterval(updateStats, 10000); // Page navigation window.navigateTo = (page) => { window.location.href = page; }; console.log('🚀 TradeFlow Bot initialized successfully'); });