#!/usr/bin/env python3 # debug_index_strategy.py - Debug the INDEX_BREAKOUT_PRO strategy with US500 data import sys import os import pandas as pd import logging # Add project root to path project_root = os.path.dirname(os.path.abspath(__file__)) sys.path.append(project_root) # Set up logging logging.basicConfig(level=logging.DEBUG) logger = logging.getLogger(__name__) def test_index_breakout_strategy(): """Test the INDEX_BREAKOUT_PRO strategy with US500 data""" print("๐Ÿ” Debugging INDEX_BREAKOUT_PRO Strategy with US500 Data") print("=" * 70) try: # Import required modules from core.backtesting.enhanced_engine import run_enhanced_backtest from core.strategies.strategy_map import STRATEGY_MAP # Check if strategy exists strategy_id = 'INDEX_BREAKOUT_PRO' if strategy_id not in STRATEGY_MAP: print(f"โŒ Strategy {strategy_id} not found in STRATEGY_MAP") print(f"Available strategies: {list(STRATEGY_MAP.keys())}") return False strategy_class = STRATEGY_MAP[strategy_id] print(f"โœ… Strategy found: {strategy_class}") print(f"Strategy name: {getattr(strategy_class, 'name', 'Unknown')}") print(f"Strategy description: {getattr(strategy_class, 'description', 'No description')}") # Load US500 data csv_file = 'lab/backtest_data/US500_H1_data.csv' if not os.path.exists(csv_file): print(f"โŒ Data file not found: {csv_file}") return False print(f"\n๐Ÿ“Š Loading data from: {csv_file}") df = pd.read_csv(csv_file, parse_dates=['time']) print(f"โœ… Loaded {len(df)} rows of data") print(f"Date range: {df['time'].min()} to {df['time'].max()}") print(f"Columns: {list(df.columns)}") print("Sample data:") print(df.head()) # Test strategy parameters print("\nโš™๏ธ Testing strategy parameters...") if hasattr(strategy_class, 'get_definable_params'): params_def = strategy_class.get_definable_params() print(f"โœ… Strategy has {len(params_def)} definable parameters:") for param in params_def: name = param.get('name', 'Unknown') display_name = param.get('display_name', param.get('label', 'Unknown')) default = param.get('default', 'No default') print(f" - {name} ({display_name}): {default}") else: print("โŒ Strategy has no get_definable_params method") return False # Test strategy instantiation print("\n๐Ÿงช Testing strategy instantiation...") try: # Create a mock bot instance class MockBot: def __init__(self): self.market_for_mt5 = 'US500' self.status = 'Testing' mock_bot = MockBot() strategy_instance = strategy_class(mock_bot, {}) print("โœ… Strategy instantiated successfully") # Test analyze_df method print("\n๐Ÿ”ฌ Testing analyze_df method...") # Use a smaller subset for testing test_df = df.tail(500).copy() # Last 500 rows print(f"Testing with {len(test_df)} rows") result_df = strategy_instance.analyze_df(test_df) print("โœ… analyze_df completed") print(f"Result columns: {list(result_df.columns)}") # Check for signals if 'signal' in result_df.columns: signals = result_df['signal'].value_counts() print(f"Signal distribution: {signals.to_dict()}") # Count non-HOLD signals non_hold_signals = result_df[result_df['signal'] != 'HOLD'] print(f"Non-HOLD signals: {len(non_hold_signals)}") if len(non_hold_signals) > 0: print("Sample signals:") print(non_hold_signals[['time', 'signal', 'explanation']].head(10) if 'time' in result_df.columns else non_hold_signals[['signal', 'explanation']].head(10)) else: print("โŒ No trading signals generated!") print("Sample explanations:") print(result_df['explanation'].tail(10).tolist()) except Exception as e: print(f"โŒ Strategy testing failed: {e}") import traceback traceback.print_exc() return False # Test full backtesting print("\n๐Ÿš€ Testing full backtest...") # Simulate web interface parameters web_params = { 'breakout_period': 20, 'volume_surge_multiplier': 2.0, 'confirmation_candles': 2, 'atr_multiplier_sl': 2.0, 'atr_multiplier_tp': 4.0 } # Enhanced parameters (like API mapping) enhanced_params = web_params.copy() enhanced_params['risk_percent'] = 1.0 # Conservative for index enhanced_params['sl_atr_multiplier'] = web_params.get('atr_multiplier_sl', 2.0) enhanced_params['tp_atr_multiplier'] = web_params.get('atr_multiplier_tp', 4.0) print(f"Parameters: {enhanced_params}") # Engine configuration engine_config = { 'enable_spread_costs': True, 'enable_slippage': True, 'enable_realistic_execution': True } # Extract symbol name (like API does) symbol_name = 'US500' print(f"Symbol: {symbol_name}") # Use smaller dataset for testing test_df = df.tail(1000).copy() # Last 1000 rows for faster testing results = run_enhanced_backtest( strategy_id, enhanced_params, test_df, symbol_name=symbol_name, engine_config=engine_config ) if 'error' in results: print(f"โŒ Backtest error: {results['error']}") return False print("โœ… Backtest completed successfully!") print("\n๐Ÿ“ˆ Results Summary:") print(f" Strategy: {results.get('strategy_name', 'Unknown')}") print(f" Total Trades: {results.get('total_trades', 0)}") print(f" Wins: {results.get('wins', 0)}") print(f" Losses: {results.get('losses', 0)}") print(f" Win Rate: {results.get('win_rate_percent', 0):.1f}%") print(f" Total Profit USD: ${results.get('total_profit_usd', 0):.2f}") print(f" Max Drawdown: {results.get('max_drawdown_percent', 0):.1f}%") print(f" Final Capital: ${results.get('final_capital', 0):.2f}") if results.get('total_trades', 0) == 0: print("\nโŒ PROBLEM: No trades generated!") print("This could be why the web interface shows empty results.") # Debug signal generation print("\n๐Ÿ” Debugging signal generation...") strategy_instance = strategy_class(MockBot(), enhanced_params) debug_df = test_df.tail(100).copy() debug_result = strategy_instance.analyze_df(debug_df) if 'signal' in debug_result.columns: signals = debug_result['signal'].value_counts() print(f"Signal counts in last 100 rows: {signals.to_dict()}") if 'BUY' in signals or 'SELL' in signals: print("โœ… Signals are being generated by strategy") print("โ“ Problem might be in the backtesting engine") else: print("โŒ Strategy is not generating BUY/SELL signals") print("Sample explanations:") sample_explanations = debug_result['explanation'].tail(10).tolist() for i, exp in enumerate(sample_explanations): print(f" {i+1}: {exp}") else: print("โœ… Trades were generated successfully!") return True except Exception as e: print(f"โŒ Test failed with exception: {e}") import traceback traceback.print_exc() return False if __name__ == "__main__": success = test_index_breakout_strategy() if success: print("\nโœ… Debug completed successfully") else: print("\nโŒ Debug revealed issues that need fixing")