//+------------------------------------------------------------------+
//|   Qualitative Quantitative Estimation Indicator for Metatrader 4 |
//|                                     Copyright © 2006Roman Ignatov |
//|                                   mailto:roman.ignatov@gmail.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 200 Roman Ignatov"
#property link      "mailto:roman.ignatov@gmail.com"
//----
#property indicator_separate_window

#property indicator_buffers 2

#property indicator_color1 Aqua
#property indicator_style1 STYLE_SOLID
#property indicator_width1 2

#property indicator_color2 White
#property indicator_style2 STYLE_DOT
#property indicator_width2 1



extern int SF=5;
extern int RSI_Period=14;
extern int BarsToCount=500;

int Wilders_Period;
int StartBar;

double TrLevelSlow[];
double AtrRsi[];
double MaAtrRsi[];
double Rsi[];
double RsiMa[];


int init()
  {
   Wilders_Period=RSI_Period * 2 - 1;
   if (Wilders_Period < SF)
      StartBar=SF;
   else
      StartBar=Wilders_Period;
//----
   IndicatorBuffers(6);

   SetIndexBuffer(0, RsiMa);
   SetIndexStyle(0, DRAW_LINE, STYLE_SOLID, 2);
   SetIndexLabel(0, "QQE Value 0");
   SetIndexDrawBegin(0, StartBar);

   SetIndexStyle(1, DRAW_LINE, STYLE_DOT);
   SetIndexBuffer(1, TrLevelSlow);
   SetIndexLabel(1, "QQE Value 1");
   SetIndexDrawBegin(1, StartBar);

   SetIndexBuffer(2, AtrRsi);
   SetIndexBuffer(3, MaAtrRsi);
   SetIndexBuffer(4, Rsi);

   IndicatorShortName(StringConcatenate("QQE(", SF, ")"));
  }


int start()
  {
   int i;
   double rsi0, rsi1, dar, tr, dv;

   for(i=BarsToCount+StartBar; i>=0; i--)
     {
      TrLevelSlow[i]=0.0;
      AtrRsi[i]=0.0;
      MaAtrRsi[i]=0.0;
      Rsi[i]=0.0;
      RsiMa[i]=0.0;
     }

   for(i=BarsToCount; i>=0; i--)
     {
      Rsi[i]=iRSI(NULL, 0, RSI_Period, PRICE_CLOSE, i);
     }

   for(i=BarsToCount; i>=0; i--)
     {
      RsiMa[i]=iMAOnArray(Rsi, 0, SF, 0, MODE_EMA, i);
      AtrRsi[i]=MathAbs(RsiMa[i + 1] - RsiMa[i]);
     }

   for(i=BarsToCount; i>=0; i--)
      MaAtrRsi[i]=iMAOnArray(AtrRsi, 0, Wilders_Period, 0, MODE_EMA, i);



   i=BarsToCount + 1;

   tr=TrLevelSlow[i];
   rsi1=iMAOnArray(Rsi, 0, SF, 0, MODE_EMA, i);

   while(i > 0)
     {
      i--;
      rsi0=iMAOnArray(Rsi, 0, SF, 0, MODE_EMA, i);
      dar=iMAOnArray(MaAtrRsi, 0, Wilders_Period, 0, MODE_EMA, i) * 4.236;
      dv=tr;
      if (rsi0 < tr)
        {
         tr=rsi0 + dar;
         if (rsi1 < dv)
            if (tr > dv)
               tr=dv;
        }
      else if (rsi0 > tr)
           {
            tr=rsi0 - dar;
            if (rsi1 > dv)
               if (tr < dv)
                  tr=dv;
           }
      TrLevelSlow[i]=tr;
      rsi1=rsi0;
     }

  }


