//+------------------------------------------------------------------+
//|                                                Percentage-TS.mq4 |
//|                        Copyright 2014, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_color1 Red
#property indicator_style1 STYLE_DOT
#property indicator_width1 2

extern double Percent = 1.0;

double PTrailing[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   IndicatorShortName("Percentage Trailing Stop("+DoubleToStr(Percent)+")");
   IndicatorDigits(Digits);   

   SetIndexBuffer(0,PTrailing);

   SetIndexStyle(0,DRAW_LINE);
   
   SetIndexLabel(0,"Percentage Trailing Stop");
 
//---
   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[])
  {
//---

   int limit = rates_total - prev_calculated;
   if(prev_calculated > 0) limit++;

/*
perc:=Input("Trailing Loss % :",0,100,14);
loss:=C*perc/100;
trail:=
If(C>PREV AND Ref(C,-1)>PREV,
  Max(PREV,C-loss),
  If(C<PREV AND Ref(C,-1)<PREV,
  Min(PREV,C+loss),
  If(C>PREV,C-loss,C+loss)));
Trail
*/
   
  double loss;

  limit--;
  limit--;
  
  for(int i=limit; i >= 0; i--)
  {
    loss = Close[i] * Percent / 100;
    if (PTrailing[i+1] == EMPTY_VALUE){
      PTrailing[i+1] = Low[i];
    }
    if (Close[i] > PTrailing[i+1] && Close[i + 1] > PTrailing[i+1]){
      PTrailing[i] = MathMax(PTrailing[i+1], Close[i] - loss);
    } else {
      if (Close[i] < PTrailing[i+1] && Close[i + 1] < PTrailing[i+1]){
        PTrailing[i] = MathMin(PTrailing[i+1], Close[i] + loss);
      } else {
        if (Close[i] > PTrailing[i+1]){
          PTrailing[i] = Close[i] - loss;
        } else {
          PTrailing[i] = Close[i] + loss;
        }
        
      }
    }  
  }
   
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
