import { useEffect, useState } from 'react'; import { Card } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { supabase } from '@/integrations/supabase/client'; import { TrendingUp, Target, Zap, Activity } from 'lucide-react'; type Stats = { totalSignals: number; longSignals: number; shortSignals: number; optimalSignals: number; averageStrength: number; lheCount: number; averageCoherence: number; highestStrength: number; }; export const OptimalEntryStats = () => { const [stats, setStats] = useState(null); const [loading, setLoading] = useState(true); useEffect(() => { fetchStats(); const interval = setInterval(fetchStats, 30000); // Refresh every 30s return () => clearInterval(interval); }, []); const fetchStats = async () => { try { // Fetch signal statistics const { data: signals, error: signalsError } = await supabase .from('trading_signals') .select('signal_type, strength, reason, coherence') .gte('timestamp', new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString()); if (signalsError) throw signalsError; // Fetch LHE count const { data: lheData, error: lheError } = await supabase .from('lighthouse_events') .select('is_lhe') .gte('timestamp', new Date(Date.now() - 24 * 60 * 60 * 1000).toISOString()) .eq('is_lhe', true); if (lheError) throw lheError; const signalArray = signals || []; const longCount = signalArray.filter(s => s.signal_type === 'LONG').length; const shortCount = signalArray.filter(s => s.signal_type === 'SHORT').length; const optimalCount = signalArray.filter(s => s.reason.startsWith('🎯 OPTIMAL')).length; const avgStrength = signalArray.length > 0 ? signalArray.reduce((sum, s) => sum + Number(s.strength), 0) / signalArray.length : 0; const avgCoherence = signalArray.length > 0 ? signalArray.reduce((sum, s) => sum + Number(s.coherence), 0) / signalArray.length : 0; const highestStrength = signalArray.length > 0 ? Math.max(...signalArray.map(s => Number(s.strength))) : 0; setStats({ totalSignals: signalArray.length, longSignals: longCount, shortSignals: shortCount, optimalSignals: optimalCount, averageStrength: avgStrength, lheCount: lheData?.length || 0, averageCoherence: avgCoherence, highestStrength, }); } catch (error) { console.error('Error fetching stats:', error); } finally { setLoading(false); } }; if (loading) { return (

Optimal Entry Statistics

Loading statistics...

); } if (!stats) { return null; } return (
24h

Optimal Signals

{stats.optimalSignals}

{stats.totalSignals > 0 ? `${((stats.optimalSignals / stats.totalSignals) * 100).toFixed(1)}% of total` : 'No signals yet'}

LONG

Long Signals

{stats.longSignals}

Avg Strength: {(stats.averageStrength * 100).toFixed(0)}%

LHE

Lighthouse Events

{stats.lheCount}

High coherence detections

Γ

Avg Coherence

{stats.averageCoherence.toFixed(3)}

Peak: {stats.highestStrength.toFixed(3)}

); };