//+------------------------------------------------------------------+
//|                                          variable moving average |
//|                                                           ionone |
//+------------------------------------------------------------------+
#property copyright "ionone"
#property link      "www.forex-station.com"

#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1  LimeGreen
#property indicator_color2  Orange
#property indicator_color3  Blue

/*study(title="Variable Moving Average [LazyBear]", shorttitle="VMA_LB", overlay=true)

src=close

l =input(6, title="VMA Length") 

std=input(false, title="Show Trend Direction")

bc=input(false, title="Color bars based on Trend")

k = 1.0/l

pdm = max((src - src[1]), 0)

mdm = max((src[1] - src), 0)

pdmS = ((1 - k)*nz(pdmS[1]) + k*pdm)

mdmS = ((1 - k)*nz(mdmS[1]) + k*mdm)

s = pdmS + mdmS

pdi = pdmS/s

mdi = mdmS/s

pdiS = ((1 - k)*nz(pdiS[1]) + k*pdi)

mdiS = ((1 - k)*nz(mdiS[1]) + k*mdi)

d = abs(pdiS - mdiS)

s1 = pdiS + mdiS

iS = ((1 - k)*nz(iS[1]) + k*d/s1)

hhv = highest(iS, l) 

llv = lowest(iS, l) 

d1 = hhv - llv

vI = (iS - llv)/d1

vma = (1 - k*vI)*nz(vma[1]) + k*vI*src

vmaC=(vma > vma[1]) ? green : (vma<vma[1]) ? red : (vma==vma[1]) ? blue : black 

plot(vma, color=std?vmaC:black, linewidth=3, 
title="VMA")
barcolor(bc?vmaC:na)
*/


extern int VMA_Length = 6;


double up[];
double dn[];
double flat[];
double 
vma[2];
//------------------------------------------------------------------
//
//------------------------------------------------------------------
//
//
//
//
//

int init()
{
   IndicatorBuffers(4);
   SetIndexBuffer(0,up);
   SetIndexBuffer(1,dn);
   SetIndexBuffer(2,flat);
   SetIndexBuffer(3,iS); 
   
   SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,3); 
   SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,3); 
   SetIndexStyle(2,DRAW_LINE,STYLE_SOLID,3); 
     
       
  
   
   return(0);
}
void deinit()
{
   
}


void Shift(double& d[])
{
   for (int i = 10000-1; i > 0; i--)
   {
      d[i] = d[i-1];
   }
}

datetime tim;
double pdmS;
double mdmS;
double pdiS;
double mdiS;
double iS[];

int trend = -1;
int start()
{
   int i,counted_bars = IndicatorCounted();
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;   
   int limit=MathMin(Bars-counted_bars-1,Bars-1);
           
   
   for(i=limit-1; i>0; i--)
   {
      if (iTime(NULL,0,i+1) != tim)
      {
         tim = iTime(NULL,0,i+1);
         
         vma[1] = vma[0];
      }
      
      double k = 1.0/double(VMA_Length);
      double pdm = MathMax((iClose(NULL,0,i) - iClose(NULL,0,i+1)), 0);
      double mdm = MathMax((iClose(NULL,0,i+1) - iClose(NULL,0,i)), 0);
      pdmS = ((1 - k)*pdmS + k*pdm);
      mdmS = ((1 - k)*mdmS + k*mdm);
      double s = pdmS + mdmS;
      
      double pdi = 0;
      double mdi = 0;
      if (s != 0) 
      {
         pdi = pdmS/s;
         mdi = mdmS/s;
      }
      
      pdiS = (1 - k)*pdiS + k*pdi;
      mdiS = (1 - k)*mdiS + k*mdi;
      double d = fabs(pdiS - mdiS);
      double s1 = pdiS + mdiS;
            
      if (s1 != 0)         
         iS[i] = ((1 - k)*iS[i+1] + k*d/s1);
         
      double hhv = iS[ArrayMaximum(iS, VMA_Length, i)]; 
      double llv = iS[ArrayMinimum(iS, VMA_Length, i)]; 
      double d1 = hhv - llv;
      double vI = 0;
      if (d1 != 0) 
         vI = (iS[i] - llv)/d1;      
      
      vma[0] = (1 - k*vI)*vma[1] + k*vI*iClose(NULL,0,i);
             
      if (vma[0] > vma[1]) 
      {
         up[i] = vma[0]; 
         dn[i] = EMPTY_VALUE; 
         flat[i] = EMPTY_VALUE;
      }
      else if (vma[0] < vma[1]) 
      {
         dn[i] = vma[0]; 
         up[i] = EMPTY_VALUE; 
         flat[i] = EMPTY_VALUE;
      }
      else 
      {
         flat[i] = vma[0];
         up[i] = EMPTY_VALUE; 
         dn[i] = EMPTY_VALUE;
      }
   }  
 
   return(0);
         
}


//+-------------------------------------------------------------------
//|                                                                  
//+-------------------------------------------------------------------
//
//
//
//
//
