diff --git a/.vscode/launch.json b/.vscode/launch.json index 7ec82cd..916c037 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,15 +1,32 @@ { "version": "0.2.0", "configurations": [ - { - "name": "📊 Enhanced Web Dashboard", + "name": "📊 Enhanced Web Dashboard (Safe)", "type": "python", "request": "launch", - "program": "main.py", + "program": "main_clean.py", "args": [ "--port", - "8050" + "8051", + "--no-training" + ], + "console": "integratedTerminal", + "justMyCode": false, + "env": { + "PYTHONUNBUFFERED": "1", + "ENABLE_REALTIME_CHARTS": "1" + }, + "preLaunchTask": "Kill Stale Processes" + }, + { + "name": "📊 Enhanced Web Dashboard (Full)", + "type": "python", + "request": "launch", + "program": "main_clean.py", + "args": [ + "--port", + "8051" ], "console": "integratedTerminal", "justMyCode": false, @@ -20,6 +37,29 @@ }, "preLaunchTask": "Kill Stale Processes" }, + { + "name": "📊 Clean Dashboard (Legacy)", + "type": "python", + "request": "launch", + "program": "run_clean_dashboard.py", + "console": "integratedTerminal", + "justMyCode": false, + "env": { + "PYTHONUNBUFFERED": "1", + "ENABLE_REALTIME_CHARTS": "1" + } + }, + { + "name": "🚀 Main System", + "type": "python", + "request": "launch", + "program": "main.py", + "console": "integratedTerminal", + "justMyCode": false, + "env": { + "PYTHONUNBUFFERED": "1" + } + }, { "name": "🔬 System Test & Validation", "type": "python", diff --git a/.vscode/tasks.json b/.vscode/tasks.json index ed31470..ffcf7ef 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -4,20 +4,21 @@ { "label": "Kill Stale Processes", "type": "shell", - "command": "python", + "command": "powershell", "args": [ - "scripts/kill_stale_processes.py" + "-Command", + "Get-Process python | Where-Object {$_.ProcessName -eq 'python' -and $_.MainWindowTitle -like '*dashboard*'} | Stop-Process -Force; Start-Sleep -Seconds 1" ], + "group": "build", "presentation": { - "reveal": "always", + "echo": true, + "reveal": "silent", + "focus": false, "panel": "shared", - "clear": true + "showReuseMessage": false, + "clear": false }, - "problemMatcher": [], - "group": { - "kind": "build", - "isDefault": false - } + "problemMatcher": [] }, { "label": "Start TensorBoard", diff --git a/core/unified_data_stream.py b/core/unified_data_stream.py index 36e3d45..fa15842 100644 --- a/core/unified_data_stream.py +++ b/core/unified_data_stream.py @@ -33,7 +33,17 @@ import json from .config import get_config from .data_provider import DataProvider, MarketTick from .universal_data_adapter import UniversalDataAdapter, UniversalDataStream -from .enhanced_orchestrator import MarketState, TradingAction +from .trading_action import TradingAction + +# Simple MarketState placeholder +@dataclass +class MarketState: + """Market state for unified data stream""" + timestamp: datetime + symbol: str + price: float + volume: float + data: Dict[str, Any] = field(default_factory=dict) logger = logging.getLogger(__name__) diff --git a/main_clean.py b/main_clean.py new file mode 100644 index 0000000..3965ef2 --- /dev/null +++ b/main_clean.py @@ -0,0 +1,133 @@ +#!/usr/bin/env python3 +""" +Clean Main Entry Point for Enhanced Trading Dashboard + +This is the main entry point that safely launches the clean dashboard +with proper error handling and optimized settings. +""" + +import os +import sys +import logging +import argparse +from typing import Optional + +# Add project root to path +sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) + +# Import core components +try: + from core.config import setup_logging + from core.data_provider import DataProvider + from core.orchestrator import TradingOrchestrator + from core.trading_executor import TradingExecutor + from web.clean_dashboard import create_clean_dashboard +except ImportError as e: + print(f"Error importing core modules: {e}") + sys.exit(1) + +logger = logging.getLogger(__name__) + +def create_safe_orchestrator() -> Optional[TradingOrchestrator]: + """Create orchestrator with safe CNN model handling""" + try: + # Create orchestrator with basic configuration (uses correct constructor parameters) + orchestrator = TradingOrchestrator( + enhanced_rl_training=False # Disable problematic training initially + ) + + logger.info("Trading orchestrator created successfully") + return orchestrator + + except Exception as e: + logger.error(f"Error creating orchestrator: {e}") + logger.info("Continuing without orchestrator - dashboard will run in view-only mode") + return None + +def create_safe_trading_executor() -> Optional[TradingExecutor]: + """Create trading executor with safe configuration""" + try: + # TradingExecutor only accepts config_path parameter + trading_executor = TradingExecutor(config_path="config.yaml") + + logger.info("Trading executor created successfully") + return trading_executor + + except Exception as e: + logger.error(f"Error creating trading executor: {e}") + logger.info("Continuing without trading executor - dashboard will be view-only") + return None + +def main(): + """Main entry point for clean dashboard""" + parser = argparse.ArgumentParser(description='Enhanced Trading Dashboard') + parser.add_argument('--port', type=int, default=8050, help='Dashboard port (default: 8050)') + parser.add_argument('--host', type=str, default='127.0.0.1', help='Dashboard host (default: 127.0.0.1)') + parser.add_argument('--debug', action='store_true', help='Enable debug mode') + parser.add_argument('--no-training', action='store_true', help='Disable ML training for stability') + + args = parser.parse_args() + + # Setup logging + try: + setup_logging() + logger.info("================================================================================") + logger.info("CLEAN ENHANCED TRADING DASHBOARD") + logger.info("================================================================================") + logger.info(f"Starting on http://{args.host}:{args.port}") + logger.info("Features: Real-time Charts, Trading Interface, Model Monitoring") + logger.info("================================================================================") + except Exception as e: + print(f"Error setting up logging: {e}") + # Continue without logging setup + + # Set environment variables for optimization + os.environ['ENABLE_REALTIME_CHARTS'] = '1' + if not args.no_training: + os.environ['ENABLE_NN_MODELS'] = '1' + + try: + # Create data provider + logger.info("Initializing data provider...") + data_provider = DataProvider(symbols=['ETH/USDT', 'BTC/USDT']) + + # Create orchestrator (with safe CNN handling) + logger.info("Initializing trading orchestrator...") + orchestrator = create_safe_orchestrator() + + # Create trading executor + logger.info("Initializing trading executor...") + trading_executor = create_safe_trading_executor() + + # Create and run dashboard + logger.info("Creating clean dashboard...") + dashboard = create_clean_dashboard( + data_provider=data_provider, + orchestrator=orchestrator, + trading_executor=trading_executor + ) + + # Start the dashboard server + logger.info(f"Starting dashboard server on http://{args.host}:{args.port}") + dashboard.run_server( + host=args.host, + port=args.port, + debug=args.debug + ) + + except KeyboardInterrupt: + logger.info("Dashboard stopped by user") + except Exception as e: + logger.error(f"Error running dashboard: {e}") + + # Try to provide helpful error message + if "model.fit" in str(e) or "CNN" in str(e): + logger.error("CNN model training error detected. Try running with --no-training flag") + logger.error("Command: python main_clean.py --no-training") + + sys.exit(1) + finally: + logger.info("Clean dashboard shutdown complete") + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/training/williams_market_structure.py b/training/williams_market_structure.py index dd96739..35760f2 100644 --- a/training/williams_market_structure.py +++ b/training/williams_market_structure.py @@ -965,8 +965,12 @@ class WilliamsMarketStructure: logger.info(f"CNN Training with X_shape: {X_train_batch.shape}, y_shape: {y_train_batch.shape}") # Perform a single step of training (online learning) # Use the wrapper's fit method, not the model's directly - self.cnn_model.fit(X_train_batch, y_train_batch, batch_size=1, epochs=1, verbose=0, callbacks=[]) - logger.info(f"CNN online training step completed for pivot at index {self.previous_pivot_details_for_cnn['pivot'].index}.") + try: + self.cnn_model.fit(X_train_batch, y_train_batch, batch_size=1, epochs=1, verbose=0, callbacks=[]) + logger.info(f"CNN online training step completed for pivot at index {self.previous_pivot_details_for_cnn['pivot'].index}.") + except Exception as fit_error: + logger.error(f"CNN model fit error: {fit_error}") + logger.warning("CNN training step failed - continuing without training") else: logger.warning("CNN Training: Skipping due to invalid X_train or y_train.") diff --git a/web/clean_dashboard.py b/web/clean_dashboard.py index e3952dc..2c6da58 100644 --- a/web/clean_dashboard.py +++ b/web/clean_dashboard.py @@ -69,14 +69,16 @@ except ImportError: COB_INTEGRATION_AVAILABLE = False logger.warning("COB integration not available") -# Add Universal Data Stream imports -try: - from core.unified_data_stream import UnifiedDataStream - from core.universal_data_adapter import UniversalDataAdapter, UniversalDataStream as UDS - UNIFIED_STREAM_AVAILABLE = True -except ImportError: - UNIFIED_STREAM_AVAILABLE = False - logger.warning("Unified Data Stream not available") +# Universal Data Stream - temporarily disabled due to import issues +UNIFIED_STREAM_AVAILABLE = False + +# Placeholder class for disabled Universal Data Stream +class UnifiedDataStream: + """Placeholder for disabled Universal Data Stream""" + def __init__(self, *args, **kwargs): + pass + def register_consumer(self, *args, **kwargs): + return "disabled" # Import RL COB trader for 1B parameter model integration from core.realtime_rl_cob_trader import RealtimeRLCOBTrader, PredictionResult @@ -2133,7 +2135,7 @@ class CleanTradingDashboard: opening_trade_record = { 'symbol': symbol, 'side': action, - 'quantity': size, + 'quantity': decision['size'], # Use size from decision 'entry_price': current_price, 'leverage': self.current_leverage, # Store leverage at entry 'pnl': 0.0, # Will be updated when position closes