Backtesting Performance Issues

 
I am backtesting an expert advisor using MetaTrader 4.00 build 2.15. A backtest for a single year of 30 Min data is taking nearly 24 hours to execute. This seems terribly long and I would like to know what might be causing the issue.

Here are the performance specs for my PC:
OS: Windows Vista
RAM: 3 Gig
CPU: Intel Core2 Duo - T5450 - 1.66 Ghz

The expert advisor is a basic trend following system employing two custom Donchian Channel indicators.
 
Your EA use calls of the incorrect written indicators. It is useless try to upgrade hard. See also article https://www.mql5.com/en/articles/1490
 
This is a well circulated custom indicator on the web. Can you please point to me where the performance issue is arising?

//+------------------------------------------------------------------+
//|                                             DonchianChannels.mq4 |
//|                         Copyright © 2005, Luis Guilherme Damiani |
//|                                      http://www.damianifx.com.br |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Luis Guilherme Damiani"
#property link      "http://www.damianifx.com.br"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Magenta
#property indicator_color2 DeepSkyBlue

//Periods: number of bars used for calculating the Donchian channel 
//Extremes: if 1 uses the highest high and the lowest low -> I do not recomend using this
//			if 0 uses the open of the extremes bar -> the open point of a bar (as well as the close
//				are the points of maximum probability of concentration of the prices during the bar
//			if 3 uses the median point most extreme open and lowest low or highest high
//Margins: is the percent of the channel subtrated from the channel border before printing it, negative values are allowed
//Advance: the numbers of bars ahead
//---- input parameters
extern int       Periods=20;
extern int       Extremes=3;
extern int       Margins=-2;
extern int       Advance=0;
extern   int      max_bars=700;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE,1,2);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_LINE,1,2);
   SetIndexBuffer(1,ExtMapBuffer2);

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
   int    fixed_bars=IndicatorCounted();
   //---- 
   
   //int shift=0;//, cnt(0), loopbegin(0);
   double smin=0, smax=0, SsMax=0, SsMin=0;
   //Variables : bar(0), prevbars(0), start(0), cs(0), prevcs(0),commodt(0);

   for (int shift=0;shift< max_bars;shift++)
   {
	  if (Extremes ==1)
	  {
		 SsMax = High[Highest(NULL,0,MODE_HIGH,Periods,shift)];
		 SsMin = Low[Lowest(NULL,0,MODE_LOW,Periods,shift)];
	  }
	  else if (Extremes == 3)
	  {
		 SsMax = (Open[Highest(NULL,0,MODE_OPEN,Periods,shift)]+High[Highest(NULL,0,MODE_HIGH,Periods,shift)])/2;
		 SsMin = (Open[Lowest(NULL,0,MODE_OPEN,Periods,shift)]+Low[Lowest(NULL,0,MODE_LOW,Periods,shift)])/2;
	  }
	     else
	  {
		SsMax = Open[Highest(NULL,0,MODE_OPEN,Periods,shift)];
		SsMin = Open[Lowest(NULL,0,MODE_OPEN,Periods,shift)];
	  }
	  smin = SsMin+(SsMax-SsMin)*Margins/100;
	  smax = SsMax-(SsMax-SsMin)*Margins/100;
	  ExtMapBuffer1[shift-Advance]=smin;
	  ExtMapBuffer2[shift-Advance]=smax;
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+
 
for (int shift=0;shift< max_bars;shift++)

It recalculates every bar on every tick.
 
This is a well circulated custom indicator on the web. Can you please point to me where the performance issue is arising?


Try this fixed version
//+------------------------------------------------------------------+
//|                                             DonchianChannels.mq4 |
//|                         Copyright © 2005, Luis Guilherme Damiani |
//|                                      http://www.damianifx.com.br |
//+------------------------------------------------------------------+

//  Fixed by Rosh
#property copyright "Copyright © 2005, Luis Guilherme Damiani"
#property link      "http://www.damianifx.com.br"

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Magenta
#property indicator_color2 DeepSkyBlue

//Periods: number of bars used for calculating the Donchian channel 
//Extremes: if 1 uses the highest high and the lowest low -> I do not recomend using this
//			if 0 uses the open of the extremes bar -> the open point of a bar (as well as the close
//				are the points of maximum probability of concentration of the prices during the bar
//			if 3 uses the median point most extreme open and lowest low or highest high
//Margins: is the percent of the channel subtrated from the channel border before printing it, negative values are allowed
//Advance: the numbers of bars ahead
//---- input parameters
extern int       Periods=20;
extern int       Extremes=3;
extern int       Margins=-2;
extern int       Advance=0;
extern   int     max_bars=700;
//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   SetIndexStyle(0,DRAW_LINE,1,2);
   SetIndexBuffer(0,ExtMapBuffer1);
   SetIndexStyle(1,DRAW_LINE,1,2);
   SetIndexBuffer(1,ExtMapBuffer2);

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
{
   int   limit,counted_bars=IndicatorCounted();
   //---- 
   
   //int shift=0;//, cnt(0), loopbegin(0);
   double smin=0, smax=0, SsMax=0, SsMin=0;
   //Variables : bar(0), prevbars(0), start(0), cs(0), prevcs(0),commodt(0);

   if (counted_bars==0) limit=Bars-Periods;
   if (counted_bars>0) limit=Bars-counted_bars;
   limit--;
   
   for (int shift=limit;shift>=0;shift--)
   {
	  if (Extremes ==1)
	  {
		 SsMax = High[iHighest(NULL,0,MODE_HIGH,Periods,shift)];
		 SsMin = Low[iLowest(NULL,0,MODE_LOW,Periods,shift)];
	  }
	  else if (Extremes == 3)
	  {
		 SsMax = (Open[iHighest(NULL,0,MODE_OPEN,Periods,shift)]+High[iHighest(NULL,0,MODE_HIGH,Periods,shift)])/2;
		 SsMin = (Open[iLowest(NULL,0,MODE_OPEN,Periods,shift)]+Low[iLowest(NULL,0,MODE_LOW,Periods,shift)])/2;
	  }
	     else
	  {
		SsMax = Open[iHighest(NULL,0,MODE_OPEN,Periods,shift)];
		SsMin = Open[iLowest(NULL,0,MODE_OPEN,Periods,shift)];
	  }
	  smin = SsMin+(SsMax-SsMin)*Margins/100;
	  smax = SsMax-(SsMax-SsMin)*Margins/100;
	  ExtMapBuffer1[shift-Advance]=smin;
	  ExtMapBuffer2[shift-Advance]=smax;
   }
//----
   return(0);
  }
//+------------------------------------------------------------------+



 
Works great now. Thanks for your help.