MQL5/3_MQL5_EA_Tools/09_OnTester.mq5

80 lines
2.8 KiB
MQL5
Raw Permalink Normal View History

2025-04-16 11:59:03 -04:00
#property copyright "Santiago Cruz"
#property link "https://www.mql5.com/en/users/algo-trader/"
2025-02-19 22:47:55 -05:00
#property version "1.00"
2025-02-19 22:46:37 -05:00
2025-02-19 22:47:55 -05:00
// Input parameters for optimization
input double StopLoss = 50.0; // Stop Loss in points
input double TakeProfit = 100.0; // Take Profit in points
input int MATimePeriod = 14; // Moving Average Period
// Global variables
double balance;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
balance = AccountBalance();
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// Simple trading logic based on Moving Average
double ma[];
ArraySetAsSeries(ma, true);
int maHandle = iMA(_Symbol, _Period, MATimePeriod, 0, MODE_SMA, PRICE_CLOSE);
CopyBuffer(maHandle, 0, 0, 3, ma);
if(!PositionSelect(_Symbol)) // If no position is open
{
if(ma[1] > ma[2] && ma[0] > ma[1]) // Buy signal
{
double sl = Ask() - StopLoss * _Point;
double tp = Ask() + TakeProfit * _Point;
trade.Buy(0.1, _Symbol, Ask(), sl, tp, "Buy Order");
}
else if(ma[1] < ma[2] && ma[0] < ma[1]) // Sell signal
{
double sl = Bid() + StopLoss * _Point;
double tp = Bid() - TakeProfit * _Point;
trade.Sell(0.1, _Symbol, Bid(), sl, tp, "Sell Order");
}
}
}
//+------------------------------------------------------------------+
//| Tester function |
//+------------------------------------------------------------------+
double OnTester()
{
// Calculate metrics after testing
double profit = TesterStatistics(STAT_PROFIT); // Total profit
double trades = TesterStatistics(STAT_TRADES); // Number of trades
double maxDrawdown = TesterStatistics(STAT_EQUITY_DD); // Maximum drawdown
// Avoid division by zero
if(trades == 0) return 0.0;
// Custom criterion: Profit per trade adjusted by drawdown
double customCriterion = (profit / trades) - maxDrawdown;
// Ensure non-negative result for optimization
if(customCriterion < 0) customCriterion = 0.0;
Print("OnTester: Profit = ", profit, ", Trades = ", trades, ", Custom Criterion = ", customCriterion);
return customCriterion;
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// Cleanup code if needed
}