#!/usr/bin/env python3 """ Test script to verify that both model prediction and trading statistics issues are fixed """ import sys import os sys.path.append(os.path.join(os.path.dirname(__file__), '..')) from core.orchestrator import TradingOrchestrator from core.data_provider import DataProvider from core.trading_executor import TradingExecutor import asyncio import logging # Set up logging logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) async def test_model_predictions(): """Test that model predictions are working correctly""" logger.info("=" * 60) logger.info("TESTING MODEL PREDICTIONS") logger.info("=" * 60) # Initialize components data_provider = DataProvider() orchestrator = TradingOrchestrator(data_provider) # Check model registration logger.info("1. Checking model registration...") models = orchestrator.model_registry.get_all_models() logger.info(f" Registered models: {list(models.keys()) if models else 'None'}") # Test making a decision logger.info("2. Testing trading decision generation...") decision = await orchestrator.make_trading_decision('ETH/USDT') if decision: logger.info(f" ✅ Decision generated: {decision.action} (confidence: {decision.confidence:.3f})") logger.info(f" ✅ Reasoning: {decision.reasoning}") return True else: logger.error(" ❌ No decision generated") return False def test_trading_statistics(): """Test that trading statistics calculations are working correctly""" logger.info("=" * 60) logger.info("TESTING TRADING STATISTICS") logger.info("=" * 60) # Initialize trading executor trading_executor = TradingExecutor() # Check if we have any trades trade_history = trading_executor.get_trade_history() logger.info(f"1. Current trade history: {len(trade_history)} trades") # Get daily stats daily_stats = trading_executor.get_daily_stats() logger.info("2. Daily statistics from trading executor:") logger.info(f" Total trades: {daily_stats.get('total_trades', 0)}") logger.info(f" Winning trades: {daily_stats.get('winning_trades', 0)}") logger.info(f" Losing trades: {daily_stats.get('losing_trades', 0)}") logger.info(f" Win rate: {daily_stats.get('win_rate', 0.0) * 100:.1f}%") logger.info(f" Avg winning trade: ${daily_stats.get('avg_winning_trade', 0.0):.2f}") logger.info(f" Avg losing trade: ${daily_stats.get('avg_losing_trade', 0.0):.2f}") logger.info(f" Total P&L: ${daily_stats.get('total_pnl', 0.0):.2f}") # Simulate some trades if we don't have any if daily_stats.get('total_trades', 0) == 0: logger.info("3. No trades found - simulating some test trades...") # Add some mock trades to the trade history from core.trading_executor import TradeRecord from datetime import datetime # Add a winning trade winning_trade = TradeRecord( symbol='ETH/USDT', side='LONG', quantity=0.01, entry_price=2500.0, exit_price=2550.0, entry_time=datetime.now(), exit_time=datetime.now(), pnl=0.50, # $0.50 profit fees=0.01, confidence=0.8 ) trading_executor.trade_history.append(winning_trade) # Add a losing trade losing_trade = TradeRecord( symbol='ETH/USDT', side='LONG', quantity=0.01, entry_price=2500.0, exit_price=2480.0, entry_time=datetime.now(), exit_time=datetime.now(), pnl=-0.20, # $0.20 loss fees=0.01, confidence=0.7 ) trading_executor.trade_history.append(losing_trade) # Get updated stats daily_stats = trading_executor.get_daily_stats() logger.info(" Updated statistics after adding test trades:") logger.info(f" Total trades: {daily_stats.get('total_trades', 0)}") logger.info(f" Winning trades: {daily_stats.get('winning_trades', 0)}") logger.info(f" Losing trades: {daily_stats.get('losing_trades', 0)}") logger.info(f" Win rate: {daily_stats.get('win_rate', 0.0) * 100:.1f}%") logger.info(f" Avg winning trade: ${daily_stats.get('avg_winning_trade', 0.0):.2f}") logger.info(f" Avg losing trade: ${daily_stats.get('avg_losing_trade', 0.0):.2f}") logger.info(f" Total P&L: ${daily_stats.get('total_pnl', 0.0):.2f}") # Verify calculations expected_win_rate = 1/2 # 1 win out of 2 trades = 50% expected_avg_win = 0.50 expected_avg_loss = -0.20 actual_win_rate = daily_stats.get('win_rate', 0.0) actual_avg_win = daily_stats.get('avg_winning_trade', 0.0) actual_avg_loss = daily_stats.get('avg_losing_trade', 0.0) logger.info("4. Verifying calculations:") logger.info(f" Win rate: Expected {expected_win_rate*100:.1f}%, Got {actual_win_rate*100:.1f}% ✅" if abs(actual_win_rate - expected_win_rate) < 0.01 else f" Win rate: Expected {expected_win_rate*100:.1f}%, Got {actual_win_rate*100:.1f}% ❌") logger.info(f" Avg win: Expected ${expected_avg_win:.2f}, Got ${actual_avg_win:.2f} ✅" if abs(actual_avg_win - expected_avg_win) < 0.01 else f" Avg win: Expected ${expected_avg_win:.2f}, Got ${actual_avg_win:.2f} ❌") logger.info(f" Avg loss: Expected ${expected_avg_loss:.2f}, Got ${actual_avg_loss:.2f} ✅" if abs(actual_avg_loss - expected_avg_loss) < 0.01 else f" Avg loss: Expected ${expected_avg_loss:.2f}, Got ${actual_avg_loss:.2f} ❌") return True return True async def main(): """Run all tests""" logger.info("🚀 STARTING COMPREHENSIVE FIXES TEST") logger.info("Testing both model prediction fixes and trading statistics fixes") # Test model predictions prediction_success = await test_model_predictions() # Test trading statistics stats_success = test_trading_statistics() logger.info("=" * 60) logger.info("TEST SUMMARY") logger.info("=" * 60) logger.info(f"Model Predictions: {'✅ FIXED' if prediction_success else '❌ STILL BROKEN'}") logger.info(f"Trading Statistics: {'✅ FIXED' if stats_success else '❌ STILL BROKEN'}") if prediction_success and stats_success: logger.info("🎉 ALL ISSUES FIXED! The system should now work correctly.") else: logger.error("❌ Some issues remain. Check the logs above for details.") if __name__ == "__main__": asyncio.run(main())