//+------------------------------------------------------------------+
//|                                                 ATR_Trail_v1.mq4 |
//|                                                      nicholishen |
//|                                   www.reddit.com/u/nicholishenFX |
//+------------------------------------------------------------------+
#property copyright "nicholishen"
#property link      "www.reddit.com/u/nicholishenFX"
#property version   "1.00"
#property strict

#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
//--- plot atr_trail
#property indicator_label1  "atr_trail"
#property indicator_type1   DRAW_LINE
#property indicator_color1  clrBlueViolet
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
//--- input parameters
input int      atr_period=14; //ATR period
input double   atr_factor=2.5;//ATR factor
//--- indicator buffers
double         atr_trailBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
   SetIndexBuffer(0,atr_trailBuffer);
   IndicatorShortName("Trailing_ATR");
//---
   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[])
{
//---
   ArraySetAsSeries(close,true);
   ArraySetAsSeries(atr_trailBuffer,true); 
  // double prev_trail = prev_calculated==0 ? close[rates_total-atr_period] : -1;
   int total = prev_calculated == 0 ? rates_total - atr_period -2  : rates_total - prev_calculated ;
   for(int i=total;i>=0;i--)
   {
      double prev_trail = i == total && prev_calculated == 0 ? close[i+1] : atr_trailBuffer[i+1];
      atr_trailBuffer[i] = Trail(i,prev_trail,close);
   }
   
//--- return value of prev_calculated for next call
   return(rates_total);
}
//+--
//+------------------------------------------------------------------+
double ATR(int index)
{
   return iATR(Symbol(),Period(),atr_period,index);
}
//+------------------------------------------------------------------+
double Trail(int i,double prev_trail,const double &close[])
{
   double new_trail = prev_trail;
   if(close[i] > prev_trail && close[i+1] > prev_trail)
   {
      new_trail = MathMax(prev_trail,close[i] - ATR(i)*atr_factor);
   }
   else if(close[i] < prev_trail && close[i+1] < prev_trail)
   {
      new_trail = MathMin(prev_trail,close[i] + ATR(i)*atr_factor);
   }
   return new_trail;
}