//+------------------------------------------------------------------+
//|                                                  TrendlessAG.mq4 |
//|                                      Copyright © 2012, Barmaley  |
//|Осциллятор Бестрендовости написан в соответствии с описанием,     |
//|приведённым в книге Джо ДиНаполи "Торговля с применением уровней  |
//|ДиНаполи"                                                         |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, Barmaley"

#property indicator_separate_window               //в отдельном окне
#property indicator_buffers 1                     //число буферов индикатора
//---- входные параметры

extern int SMAPeriod=7;  //период простой скользящей средней в формуле осциллятора
extern int PointsCount=600; //количество точек для расчета индикатора. Форекс-клуб рекомендует месяц для часовок. Ну где-то так и возьмем.
extern int In100=90; // Сколько % точек индикатора должны входить в интервал +-100%

//---- присоение цвета
#property  indicator_color1  Yellow                 //цвет линии индикатора 
//---- буферы индикатора
double Buf[];  //буфер расчёта индикатора 
double BufX[]; // Вспомогательный массив
//+------------------------------------------------------------------+
//| Инициализация. Функция init                                      |
//+------------------------------------------------------------------+
int init()
  {

//---- установка бара, с которого начинается отрисовка индикатора
   SetIndexDrawBegin(0,PointsCount);
   IndicatorDigits(1);
//---- разметка буферов
   SetIndexBuffer(0,Buf);           //буфер графика индикатора 

//---- название окна данных и окна индикатора
   string short_name="TrendlessAG ("+SMAPeriod+")";       //в названии отображается только период SMA
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);

//---- Установка уровней    
   SetLevelValue(1,100.0);                   //уровень 100% перекупленности
   SetLevelValue(2,80.0);                    //уровень 80% перекупленности
   SetLevelValue(3,60.0);                    //уровень 60% перекупленности
   SetLevelValue(4,0.0);                     //уровень 0
   SetLevelValue(5,-60.0);                   //уровень 60% перепроданности
   SetLevelValue(6,-80.0);                   //уровень 80% перепроданности
   SetLevelValue(7,-100.0);                  //уровень 100% перепроданности
//---- стиль уровней
   SetLevelStyle(STYLE_DOT,1,Silver);      //стиль отображения уровней     
//---- конец инициализации
   return(0);
  }
//+------------------------------------------------------------------+
//| TrendlessAG                                                      |
//+------------------------------------------------------------------+
int start()
  {

//   int limit=PointsCount; // А зачем больше то считать?

   int counted_bars=IndicatorCounted();
   if(counted_bars<0) return(-1);
   if(counted_bars>0) counted_bars--;
   int limit=Bars-counted_bars;
   if(counted_bars==0) limit-=1+In100/100;

   ArrayResize(BufX,ArraySize(Buf));

   if(limit<SMAPeriod)return;

   for(int i=0; i<limit; i++)
     {

      Buf[i]=Close[i]-iMA(Symbol(),Period(),SMAPeriod,0,MODE_SMA,PRICE_CLOSE,i); // рассчитываем Close-SMA на заданном количестве точек
      BufX[i]=MathAbs(Buf[i]); // А это абсолютные значения Close-SMA
     }

   ArraySort(BufX); // Сортируем абсолютные значения по возрастанию

   double level_100=BufX[limit*In100/100]; // определяем уровень +-100%. In100=90% значений индикатора - внутри этого промежутка.
   
      for(i=0; i<limit; i++)
     {
      if(level_100!=0)
         Buf[i]=Buf[i]/level_100*100; //Нормируем исходный буфер относительно 100%-го уровня.
      else Buf[i]=EMPTY_VALUE;
     }
   return(0);
  }
//+------------------------------------------------------------------+
