//+------------------------------------------------------------------+
//|                                               Yexf_AMA_Bands.mq4 |
//|                               Contact with E-Mail:40468962@qq.com|                                       
//+------------------------------------------------------------------+
#property copyright "40468962@qq.com"
#property link  "http://www.mql4.com"

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Red
#property indicator_color2 Red
#property indicator_color3 Yellow


#property indicator_width1 1
#property indicator_width2 1
#property indicator_width3 2

//---- input parameters

extern int       MA_Period       = 30;
extern int       T3_Period       = 10;
extern double    T3_Curvature    = 0.618;
extern double    ATRMultiplier   = 2.0;
extern int       ATRPeriod       = 100;


extern int     Length        =60;
extern int     Displace      =0;
extern int     Filter        =0;
extern double  Deviation     =0;

extern double  Cycle         =4;

//---- buffers
double ExtMapBuffer1[];
double ExtMapBuffer2[];
double UPRang_Buffer[];
double DNRang_Buffer[];
double Mid_MapBuffer[];


double T3UP_Buffer[];
double T3DN_Buffer[];

double MABuffer1[];
double MABuffer2[];
double price1[];
double price2[];

double e1,e2,e3,e4,e5,e6;
double c1,c2,c3,c4;
double n,w1,w2,b2,b3;

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   

   IndicatorBuffers(11);
   
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
   SetIndexStyle(0,DRAW_LINE,0,2);
   SetIndexBuffer(0,UPRang_Buffer);
  
   SetIndexStyle(1,DRAW_LINE,0,2);
   SetIndexBuffer(1,DNRang_Buffer); 

   SetIndexStyle(2,DRAW_LINE,STYLE_DOT);
   SetIndexBuffer(2,Mid_MapBuffer);  

   SetIndexStyle(3,DRAW_LINE,0,2);
   SetIndexBuffer(3,MABuffer1); 
   SetIndexShift(3,Displace);
   SetIndexDrawBegin(3,Length*Cycle+Length);   
   
   SetIndexStyle(4,DRAW_LINE,0,2);
   SetIndexBuffer(4,MABuffer2); 
   SetIndexShift(4,Displace);
   SetIndexDrawBegin(4,Length*Cycle+Length);   
   
   SetIndexStyle(5,DRAW_LINE,0,2);
   SetIndexBuffer(5,T3UP_Buffer); 
     
   SetIndexStyle(6,DRAW_LINE,0,2);
   SetIndexBuffer(6,T3DN_Buffer);    

   SetIndexStyle(7,DRAW_LINE,0,2);
   SetIndexBuffer(7,ExtMapBuffer1);
   
   SetIndexStyle(8,DRAW_LINE,0,2);
   SetIndexBuffer(8,ExtMapBuffer2); 

   SetIndexBuffer(9,price1);
   SetIndexBuffer(10,price2);
   
   
//---- variable reset

e1=0; e2=0; e3=0; e4=0; e5=0; e6=0;
c1=0; c2=0; c3=0; c4=0;
n=0;
w1=0; w2=0;
b2=0; b3=0;

b2=T3_Curvature*T3_Curvature;
b3=b2*T3_Curvature;
c1=-b3;
c2=(3*(b2+b3));
c3=-3*(2*b2+T3_Curvature+b3);
c4=(1+3*T3_Curvature+b3+3*b2);
n=T3_Period;

if (n<1) n=1;
n = 1 + 0.5*(n-1);
w1 = 2 / (n + 1);
w2 = 1 - w1;
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {

     ObjectDelete("a label");  
    
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
      {
 

  int TextSize=20;
  color TextColor1=Yellow;

  
   if(ObjectFind("a label") != 0)
   {
      ObjectCreate("a label", OBJ_LABEL, 0,0,0);
      ObjectSetText("a label","Yexf_AMA_Bands " , TextSize, "Arial", TextColor1);
      ObjectSet("a label", OBJPROP_XDISTANCE,360);
     ObjectSet("a label", OBJPROP_YDISTANCE,0);
   }  
//------------- 
     double a=0,a1=0,a2=0,a3=0,a4=0,a5=0,a6=0,a7=0,a8=0,a9=0,a10=0,a11=0,a12=0,a13=0,a14=0,a15=0,a16=0,a17=0,a18=0,a19=0,a20=0;
     double a21=0,a22=0,a23=0,a24=0,a25=0,a26=0,a27=0,a28=0,a29=0,a30=0,a31=0,a32=0,a33=0,a34=0,a35=0,a36=0,a37=0,a38=0,a39=0,a40=0;
     double a41=0,a42=0,a43=0,a44=0,a45=0,a46=0,a47=0,a48=0,a49=0,a50=0,a51=0,a52=0,a53=0,a54=0,a55=0,a56=0,a57=0,a58=0,a59=0,a60=0;
     
     double f=0,f1=0,f2=0,f3=0,f4=0,f5=0,f6=0,f7=0,f8=0,f9=0,f10=0,f11=0,f12=0,f13=0,f14=0,f15=0,f16=0,f17=0,f18=0,f19=0,f20=0;
     double f21=0,f22=0,f23=0,f24=0,f25=0,f26=0,f27=0,f28=0,f29=0,f30=0,f31=0,f32=0,f33=0,f34=0,f35=0,f36=0,f37=0,f38=0,f39=0,f40=0;
     double f41=0,f42=0,f43=0,f44=0,f45=0,f46=0,f47=0,f48=0,f49=0,f50=0,f51=0,f52=0,f53=0,f54=0,f55=0,f56=0,f57=0,f58=0,f59=0,f60=0;
     
     double at1max=0;  
     double ft1max=0;  

//-------------      
     
      
   int counted_bars=IndicatorCounted();    
   if(counted_bars<0) return(-1); 
   if(counted_bars>0) counted_bars--; 
   int limit2 = Bars-counted_bars-1 ; 

   int    i,j,limit;
   double alfa, beta, t, Sum, Sum2,Weight, g;
   double pi=3.1415926535;
//----
   double Coeff= 3*pi;
   int Phase=Length-1;
   double Len=Length*Cycle + Phase;
//----
   if(counted_bars > 0) limit=Bars-counted_bars;
   if(counted_bars < 0) return(0);
   if(counted_bars ==0) limit=Bars-Len-1;
   if(counted_bars < 1)
      for(j=1;j<Length*Cycle+Length;j++)
        {
            MABuffer1[Bars-j]=0;
            MABuffer2[Bars-j]=0;
        }
   
   
   
   for(i=Bars-1;i>=0;i--) 
   {           
        
        a= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i);  
        if(i-1>0) a1= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-1); 
        if(i-2>0) a2= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-2); 
        if(i-3>0) a3= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-3); 
        if(i-4>0) a4= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-4); 
        if(i-5>0) a5= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-5); 
        if(i-6>0) a6= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-6); 
        if(i-7>0) a7= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-7); 
        if(i-8>0) a8= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-8); 
        if(i-9>0) a9= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-9); 
        if(i-10>0) a10= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-10); 
        
        if(i-11>0) a11= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-11); 
        if(i-12>0) a12= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-12); 
        if(i-13>0) a13= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-13); 
        if(i-14>0) a14= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-14); 
        if(i-15>0) a15= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-15); 
        if(i-16>0) a16= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-16); 
        if(i-17>0) a17= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-17); 
        if(i-18>0) a18= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-18); 
        if(i-19>0) a19= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-19); 
        if(i-20>0) a20= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-20); 
        
        if(i-21>0) a21= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-21); 
        if(i-22>0) a22= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-22); 
        if(i-23>0) a23= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-23); 
        if(i-24>0) a24= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-24); 
        if(i-25>0) a25= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-25); 
        if(i-26>0) a26= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-26); 
        if(i-27>0) a27= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-27); 
        if(i-28>0) a28= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-28); 
        if(i-29>0) a29= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-29); 
        if(i-30>0) a30= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-30); 
        
        if(i-31>0) a31= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-31); 
        if(i-32>0) a32= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-32); 
        if(i-33>0) a33= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-33); 
        if(i-34>0) a34= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-34); 
        if(i-35>0) a35= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-35); 
        if(i-36>0) a36= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-36); 
        if(i-37>0) a37= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-37); 
        if(i-38>0) a38= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-38); 
        if(i-39>0) a39= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-39); 
        if(i-40>0) a40= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i-40);         
        
        a41= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i+1); 
        a42= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i+2); 
        a43= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i+3); 
        a44= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i+4); 
        a45= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_HIGH,i+5); 

        
        
        
        
        f= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i);  
        if(i-1>0) f1= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-1); 
        if(i-2>0) f2= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-2); 
        if(i-3>0) f3= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-3); 
        if(i-4>0) f4= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-4); 
        if(i-5>0) f5= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-5); 
        if(i-6>0) f6= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-6); 
        if(i-7>0) f7= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-7); 
        if(i-8>0) f8= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-8); 
        if(i-9>0) f9= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-9); 
        if(i-10>0) f10= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-10); 
        
        if(i-11>0) f11= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-11); 
        if(i-12>0) f12= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-12); 
        if(i-13>0) f13= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-13); 
        if(i-14>0) f14= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-14); 
        if(i-15>0) f15= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-15); 
        if(i-16>0) f16= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-16); 
        if(i-17>0) f17= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-17); 
        if(i-18>0) f18= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-18); 
        if(i-19>0) f19= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-19); 
        if(i-20>0) f20= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-20); 

        if(i-21>0) f21= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-21); 
        if(i-22>0) f22= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-22); 
        if(i-23>0) f23= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-23); 
        if(i-24>0) f24= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-24); 
        if(i-25>0) f25= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-25); 
        if(i-26>0) f26= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-26); 
        if(i-27>0) f27= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-27); 
        if(i-28>0) f28= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-28); 
        if(i-29>0) f29= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-29); 
        if(i-30>0) f30= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-30);
        
        if(i-31>0) f31= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-31); 
        if(i-32>0) f32= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-32); 
        if(i-33>0) f33= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-33); 
        if(i-34>0) f34= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-34); 
        if(i-35>0) f35= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-35); 
        if(i-36>0) f36= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-36); 
        if(i-37>0) f37= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-37); 
        if(i-38>0) f38= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-38); 
        if(i-39>0) f39= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-39); 
        if(i-40>0) f40= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i-40);        
         
        f41= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i+1); 
        f42= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i+2); 
        f43= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i+3); 
        f44= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i+4); 
        f45= iMA(NULL,0,MA_Period,0,MODE_SMA,PRICE_LOW,i+5); 
              
                
                
                        
        at1max = (a+a1+a2+a3+a4+a5+a6+a7+a8+a9+a10+a11+a12+a13+a14+a15+a16+a17+a18+a19+a20+a21+a22+a23+a24+a25+a26+a27+a28+a29+a30
                  +a31+a32+a33+a34+a35+a36+a37+a38+a39+a40+a41+a42+a43+a44+a45)/46.0 ;
        
        ft1max = (f+f1+f2+f3+f4+f5+f6+f7+f8+f9+f10+f11+f12+f13+f14+f15+f16+f17+f18+f19+f20+f21+f22+f23+f24+f25+f26+f27+f28+f29+f30
                  +f31+f32+f33+f34+f35+f36+f37+f38+f39+f40+f41+f42+f43+f44+f45)/46.0 ;
        
        
        ExtMapBuffer1[i] = NormalizeDouble(at1max,Digits);
        ExtMapBuffer2[i] = NormalizeDouble(ft1max,Digits);
     }
//----------------    
   for(i=Bars-1;i>=0;i--) 
   {         
     e1 = w1*ExtMapBuffer1[i+1] + w2*e1;
     e2 = w1*e1 + w2*e2;
     e3 = w1*e2 + w2*e3;
     e4 = w1*e3 + w2*e4;
     e5 = w1*e4 + w2*e5;
     e6 = w1*e5 + w2*e6;

    T3UP_Buffer[i]=(c1*e6 + c2*e5 + c3*e4 + c4*e3);
    }
//----------------

   for(i=Bars-1;i>=0;i--) 
   { 
     e1 = w1*ExtMapBuffer2[i+1] + w2*e1;
     e2 = w1*e1 + w2*e2;
     e3 = w1*e2 + w2*e3;
     e4 = w1*e3 + w2*e4;
     e5 = w1*e4 + w2*e5;
     e6 = w1*e5 + w2*e6;

     T3DN_Buffer[i]=(c1*e6 + c2*e5 + c3*e4 + c4*e3);  
   }
//----------------
   for(i=limit;i>=0;i--)
     {
      Weight=0; Sum=0; t=0;
      for(j=0;j<=Len-1;j++)
        {
         g=1.0/(Coeff*t+1);
         if (t<=0.5)g=1;
         beta=MathCos(pi*t);
         alfa=g * beta;
         price1[j]=T3UP_Buffer[i];
         Sum+=alfa*price1[j];
         Weight+=alfa;
         if(t < 1)t+=1.0/(Phase-1);
         else if(t < Len-1) t+=(2*Cycle-1)/(Cycle*Length-1);
        }
      if (Weight > 0) MABuffer1[i]=(1.0+Deviation/100)*Sum/Weight;
      if (Filter>0)
        {
         if(MathAbs(MABuffer1[i]-MABuffer1[i+1]) < Filter*Point) 
          MABuffer1[i]=MABuffer1[i+1];          
        }
     }
//------------------
   for(i=limit;i>=0;i--)
     {
      Weight=0; Sum2=0; t=0;
      for(j=0;j<=Len-1;j++)
        {
         g=1.0/(Coeff*t+1);
         if (t<=0.5)g=1;
         beta=MathCos(pi*t);
         alfa=g * beta;
         price2[j]=T3DN_Buffer[i];
         Sum2+=alfa*price2[j];
         Weight+=alfa;
         if(t < 1)t+=1.0/(Phase-1);
         else if(t < Len-1) t+=(2*Cycle-1)/(Cycle*Length-1);
        }
      if (Weight > 0) MABuffer2[i]=(1.0+Deviation/100)*Sum2/Weight;
      if (Filter>0)
        {
         if(MathAbs(MABuffer2[i]-MABuffer2[i+1]) < Filter*Point) 
          MABuffer2[i]=MABuffer2[i+1];         
        }
     }
//------------------
    for(i=limit2;i>=0;i--) 
    {
       double range = iATR(NULL,0,ATRPeriod,i)*ATRMultiplier;
       UPRang_Buffer[i] = MABuffer1[i]+ range ;
       DNRang_Buffer[i] = MABuffer2[i]- range ;
       Mid_MapBuffer[i] = (MABuffer1[i]+MABuffer2[i])/2.0 ;

    }  
//---------------

   return(0);
}


//---------------------------------------------------------+