#property indicator_chart_window 
#property indicator_buffers 1 
#property indicator_color1 Red 
extern int Length = 102;   // глубина сглаживания 
extern int Phase  = -100; // параметр, изменяющийся в пределах -100 ... +100, влияет на качество переходного процесса; 
extern int Shift  = 0;   // cдвиг индикатора вдоль оси времени 
extern int Input_Price_Customs = 0;//Выбор цен, по которым производится расчёт индикатора 
//(0-"Close", 1-"Open", 2-"(High+Low)/2", 3-"High", 4-"Low", 5-"Heiken Ashi Close", 6-"(Open+Close)/2") 
//---- buffers 
double FILTER,Series;
double @Rezalt[]; 
double Filter[1];
int nf,IPC; 
int init() 
{ 
//---- indicator line 
SetIndexStyle(0,DRAW_LINE); 
SetIndexBuffer(0,@Rezalt); 
//---- 
nf=13;int count=ArrayResize(Filter,nf+1);if(count==0){Alert("Невозможно выделить память под массив Filter");return(0);}
//+=== Инициализация коэффициентов цифрового фильтра =======================================================================+
Filter[00]=+2.257123744523;Filter[01]=-0.360708458885;Filter[02]=-0.325737268228;Filter[03]=-0.2729150866467;Filter[04]=-0.2092237191308;
Filter[05]=-0.1426901208968;Filter[06]=-0.0809016668650;Filter[07]=-0.02975330274774;Filter[08]=+0.00725649761316;Filter[09]=+0.02925670582975;
Filter[10]=+0.0377987481366;Filter[11]=+0.0361578613352;Filter[12]=+0.02830856176224;Filter[13]=+0.02602750420017;
//+=========================================================================================================================+
//+================================================================================================================================+ 
if(Phase<-100){Alert("Параметр Phase должен быть от -100 до +100" + " Вы ввели недопустимое " +Phase+  " будет использовано -100");}
if(Phase> 100){Alert("Параметр Phase должен быть от -100 до +100" + " Вы ввели недопустимое " +Phase+  " будет использовано  100");}
if(Length<  1){Alert("Параметр Length должен быть не менее 1"     + " Вы ввели недопустимое " +Length+ " будет использовано  1"  );}
//+================================================================================================================================+
SetIndexDrawBegin(0,nf+30); 
IPC=Input_Price_Customs;
return(0); 
}

int start() 
{ 
int limit,counted_bars=IndicatorCounted(); 
//---- 
if((counted_bars==0)&&(Bars<=nf))return(0);
//----  
limit=Bars-counted_bars-1; 
//----+ Введение и инициализация внутренних переменных функции JJMASeries, nJMAnumber=1(Одно обращение к функции) 
if (limit==Bars-1){int reset=-1;int set=JJMASeries(1,0,0,0,0,0,0,0,reset);if((reset!=0)||(set!=0))return(-1);}
//----+  
for(int k=limit;k>=0;k--)
{
FILTER=0.0;
for(int x=0;x<=nf;x++)
{
if(k<Bars-1-nf)
switch(IPC)
    {
    case 0:  Series=Close[k+x];break;
     case 1:  Series= Open[k+x];break;
     case 2:  Series=(High[k+x]+Low  [k+x])/2;break;
     case 3:  Series= High[k+x];break;
     case 4:  Series=  Low[k+x];break;
     case 5:  Series=(Open[k+x]+High [k+x]+Low[k+x]+Close[k+x])/4;break;
     case 6:  Series=(Open[k+x]+Close[k+x])/2;break;
     default: Series=Close[k+x];break;
     }
    FILTER=FILTER+Filter[x]*Series;
}
reset=1;@Rezalt[k]=JJMASeries(0,0,Bars-1-nf,limit,Phase,Length,FILTER,k,reset);if(reset!=0)return(-1);
}
return(0); 
} 
#include <JJMASeries.mqh> 