Files
quantumbotx/testing/test_strategy_switching.py
T
Reynov Christian eb33b7c6ea feat: Major v2.0 enhancements and new features
🔧 Core System Improvements:
- Enhanced backtesting engine with realistic spread modeling and ATR-based risk management
- Improved bot controller with better error handling and status tracking
- Optimized MT5 integration with symbol verification and market watch integration
- Strengthened database queries with better performance and reliability

🎯 New Strategy Features:
- Added index strategies (Index Momentum, Index Breakout Pro) for stock market trading
- Implemented market condition detector for dynamic strategy adaptation
- Created performance scorer for strategy evaluation and ranking
- Added strategy switcher system for automatic strategy optimization

📚 Educational Framework:
- New beginner guide documentation for newcomer onboarding
- Enhanced FAQ section with common trading questions
- Quick start guide for rapid setup and deployment
- Improved AI mentor integration with personalized guidance

🌍 Multi-Asset Expansion:
- Extended data collection for 20+ trading instruments (Forex, Crypto, Indices)
- Enhanced broker compatibility with FBS and other platforms
- Improved symbol migration system for seamless broker switching
- Added holiday integration for culturally-aware trading automation

🧪 Testing & Validation:
- Added comprehensive index strategy testing suite
- Enhanced holiday integration validation
- Dynamic strategy signal testing for improved reliability
- EURUSD optimization testing with London session focus

 Performance & UI:
- Frontend JavaScript optimizations for better trading bot management
- Enhanced templates with improved user experience
- Database migration system for smooth version upgrades
- Optimized data download scripts for better efficiency

📊 Analytics & Monitoring:
- Strengthened Flask application architecture with better routing
- Improved logging system for production deployment
- Enhanced error handling across all components
- Better API response handling and status reporting
2025-09-09 00:10:38 +08:00

209 lines
9.9 KiB
Python

#!/usr/bin/env python3
# test_strategy_switching.py - Demonstration of automatic strategy switching system
import sys
import os
import pandas as pd
sys.path.append(os.path.dirname(os.path.abspath(__file__)))
def test_strategy_switching_system():
"""Test the complete automatic strategy switching system"""
print("🔄 Automatic Strategy Switching System Demo")
print("=" * 60)
print("Demonstrating the complete strategy switching workflow")
print("=" * 60)
try:
# Import required modules
from core.strategies.strategy_switcher import strategy_switcher, evaluate_strategy_switch
from core.strategies.market_condition_detector import get_market_condition
from core.strategies.performance_scorer import calculate_strategy_score, rank_strategies
from core.backtesting.enhanced_engine import run_enhanced_backtest
# Show system configuration
print("⚙️ System Configuration:")
print(f" Monitored Instruments: {strategy_switcher.monitored_instruments}")
print(f" Test Strategies: {strategy_switcher.test_strategies}")
print(f" Evaluation Period: {strategy_switcher.config['performance_evaluation_period']} bars")
print(f" Cooldown Period: {strategy_switcher.config['switching_cooldown_hours']} hours")
print(f" Minimum Score: {strategy_switcher.config['min_performance_score']}")
print(f" Switch Threshold: {strategy_switcher.config['switch_threshold']}")
# Load market data for testing
print(f"\n📊 Loading Market Data...")
data_directory = 'lab/backtest_data'
current_data = {}
for symbol in strategy_switcher.monitored_instruments:
file_path = os.path.join(data_directory, f'{symbol}_H1_data.csv')
if os.path.exists(file_path):
try:
df = pd.read_csv(file_path, parse_dates=['time'])
current_data[symbol] = df.tail(1000).copy() # Use recent 1000 bars
print(f" ✅ Loaded {len(current_data[symbol])} bars for {symbol}")
except Exception as e:
print(f" ❌ Error loading {symbol}: {e}")
else:
print(f" ⚠️ Data file not found for {symbol}")
if not current_data:
print("❌ No market data available for testing")
return False
print(f"\n🔍 Market Condition Analysis:")
market_conditions = {}
for symbol, df in current_data.items():
if not df.empty:
condition = get_market_condition(df, symbol)
market_conditions[symbol] = condition
print(f" {symbol}: {condition['market_condition']} ({condition['confidence']:.2f} confidence)")
print(f" Volatility: {condition['volatility_regime']}")
print(f" Session: {condition['session_status']}")
print(f"\n📈 Strategy Performance Evaluation:")
performance_scores = []
# Evaluate strategy combinations
for symbol, df in current_data.items():
if df.empty:
continue
market_condition = market_conditions.get(symbol, {})
for strategy_id in strategy_switcher.test_strategies[:3]: # Test first 3 strategies
try:
print(f"\n Testing {strategy_id} on {symbol}...")
# Get strategy parameters
strategy_params = strategy_switcher._get_strategy_parameters(strategy_id, symbol)
print(f" Parameters: {strategy_params}")
# Run backtest
test_df = df.tail(500).copy() # Use 500 bars for testing
backtest_results = run_enhanced_backtest(
strategy_id,
strategy_params,
test_df,
symbol_name=symbol
)
if 'error' in backtest_results:
print(f" ❌ Backtest error: {backtest_results['error']}")
continue
# Calculate performance score
score = calculate_strategy_score(
backtest_results, market_condition, strategy_id, symbol
)
performance_scores.append(score)
# Show results
metrics = score['metrics']
components = score['components']
print(f" 📊 Performance Score: {score['composite_score']:.3f}")
print(f" Profitability: {components['profitability']:.2f}")
print(f" Risk Control: {components['risk_control']:.2f}")
print(f" Market Fit: {components['market_fit']:.2f}")
print(f" Trades: {metrics.get('total_trades', 0)}")
print(f" Net Profit: ${metrics.get('net_profit', 0):.2f}")
print(f" Max Drawdown: {metrics.get('max_drawdown', 0):.2f}%")
except Exception as e:
print(f" ❌ Error evaluating {strategy_id}/{symbol}: {e}")
continue
if not performance_scores:
print("❌ No performance scores calculated")
return False
# Rank strategies
print(f"\n🏆 Strategy Rankings:")
ranked_combinations = rank_strategies(performance_scores)
for i, combination in enumerate(ranked_combinations[:5]): # Top 5
rank_emoji = ["🥇", "🥈", "🥉", "4️⃣", "5️⃣"][min(i, 4)]
print(f" {rank_emoji} {combination['strategy_id']}/{combination['symbol']}")
print(f" Score: {combination['composite_score']:.3f}")
print(f" Components: P:{combination['components']['profitability']:.2f} | "
f"R:{combination['components']['risk_control']:.2f} | "
f"M:{combination['components']['market_fit']:.2f}")
# Test automatic switching logic
print(f"\n🔄 Automatic Switching Evaluation:")
switch_decision = evaluate_strategy_switch(current_data)
if switch_decision:
print(f" 🎯 SWITCH RECOMMENDED:")
print(f" Action: {switch_decision['action']}")
if switch_decision['action'] == 'STRATEGY_SWITCH':
print(f" From: {switch_decision['old_strategy']}/{switch_decision['old_symbol']}")
print(f" To: {switch_decision['new_strategy']}/{switch_decision['new_symbol']}")
else:
print(f" To: {switch_decision['new_strategy']}/{switch_decision['new_symbol']}")
print(f" Reason: {switch_decision['reason']}")
print(f" Confidence: {switch_decision['confidence']:.3f}")
if 'improvement' in switch_decision:
print(f" Improvement: +{switch_decision['improvement']:.3f}")
else:
print(f" ✅ No switch needed at this time")
print(f" Current strategy remains optimal")
# Show system status
print(f"\n📊 System Status:")
status = strategy_switcher.get_status()
print(f" Current Strategy: {status['current_strategy']}")
print(f" Current Symbol: {status['current_symbol']}")
print(f" Last Switch: {status['last_switch_time']}")
print(f" In Cooldown: {status['in_cooldown']}")
print(f" Performance History: {status['performance_history_count']} entries")
print(f" Switch Log: {status['switch_log_count']} entries")
# Show recent switches
recent_switches = strategy_switcher.get_recent_switches(3)
if recent_switches:
print(f"\n⚡ Recent Switches:")
for switch in recent_switches:
decision = switch['decision']
print(f" {switch['timestamp']}: {decision['action']}")
if decision['action'] == 'STRATEGY_SWITCH':
print(f" {decision['old_strategy']}/{decision['old_symbol']} → "
f"{decision['new_strategy']}/{decision['new_symbol']}")
print(f" Reason: {decision['reason']}")
print(f"\n✅ Strategy Switching System Test Complete!")
print(f"\n💡 Key Features Demonstrated:")
print(f" 1. ✅ Market condition detection for different instruments")
print(f" 2. ✅ Multi-metric performance scoring system")
print(f" 3. ✅ Automatic strategy ranking and selection")
print(f" 4. ✅ Intelligent switching logic with cooldown periods")
print(f" 5. ✅ Comprehensive dashboard monitoring")
print(f" 6. ✅ REST API for integration with web interface")
return True
except Exception as e:
print(f"❌ Test failed: {e}")
import traceback
traceback.print_exc()
return False
if __name__ == "__main__":
print("🚀 QuantumBotX Automatic Strategy Switching System")
print("=" * 70)
success = test_strategy_switching_system()
if success:
print(f"\n🎉 SUCCESS: Automatic Strategy Switching System is fully operational!")
print(f"\n📋 Next Steps:")
print(f" 1. Integrate with web dashboard for real-time monitoring")
print(f" 2. Connect to live market data feeds")
print(f" 3. Implement automatic switching in trading bots")
print(f" 4. Configure alerts for strategy changes")
print(f" 5. Add more sophisticated market condition detection")
else:
print(f"\n❌ Some issues occurred during testing")
print(f" Check the output above for details")