// 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');
});