Update
This commit is contained in:
@@ -0,0 +1,120 @@
|
||||
"""
|
||||
Quick Backtest Script for ONNX Model
|
||||
|
||||
Simple script to quickly backtest the trained ONNX model with default parameters.
|
||||
"""
|
||||
|
||||
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, backtest_dir)
|
||||
|
||||
from backtest_engine import BacktestEngine
|
||||
from onnx_backtest_strategy import ONNXBacktestStrategy
|
||||
from performance_analyzer import PerformanceAnalyzer
|
||||
|
||||
|
||||
def main():
|
||||
"""Run quick backtest."""
|
||||
print("="*60)
|
||||
print("XAUUSD ONNX Model Quick Backtest")
|
||||
print("="*60)
|
||||
|
||||
# Configuration
|
||||
symbol = 'XAUUSD'
|
||||
timeframe = mt5.TIMEFRAME_H1
|
||||
model_path = 'models/XAUUSD_H1_model.onnx'
|
||||
scaler_path = 'models/XAUUSD_H1_scaler.pkl'
|
||||
initial_balance = 10000.0
|
||||
|
||||
# Check if model exists
|
||||
if not os.path.exists(model_path):
|
||||
print(f"\nERROR: Model not found: {model_path}")
|
||||
print("Please train the model first using:")
|
||||
print(" python train_onnx_model.py --symbol XAUUSD --timeframe H1")
|
||||
return
|
||||
|
||||
# Backtest date range
|
||||
end_date = datetime.now()
|
||||
start_date = end_date - timedelta(days=180) # Last 6 months
|
||||
|
||||
print(f"\nModel: {model_path}")
|
||||
print(f"Symbol: {symbol}")
|
||||
print(f"Timeframe: H1")
|
||||
print(f"Date Range: {start_date.date()} to {end_date.date()}")
|
||||
print(f"Initial Balance: ${initial_balance:,.2f}\n")
|
||||
|
||||
# Adjusted parameters (more relaxed to generate trades)
|
||||
print("Strategy Parameters (Adjusted for Testing):")
|
||||
print(" Prediction Threshold: 0.00005 (0.005%) - LOWERED")
|
||||
print(" Min Confidence: 0.1 (10%) - LOWERED")
|
||||
print(" Stop Loss: 50 pips")
|
||||
print(" Take Profit: 100 pips")
|
||||
print(" Lot Size: 0.1\n")
|
||||
|
||||
# Initialize MT5
|
||||
if not mt5.initialize():
|
||||
print("ERROR: Failed to initialize MT5")
|
||||
print("Make sure MetaTrader 5 is running and you're logged in.")
|
||||
return
|
||||
|
||||
try:
|
||||
# Create strategy with relaxed parameters
|
||||
strategy = ONNXBacktestStrategy(
|
||||
symbol=symbol,
|
||||
timeframe=timeframe,
|
||||
model_path=model_path,
|
||||
scaler_path=scaler_path,
|
||||
initial_balance=initial_balance,
|
||||
prediction_threshold=0.00005, # Lowered from 0.0001
|
||||
min_confidence=0.1, # Lowered from 0.3
|
||||
lot_size=0.1,
|
||||
stop_loss_pips=50,
|
||||
take_profit_pips=100
|
||||
)
|
||||
|
||||
# Run backtest
|
||||
print("Running backtest...\n")
|
||||
engine = BacktestEngine(strategy, start_date, end_date)
|
||||
results = engine.run()
|
||||
|
||||
# Analyze results
|
||||
print("\n" + "="*60)
|
||||
print("Performance Summary")
|
||||
print("="*60)
|
||||
|
||||
analyzer = PerformanceAnalyzer(results)
|
||||
metrics = analyzer.metrics
|
||||
|
||||
print(f"\nTotal Return: {metrics.get('total_return_pct', 0):.2f}%")
|
||||
print(f"Max Drawdown: {metrics.get('max_drawdown_pct', 0):.2f}%")
|
||||
print(f"Profit Factor: {metrics.get('profit_factor', 0):.2f}")
|
||||
print(f"Win Rate: {metrics.get('win_rate_pct', 0):.2f}%")
|
||||
print(f"Total Trades: {metrics.get('total_trades', 0)}")
|
||||
print(f"Final Balance: ${metrics.get('final_balance', initial_balance):,.2f}")
|
||||
|
||||
# Generate report
|
||||
analyzer.generate_report('onnx_xauusd_quick_backtest')
|
||||
|
||||
print("\n" + "="*60)
|
||||
print("Backtest Completed!")
|
||||
print("="*60)
|
||||
print(f"\nResults saved to: onnx_xauusd_quick_backtest/")
|
||||
print("\nTo optimize parameters, run:")
|
||||
print(" python optimize_onnx_params.py")
|
||||
|
||||
except Exception as e:
|
||||
print(f"\nERROR: Backtest failed: {e}")
|
||||
import traceback
|
||||
traceback.print_exc()
|
||||
finally:
|
||||
mt5.shutdown()
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
Reference in New Issue
Block a user