diff --git a/core/trading_executor.py b/core/trading_executor.py index e1c3f61..1fe6f50 100644 --- a/core/trading_executor.py +++ b/core/trading_executor.py @@ -888,4 +888,4 @@ class TradingExecutor: return None except Exception as e: logger.error(f"Error getting current position: {e}") - return None + return None \ No newline at end of file diff --git a/run_clean_dashboard.py b/run_clean_dashboard.py index 27186f9..a115b2f 100644 --- a/run_clean_dashboard.py +++ b/run_clean_dashboard.py @@ -53,12 +53,12 @@ async def start_training_pipeline(orchestrator, trading_executor): try: # Start real-time processing await orchestrator.start_realtime_processing() - logger.info("✅ Real-time processing started") + logger.info("Real-time processing started") # Start COB integration if hasattr(orchestrator, 'start_cob_integration'): await orchestrator.start_cob_integration() - logger.info("✅ COB integration started") + logger.info("COB integration started") # Main training loop iteration = 0 diff --git a/web/clean_dashboard.py b/web/clean_dashboard.py index 11f253b..fca0d52 100644 --- a/web/clean_dashboard.py +++ b/web/clean_dashboard.py @@ -43,6 +43,11 @@ from dataclasses import asdict # Setup logger logger = logging.getLogger(__name__) +# Reduce Werkzeug/Dash logging noise +logging.getLogger('werkzeug').setLevel(logging.WARNING) +logging.getLogger('dash').setLevel(logging.WARNING) +logging.getLogger('dash.dash').setLevel(logging.WARNING) + # Import core components from core.config import get_config from core.data_provider import DataProvider @@ -152,6 +157,9 @@ class CleanTradingDashboard: 'https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css' ]) + # Suppress Dash development mode logging + self.app.enable_dev_tools(debug=False, dev_tools_silence_routes_logging=True) + # Setup layout and callbacks self._setup_layout() self._setup_callbacks() @@ -1294,13 +1302,13 @@ class CleanTradingDashboard: """Start continuous signal generation loop""" try: def signal_worker(): - logger.info("🚀 Starting continuous signal generation loop") + logger.info("Starting continuous signal generation loop") # Initialize DQN if not available if not hasattr(self.orchestrator, 'sensitivity_dqn_agent') or self.orchestrator.sensitivity_dqn_agent is None: try: self.orchestrator._initialize_sensitivity_dqn() - logger.info("✅ DQN Agent initialized for signal generation") + logger.info("DQN Agent initialized for signal generation") except Exception as e: logger.warning(f"Could not initialize DQN: {e}") @@ -1337,7 +1345,7 @@ class CleanTradingDashboard: # Start signal generation thread signal_thread = threading.Thread(target=signal_worker, daemon=True) signal_thread.start() - logger.info("✅ Signal generation loop started") + logger.info("Signal generation loop started") except Exception as e: logger.error(f"Error starting signal generation loop: {e}") @@ -1481,7 +1489,7 @@ class CleanTradingDashboard: self.recent_decisions = self.recent_decisions[-20:] # Log signal generation - logger.info(f"📊 Generated {signal['action']} signal for {signal['symbol']} " + logger.info(f"Generated {signal['action']} signal for {signal['symbol']} " f"(conf: {signal['confidence']:.2f}, model: {signal.get('model', 'UNKNOWN')})") # Trigger training if DQN agent is available @@ -1580,7 +1588,7 @@ class CleanTradingDashboard: result = self.trading_executor.execute_trade(symbol, action, 0.01) # Small size for testing if result: decision['executed'] = True - logger.info(f"✅ Manual {action} executed at ${current_price:.2f}") + logger.info(f"Manual {action} executed at ${current_price:.2f}") # Create a trade record for tracking trade_record = { @@ -1612,13 +1620,13 @@ class CleanTradingDashboard: decision['executed'] = False decision['blocked'] = True decision['block_reason'] = "Trading executor returned False" - logger.warning(f"❌ Manual {action} failed - executor returned False") + logger.warning(f"Manual {action} failed - executor returned False") except Exception as e: decision['executed'] = False decision['blocked'] = True decision['block_reason'] = str(e) - logger.error(f"❌ Manual {action} failed with error: {e}") + logger.error(f"Manual {action} failed with error: {e}") # Add to recent decisions for display self.recent_decisions.append(decision) @@ -1671,9 +1679,9 @@ class CleanTradingDashboard: import threading threading.Thread(target=self._start_cob_data_subscription, daemon=True).start() - logger.info("✅ COB RL integration initialized successfully") - logger.info("🧠 1B parameter model ready for inference") - logger.info("📊 COB data subscription started") + logger.info("COB RL integration initialized successfully") + logger.info("1B parameter model ready for inference") + logger.info("COB data subscription started") except Exception as e: logger.error(f"Failed to initialize COB integration: {e}") @@ -2053,8 +2061,12 @@ class CleanTradingDashboard: def run_server(self, host='127.0.0.1', port=8051, debug=False): """Run the dashboard server""" + # Set logging level for Flask/Werkzeug to reduce noise + if not debug: + logging.getLogger('werkzeug').setLevel(logging.ERROR) + logger.info(f"Starting Clean Trading Dashboard at http://{host}:{port}") - self.app.run(host=host, port=port, debug=debug) + self.app.run(host=host, port=port, debug=debug, dev_tools_silence_routes_logging=True) def stop(self): """Stop the dashboard and cleanup resources""" @@ -2120,8 +2132,8 @@ class CleanTradingDashboard: self._stream_update_count = 1 if self._stream_update_count % 100 == 0: # Every 100 updates - logger.info(f"📈 Universal Stream: {self._stream_update_count} updates processed for {consumer_name}") - logger.debug(f"📊 Current data: ticks={len(data_packet.get('ticks', []))}, " + logger.info(f"Universal Stream: {self._stream_update_count} updates processed for {consumer_name}") + logger.debug(f"Current data: ticks={len(data_packet.get('ticks', []))}, " f"tf_symbols={len(data_packet.get('multi_timeframe', {}))}") except Exception as e: