/** * Exchange Learning Panel - Displays multi-exchange performance metrics */ import { useState, useEffect } from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Progress } from '@/components/ui/progress'; import { exchangeLearningTracker, ExchangeType } from '@/core/exchangeLearningTracker'; import { TrendingUp, TrendingDown, Activity, Target, Zap, Clock } from 'lucide-react'; const EXCHANGE_COLORS: Record = { binance: 'bg-warning/20 text-warning border-warning/30', kraken: 'bg-primary/20 text-primary border-primary/30', alpaca: 'bg-success/20 text-success border-success/30', capital: 'bg-primary/20 text-primary border-primary/30' }; const EXCHANGE_LABELS: Record = { binance: '🟡 Binance', kraken: '🐙 Kraken', alpaca: '🦙 Alpaca', capital: '💼 Capital.com' }; export function ExchangeLearningPanel() { const [metrics, setMetrics] = useState(exchangeLearningTracker.getAllExchangeMetrics()); const [overallWinRate, setOverallWinRate] = useState(0.5); const [confidence, setConfidence] = useState(0.5); useEffect(() => { // Load historical data on mount exchangeLearningTracker.loadFromDatabase(); const interval = setInterval(() => { setMetrics(exchangeLearningTracker.getAllExchangeMetrics()); setOverallWinRate(exchangeLearningTracker.getOverallWinRate()); setConfidence(exchangeLearningTracker.getLearningConfidence()); }, 2000); return () => clearInterval(interval); }, []); const totalTrades = exchangeLearningTracker.getTotalTrades(); return ( Exchange Learning {totalTrades} trades {/* Overall Metrics */}
Overall Win Rate
0.51 ? 'text-success' : 'text-destructive'}`}> {(overallWinRate * 100).toFixed(1)}% {overallWinRate > 0.51 ? ( ) : ( )}
Learning Confidence
{(confidence * 100).toFixed(0)}%
{/* Per-Exchange Metrics */}
{metrics.map(m => (
{EXCHANGE_LABELS[m.exchange]} {m.totalTrades} trades
Win Rate
0.51 ? 'text-success' : 'text-muted-foreground'}`}> {(m.winRate * 100).toFixed(1)}%
Avg Profit
0 ? 'text-success' : 'text-destructive'}`}> {m.avgProfit > 0 ? '+' : ''}{m.avgProfit.toFixed(2)}%
Latency
{m.avgLatency.toFixed(0)}ms
Success
0.95 ? 'text-success' : 'text-warning'}`}> {(m.successRate * 100).toFixed(0)}%
{m.bestSymbol && (
Best: {m.bestSymbol} {m.worstSymbol && ( Worst: {m.worstSymbol} )}
)}
))}
); }