#!/usr/bin/env python3 import time from web.clean_dashboard import CleanTradingDashboard from core.data_provider import DataProvider from core.orchestrator import TradingOrchestrator from core.trading_executor import TradingExecutor print('Testing signal preservation improvements...') # Create dashboard instance data_provider = DataProvider() orchestrator = TradingOrchestrator(data_provider) trading_executor = TradingExecutor() dashboard = CleanTradingDashboard( data_provider=data_provider, orchestrator=orchestrator, trading_executor=trading_executor ) print(f'Initial recent_decisions count: {len(dashboard.recent_decisions)}') # Add test signals similar to the user's example test_signals = [ {'timestamp': '20:39:32', 'action': 'HOLD', 'confidence': 0.01, 'price': 2420.07}, {'timestamp': '20:39:02', 'action': 'HOLD', 'confidence': 0.01, 'price': 2416.89}, {'timestamp': '20:38:45', 'action': 'BUY', 'confidence': 0.65, 'price': 2415.23}, {'timestamp': '20:38:12', 'action': 'SELL', 'confidence': 0.72, 'price': 2413.45}, {'timestamp': '20:37:58', 'action': 'HOLD', 'confidence': 0.02, 'price': 2412.89} ] # Add signals to dashboard for signal_data in test_signals: test_signal = { 'timestamp': signal_data['timestamp'], 'action': signal_data['action'], 'confidence': signal_data['confidence'], 'price': signal_data['price'], 'symbol': 'ETH/USDT', 'executed': False, 'blocked': True, 'manual': False, 'model': 'TEST' } dashboard._process_dashboard_signal(test_signal) print(f'After adding {len(test_signals)} signals: {len(dashboard.recent_decisions)}') # Test with larger batch to verify new limits print('\nAdding 50 more signals to test preservation...') for i in range(50): test_signal = { 'timestamp': f'20:3{i//10}:{i%60:02d}', 'action': 'HOLD' if i % 3 == 0 else ('BUY' if i % 2 == 0 else 'SELL'), 'confidence': 0.01 + (i * 0.01), 'price': 2420.0 + i, 'symbol': 'ETH/USDT', 'executed': False, 'blocked': True, 'manual': False, 'model': 'BATCH_TEST' } dashboard._process_dashboard_signal(test_signal) print(f'After adding 50 more signals: {len(dashboard.recent_decisions)}') # Display recent signals print('\nRecent signals (last 10):') for signal in dashboard.recent_decisions[-10:]: timestamp = dashboard._get_signal_attribute(signal, 'timestamp', 'Unknown') action = dashboard._get_signal_attribute(signal, 'action', 'UNKNOWN') confidence = dashboard._get_signal_attribute(signal, 'confidence', 0) price = dashboard._get_signal_attribute(signal, 'price', 0) print(f' {timestamp} {action}({confidence*100:.1f}%) ${price:.2f}') # Test cleanup behavior with tick cache print('\nTesting tick cache cleanup behavior...') dashboard.tick_cache = [ {'datetime': time.time() - 3600, 'symbol': 'ETHUSDT', 'price': 2400.0}, # 1 hour ago {'datetime': time.time() - 1800, 'symbol': 'ETHUSDT', 'price': 2410.0}, # 30 min ago {'datetime': time.time() - 900, 'symbol': 'ETHUSDT', 'price': 2420.0}, # 15 min ago ] # This should NOT clear signals aggressively anymore signals_before = len(dashboard.recent_decisions) dashboard._clear_old_signals_for_tick_range() signals_after = len(dashboard.recent_decisions) print(f'Signals before cleanup: {signals_before}') print(f'Signals after cleanup: {signals_after}') print(f'Signals preserved: {signals_after}/{signals_before} ({(signals_after/signals_before)*100:.1f}%)') print('\n✅ Signal preservation test completed!') print('Changes made:') print('- Increased recent_decisions limit from 20/50 to 200') print('- Made tick cache cleanup much more conservative') print('- Only clears when >500 signals and removes >20% of old data') print('- Extended time range for signal preservation')