#!/usr/bin/env python3 """ Multi-Currency Strategy Performance Tester Tests QuantumBotX Hybrid strategy on different currency pairs to compare performance """ import sys import os import pandas as pd import numpy as np # Add the project root to the path sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) def create_forex_data(symbol, base_price, volatility, periods=1000): """Create realistic forex data for testing""" dates = pd.date_range('2023-01-01', periods=periods, freq='h') # Different volatility characteristics for different pairs if 'USD' in symbol and 'JPY' in symbol: # JPY pairs have larger price movements price_changes = np.random.randn(periods) * volatility * 0.5 elif 'XAU' in symbol: # Gold has much higher volatility price_changes = np.random.randn(periods) * volatility * 3.0 else: # Standard forex pairs price_changes = np.random.randn(periods) * volatility # Add trending behavior trend = np.linspace(0, volatility * 10, periods) * (1 if np.random.random() > 0.5 else -1) prices = base_price + np.cumsum(price_changes) + trend * 0.1 # Ensure prices stay reasonable prices = np.clip(prices, base_price * 0.8, base_price * 1.2) df = pd.DataFrame({ 'time': dates, 'open': prices, 'high': prices + np.random.uniform(0, volatility * 0.5, periods), 'low': prices - np.random.uniform(0, volatility * 0.5, periods), 'close': prices + np.random.uniform(-volatility * 0.2, volatility * 0.2, periods), 'volume': np.random.randint(100, 1000, periods) }) # Ensure OHLC integrity df['high'] = df[['high', 'close', 'open']].max(axis=1) df['low'] = df[['low', 'close', 'open']].min(axis=1) return df def test_strategy_on_pair(symbol, base_price, volatility): """Test QuantumBotX Hybrid strategy on a specific currency pair""" from core.backtesting.engine import run_backtest print(f"\\nšŸ“ˆ Testing {symbol}") print("=" * 50) # Create test data df = create_forex_data(symbol, base_price, volatility) print(f"šŸ“Š Data range: ${df['close'].min():.5f} - ${df['close'].max():.5f}") print(f"šŸ“Š Average volatility: {df['close'].std():.5f}") # Standard parameters for QuantumBotX Hybrid params = { 'lot_size': 1.0, # 1% risk 'sl_pips': 2.0, # 2x ATR for SL 'tp_pips': 4.0, # 4x ATR for TP 'adx_period': 14, 'adx_threshold': 25, 'ma_fast_period': 20, 'ma_slow_period': 50, 'bb_length': 20, 'bb_std': 2.0, 'trend_filter_period': 200 } try: # Run backtest with symbol name for proper detection result = run_backtest('QUANTUMBOTX_HYBRID', params, df, symbol_name=symbol) if 'error' in result: print(f"āŒ Error: {result['error']}") return None # Extract metrics profit = result.get('total_profit_usd', 0) trades = result.get('total_trades', 0) final_capital = result.get('final_capital', 10000) drawdown = result.get('max_drawdown_percent', 0) win_rate = result.get('win_rate_percent', 0) wins = result.get('wins', 0) losses = result.get('losses', 0) # Calculate additional metrics profit_percentage = (profit / 10000) * 100 avg_profit_per_trade = profit / trades if trades > 0 else 0 print(f"šŸ“Š Results:") print(f" Total Profit: ${profit:,.2f} ({profit_percentage:+.2f}%)") print(f" Total Trades: {trades}") print(f" Final Capital: ${final_capital:,.2f}") print(f" Max Drawdown: {drawdown:.2f}%") print(f" Win Rate: {win_rate:.2f}%") print(f" Wins/Losses: {wins}/{losses}") print(f" Avg Profit/Trade: ${avg_profit_per_trade:.2f}") # Risk assessment is_safe = ( abs(profit) < 5000 and # Reasonable profit/loss range drawdown < 25 and # Acceptable drawdown final_capital > 7500 and # Account preservation trades >= 5 # Sufficient trade sample ) performance_rating = "UNKNOWN" if trades == 0: performance_rating = "NO TRADES" elif profit > 1000 and win_rate > 60 and drawdown < 10: performance_rating = "EXCELLENT" elif profit > 500 and win_rate > 50 and drawdown < 15: performance_rating = "GOOD" elif profit > 0 and drawdown < 20: performance_rating = "FAIR" elif abs(profit) < 1000 and drawdown < 25: performance_rating = "POOR" else: performance_rating = "DANGEROUS" status = "āœ… SAFE" if is_safe else "āš ļø RISKY" print(f"\\n{status} | Performance: {performance_rating}") return { 'symbol': symbol, 'profit': profit, 'profit_percentage': profit_percentage, 'trades': trades, 'final_capital': final_capital, 'drawdown': drawdown, 'win_rate': win_rate, 'wins': wins, 'losses': losses, 'avg_profit_per_trade': avg_profit_per_trade, 'is_safe': is_safe, 'performance_rating': performance_rating, 'volatility': df['close'].std() } except Exception as e: print(f"āŒ Exception: {e}") import traceback traceback.print_exc() return None def main(): """Main testing function""" print("šŸŒ Multi-Currency Strategy Performance Analysis") print("=" * 70) print("Testing QuantumBotX Hybrid Strategy on Different Currency Pairs") print("=" * 70) # Define currency pairs to test test_pairs = [ # Major Forex Pairs ('EURUSD', 1.1000, 0.0015), # EUR/USD - low volatility ('GBPUSD', 1.2500, 0.0020), # GBP/USD - medium volatility ('USDJPY', 110.00, 0.5000), # USD/JPY - different price range ('USDCHF', 0.9200, 0.0018), # USD/CHF - low volatility ('AUDUSD', 0.7300, 0.0025), # AUD/USD - commodity currency ('NZDUSD', 0.6800, 0.0030), # NZD/USD - higher volatility # Cross Pairs ('EURGBP', 0.8800, 0.0012), # EUR/GBP - very low volatility ('EURJPY', 120.00, 0.6000), # EUR/JPY - cross pair # Commodity/Metals ('XAUUSD', 1950.0, 12.000), # Gold - high volatility (our problem child) ('USDCAD', 1.3500, 0.0022), # USD/CAD - oil-related ] results = [] for symbol, base_price, volatility in test_pairs: result = test_strategy_on_pair(symbol, base_price, volatility) if result: results.append(result) # Analysis summary print("\\n" + "=" * 70) print("šŸ“Š COMPREHENSIVE ANALYSIS SUMMARY") print("=" * 70) if not results: print("āŒ No successful tests completed") return # Sort by performance results.sort(key=lambda x: x['profit'], reverse=True) print("\\nšŸ† Performance Ranking:") print("Symbol | Profit | Trades | Win Rate | Drawdown | Rating") print("-" * 65) for result in results: symbol = result['symbol'] profit = result['profit'] trades = result['trades'] win_rate = result['win_rate'] drawdown = result['drawdown'] rating = result['performance_rating'] print(f"{symbol:9} | ${profit:9.2f} | {trades:6} | {win_rate:7.1f}% | {drawdown:7.1f}% | {rating}") # Statistical analysis profitable_pairs = [r for r in results if r['profit'] > 0] safe_pairs = [r for r in results if r['is_safe']] print(f"\\nšŸ“ˆ Statistics:") print(f" Total Pairs Tested: {len(results)}") print(f" Profitable Pairs: {len(profitable_pairs)} ({len(profitable_pairs)/len(results)*100:.1f}%)") print(f" Safe Pairs: {len(safe_pairs)} ({len(safe_pairs)/len(results)*100:.1f}%)") avg_profit = sum(r['profit'] for r in results) / len(results) avg_win_rate = sum(r['win_rate'] for r in results) / len(results) avg_drawdown = sum(r['drawdown'] for r in results) / len(results) print(f" Average Profit: ${avg_profit:.2f}") print(f" Average Win Rate: {avg_win_rate:.1f}%") print(f" Average Drawdown: {avg_drawdown:.1f}%") # Best and worst performers if results: best = results[0] worst = results[-1] print(f"\\nšŸ„‡ Best Performer: {best['symbol']}") print(f" Profit: ${best['profit']:,.2f} ({best['profit_percentage']:+.2f}%)") print(f" Win Rate: {best['win_rate']:.1f}%") print(f" Rating: {best['performance_rating']}") print(f"\\nšŸ„‰ Worst Performer: {worst['symbol']}") print(f" Profit: ${worst['profit']:,.2f} ({worst['profit_percentage']:+.2f}%)") print(f" Win Rate: {worst['win_rate']:.1f}%") print(f" Rating: {worst['performance_rating']}") # XAUUSD specific analysis xauusd_result = next((r for r in results if r['symbol'] == 'XAUUSD'), None) if xauusd_result: print(f"\\nšŸ„‡ XAUUSD Analysis:") print(f" Previous Issue: -$15,231.28 loss, 152.31% drawdown") print(f" Current Result: ${xauusd_result['profit']:,.2f} profit/loss, {xauusd_result['drawdown']:.2f}% drawdown") if abs(xauusd_result['profit']) < 15231.28: improvement = ((15231.28 - abs(xauusd_result['profit'])) / 15231.28) * 100 print(f" Improvement: {improvement:.1f}% reduction in risk") if xauusd_result['is_safe']: print(" āœ… XAUUSD is now trading safely with the new protection!") else: print(" āš ļø XAUUSD still needs attention") print("\\nšŸ’” Conclusions:") if len(safe_pairs) >= len(results) * 0.8: print(" āœ… Strategy performs well across most currency pairs") elif len(profitable_pairs) >= len(results) * 0.6: print(" 🟔 Strategy shows promise but needs optimization") else: print(" āŒ Strategy may need significant improvements") print(" • Test with real historical data for validation") print(" • Consider pair-specific parameter optimization") print(" • Monitor real trading performance closely") if __name__ == "__main__": main()