0% found this document useful (0 votes)
272 views2 pages

ZeroLagEMA Indicator

The document describes a Zero-Lag Exponential Moving Average (EMAZL) indicator for the MetaTrader 5 platform. It includes the indicator code with comments explaining the calculations and variables. The indicator uses an EMA calculation method combined with a moving average to remove lag from the values.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
272 views2 pages

ZeroLagEMA Indicator

The document describes a Zero-Lag Exponential Moving Average (EMAZL) indicator for the MetaTrader 5 platform. It includes the indicator code with comments explaining the calculations and variables. The indicator uses an EMA calculation method combined with a moving average to remove lag from the values.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as TXT, PDF, TXT or read online on Scribd
You are on page 1/ 2

//+------------------------------------------------------------------+

//| ZeroLagEMA.mq5 |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://mql5.com"
#property version "1.00"
#property description "Zero-Lag Exponential Moving Average"
#property indicator_chart_window
#property indicator_buffers 2
#property indicator_plots 1
//--- plot EMAZL
#property indicator_label1 "EMAZL"
#property indicator_type1 DRAW_LINE
#property indicator_color1 clrDodgerBlue
#property indicator_style1 STYLE_SOLID
#property indicator_width1 1
//--- input parameters
input uint InpPeriod = 20; // Period
input ENUM_APPLIED_PRICE InpAppliedPrice = PRICE_CLOSE; // Applied price
//--- indicator buffers
double BufferEMAZL[];
double BufferMA[];
//--- global variables
double alpha;
int period;
int lag;
int handle_ma;
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- set global variables
period=int(InpPeriod<2 ? 2 : InpPeriod);
alpha=2.0/(period+1.0);
lag=(int)ceil((period-1.0)/2.0);
//--- indicator buffers mapping
SetIndexBuffer(0,BufferEMAZL,INDICATOR_DATA);
SetIndexBuffer(1,BufferMA,INDICATOR_CALCULATIONS);
//--- setting indicator parameters
IndicatorSetString(INDICATOR_SHORTNAME,"Zero-Lag EMA ("+(string)period+")");
IndicatorSetInteger(INDICATOR_DIGITS,Digits());
//--- setting plot buffer parameters
PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,period*3+lag);
//--- setting buffer arrays as timeseries
ArraySetAsSeries(BufferEMAZL,true);
ArraySetAsSeries(BufferMA,true);
//--- create MA handle
ResetLastError();
handle_ma=iMA(NULL,PERIOD_CURRENT,1,0,MODE_SMA,InpAppliedPrice);
if(handle_ma==INVALID_HANDLE)
{
Print("The iMA(1) object was not created: Error ",GetLastError());
return INIT_FAILED;
}
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- Проверка и расчёт количества просчитываемых баров
if(rates_total<fmax(period,4)) return 0;
//--- Проверка и расчёт количества просчитываемых баров
int limit=rates_total-prev_calculated;
if(limit>1)
{
limit=rates_total-lag-2;
ArrayInitialize(BufferEMAZL,0);
ArrayInitialize(BufferMA,0);
}
//--- Подготовка данных
int count=(limit>1 ? rates_total : 1);
int copied=CopyBuffer(handle_ma,0,0,count,BufferMA);
if(copied!=count) return 0;

//--- Расчёт индикатора


for(int i=limit; i>=0 && !IsStopped(); i--)
BufferEMAZL[i]=alpha*(2.0*BufferMA[i]-BufferMA[i+lag])+(1.0-
alpha)*BufferEMAZL[i+1];

//--- return value of prev_calculated for next call


return(rates_total);
}
//+------------------------------------------------------------------+

You might also like