Files
profitable-expert-advisor/ai/dummy/train_and_backtest_xauusd.py
zhutoutoutousan 98a87a69ca Update
2026-02-13 08:03:25 +01:00

165 lines
4.6 KiB
Python

"""
Train ONNX Model for XAUUSD and Backtest
This script:
1. Trains an ONNX model for XAUUSD
2. Runs backtest using the trained model
3. Generates performance report
"""
import os
import sys
from datetime import datetime, timedelta
import MetaTrader5 as mt5
# Add paths
current_dir = os.path.dirname(os.path.abspath(__file__))
backtest_dir = os.path.join(os.path.dirname(current_dir), 'backtesting', 'MT5')
sys.path.insert(0, current_dir)
sys.path.insert(0, backtest_dir)
from train_onnx_model import ONNXModelTrainer
from backtest_engine import BacktestEngine
from onnx_backtest_strategy import ONNXBacktestStrategy
from performance_analyzer import PerformanceAnalyzer
def main():
"""Main function to train model and run backtest."""
print("="*60)
print("XAUUSD ONNX Model Training and Backtesting")
print("="*60)
# Configuration
symbol = 'XAUUSD'
timeframe_str = 'H1'
lookback = 60
epochs = 30 # Reduced for faster training
initial_balance = 10000.0
# Convert timeframe
timeframe_map = {
'M1': mt5.TIMEFRAME_M1,
'M5': mt5.TIMEFRAME_M5,
'M15': mt5.TIMEFRAME_M15,
'M30': mt5.TIMEFRAME_M30,
'H1': mt5.TIMEFRAME_H1,
'H4': mt5.TIMEFRAME_H4,
'D1': mt5.TIMEFRAME_D1
}
timeframe = timeframe_map[timeframe_str]
# Create models directory
models_dir = 'models'
os.makedirs(models_dir, exist_ok=True)
# Step 1: Train Model
print("\n" + "="*60)
print("STEP 1: Training ONNX Model")
print("="*60)
trainer = ONNXModelTrainer(
symbol=symbol,
timeframe=timeframe,
lookback=lookback
)
try:
print(f"\nTraining model for {symbol} on {timeframe_str} timeframe...")
print(f"Lookback: {lookback} bars")
print(f"Epochs: {epochs}")
print("\nThis may take several minutes...\n")
trainer.train(epochs=epochs, batch_size=32, verbose=1)
# Export model
model_name = f"{symbol}_{timeframe_str}_model.onnx"
model_path = os.path.join(models_dir, model_name)
print(f"\nExporting model to ONNX format...")
trainer.export_to_onnx(model_path)
# Save scaler
scaler_name = f"{symbol}_{timeframe_str}_scaler.pkl"
scaler_path = os.path.join(models_dir, scaler_name)
import pickle
with open(scaler_path, 'wb') as f:
pickle.dump(trainer.scaler, f)
print(f"✓ Scaler saved to: {scaler_path}")
print(f"\n✓ Model saved to: {model_path}")
except Exception as e:
print(f"\n✗ Training failed: {e}")
import traceback
traceback.print_exc()
trainer.cleanup()
return
finally:
trainer.cleanup()
# Step 2: Run Backtest
print("\n" + "="*60)
print("STEP 2: Running Backtest")
print("="*60)
# Backtest date range (last 6 months for testing)
end_date = datetime.now()
start_date = end_date - timedelta(days=180)
# Create strategy
strategy = ONNXBacktestStrategy(
symbol=symbol,
timeframe=timeframe,
model_path=model_path,
scaler_path=scaler_path,
initial_balance=initial_balance,
prediction_threshold=0.0001, # 0.01% minimum change
min_confidence=0.3, # 30% minimum confidence
lot_size=0.1,
stop_loss_pips=50,
take_profit_pips=100
)
# Run backtest
try:
print(f"\nRunning backtest from {start_date.date()} to {end_date.date()}...")
engine = BacktestEngine(strategy, start_date, end_date)
results = engine.run()
# Analyze results
print("\n" + "="*60)
print("STEP 3: Performance Analysis")
print("="*60)
analyzer = PerformanceAnalyzer(results)
analyzer.generate_report('onnx_backtest_results')
print("\n" + "="*60)
print("Training and Backtesting Completed!")
print("="*60)
print(f"\nModel: {model_path}")
print(f"Scaler: {scaler_path}")
print(f"Results: onnx_backtest_results/")
except Exception as e:
print(f"\n✗ Backtest failed: {e}")
import traceback
traceback.print_exc()
if __name__ == '__main__':
# Check MT5 connection
if not mt5.initialize():
print("ERROR: Failed to initialize MT5")
print("Make sure MetaTrader 5 is running and you're logged in.")
sys.exit(1)
try:
main()
except KeyboardInterrupt:
print("\n\nInterrupted by user")
finally:
mt5.shutdown()