Just restarted MT4 and backtesting is back to normal speeds so doesn't look to be like the code.
Very strange.
Thanks anyway.

You are missing trading opportunities:
- Free trading apps
- Over 8,000 signals for copying
- Economic news for exploring financial markets
Registration
Log in
You agree to website policy and terms of use
If you do not have an account, please register
Hi,
I've modified the sample MACD script and now is is so, so slow under backtesting but I don't understand why! Could you someone tell what I'm doing wrong please (I'm a newbie to MT4):
//+------------------------------------------------------------------+
//| MACD Sample.mq4 |
//| Copyright 2005-2014, MetaQuotes Software Corp. |
//| https://www.mql4.com |
//+------------------------------------------------------------------+
#include <AndrewsFunctions.mqh>
#property copyright "2005-2014, MetaQuotes Software Corp."
#property link "https://www.mql4.com"
input double TakeProfit =50;
input double Lots =0.1;
input double TrailingStop =30;
input double MACDOpenLevel =3;
input double MACDCloseLevel=2;
input int MATrendPeriod =26;
extern int CountBars =3;
double MacdValue[];
double MacdSignal[];
double MaShort[];
datetime TimeArray[];
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void OnInit(void)
{
ArrayResize(MacdValue,CountBars);
ArrayResize(MacdSignal,CountBars);
ArrayResize(MaShort,CountBars);
}
void OnTick(void)
{
int cnt,ticket,total;
int i, limit=CountBars;
//---
// initial data checks
// it is important to make sure that the expert works with a normal
// chart and the user did not make any mistakes setting external
// variables (Lots, StopLoss, TakeProfit,
// TrailingStop) in our case, we check TakeProfit
// on a chart of less than 100 bars
//---
if(Bars<100)
{
Print("bars less than 100");
return;
}
if(TakeProfit<10)
{
Print("TakeProfit less than 10");
return;
}
//--- to simplify the coding and speed up access data are put into internal variables
if(isNewBar())
{
DebugBreak();
for(i=0; i<limit; i++) MacdValue[i]=iMACD(NULL,0,12,26,3,PRICE_CLOSE,MODE_MAIN,i);
for(i=0; i<limit; i++) MacdSignal[i]=iMACD(NULL,0,12,26,3,PRICE_CLOSE,MODE_SIGNAL,i);
for(i=0; i<limit; i++) MaShort[i]=iMA(NULL,0,20,0,MODE_SMA,PRICE_CLOSE,i);
}
total=OrdersTotal();
if(total<1)
{
//--- no opened orders identified
if(AccountFreeMargin()<(1000*Lots))
{
Print("We have no money. Free Margin = ",AccountFreeMargin());
return;
}
//--- check for long position (BUY) possibility
if(MacdValue[0]<0 && MacdValue[0]>MacdSignal[0] && MacdValue[1]<MacdSignal[1] &&
MathAbs(MacdValue[0])>(MACDOpenLevel*Point) && MaShort[0]>MaShort[1])
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Ask+TakeProfit*Point,"macd sample",16384,0,Green);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order opened : ",OrderOpenPrice());
}
else
Print("Error opening BUY order : ",GetLastError());
return;
}
//--- check for short position (SELL) possibility
if(MacdValue[0]>0 && MacdValue[0]<MacdSignal[0] && MacdValue[1]>MacdSignal[1] &&
MacdValue[0]>(MACDOpenLevel*Point) && MaShort[0]<MaShort[1])
{
ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Bid-TakeProfit*Point,"macd sample",16384,0,Red);
if(ticket>0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order opened : ",OrderOpenPrice());
}
else
Print("Error opening SELL order : ",GetLastError());
}
//--- exit from the "no opened orders" block
return;
}
//--- it is important to enter the market correctly, but it is more important to exit it correctly...
for(cnt=0;cnt<total;cnt++)
{
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
continue;
if(OrderType()<=OP_SELL && // check for opened position
OrderSymbol()==Symbol()) // check for symbol
{
//--- long position is opened
if(OrderType()==OP_BUY)
{
//--- should it be closed?
if(MacdValue[0]>0 && MacdValue[0]<MacdSignal[0] && MacdValue[1]>MacdSignal[1] &&
MacdValue[0]>(MACDCloseLevel*Point))
{
//--- close order and exit
if(!OrderClose(OrderTicket(),OrderLots(),Bid,3,Violet))
Print("OrderClose error ",GetLastError());
return;
}
//--- check for trailing stop
if(TrailingStop>0)
{
if(Bid-OrderOpenPrice()>Point*TrailingStop)
{
if(OrderStopLoss()<Bid-Point*TrailingStop)
{
//--- modify order and exit
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Green))
Print("OrderModify error ",GetLastError());
return;
}
}
}
}
else // go to short position
{
//--- should it be closed?
if(MacdValue[0]<0 && MacdValue[0]>MacdSignal[0] &&
MacdValue[1]<MacdSignal[1] && MathAbs(MacdValue[0])>(MACDCloseLevel*Point))
{
//--- close order and exit
if(!OrderClose(OrderTicket(),OrderLots(),Ask,3,Violet))
Print("OrderClose error ",GetLastError());
return;
}
//--- check for trailing stop
if(TrailingStop>0)
{
if((OrderOpenPrice()-Ask)>(Point*TrailingStop))
{
if((OrderStopLoss()>(Ask+Point*TrailingStop)) || (OrderStopLoss()==0))
{
//--- modify order and exit
if(!OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Red))
Print("OrderModify error ",GetLastError());
return;
}
}
}
}
}
}
//---
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| AndrewsFunctions.mqh |
//+------------------------------------------------------------------+
#property strict
datetime lastbar;
bool isNewBar()
{
datetime curbar = Time[0];
if(lastbar!=curbar)
{
lastbar=curbar;
return(true);
}
else
{
return(false);
}
}
Thanks.