//+++======================================================================+++
//+++                      RVIxn + ADXpmDI MTF TT                          +++
//+++======================================================================+++
#property copyright   "©  Tankk,  30  июня  2017,  http://forexsystemsru.com/" 
#property link        "https://forexsystemsru.com/1254431-post7221.html"  ////https://forexsystemsru.com/1198113-post65.html"   //http://forexsystemsru.com/indikatory-foreks-f41/" 
//------
#property description "Average Directional Movement Index [ADX] — определяет наличие ценовой тенденции."    
#property description "Разработал Уэллс Уайлдер. Он предлагает покупать, если +DI поднимается выше -DI, и продавать, когда +DI опускается ниже -DI."  ///Индекс Среднего Направления Движения, 
//------
#property description "Relative Vigor Index [RVI] — бодрость движения устанавливается положением,"  ///Индекс Относительной Бодрости,
#property description "в котором цена находится в конце периода."  
#property description "Так как, на бычьем рынке цена закрытия, выше цены открытия, а на медвежьем — наоборот." 
#property description "Пересечение RVI и Сигнальной — является сигналом на покупку или продажу."
#property description "*"
#property description "Почта:  tualatine@mail.ru" 
//#property version   "1.00"
//#property strict
#property  indicator_separate_window
#property  indicator_buffers 7
//------
#property indicator_color1  clrDarkSlateBlue  //Teal   //DodgerBlue    //   //CornflowerBlue  //Red
#property indicator_color2  clrBrown  //Crimson  //Green   //LightCyan   //RoyalBlue    //Blue
#property indicator_color3  clrDarkOrange  //Gold  //SeaGreen  //OrangeRed        
#property indicator_color4  clrLimeGreen
#property indicator_color5  clrWhite  //Red
#property indicator_color6  clrAqua
#property indicator_color7  clrMagenta
//------
#property indicator_width1  2
#property indicator_width2  2
#property indicator_width3  1
#property indicator_width4  2
#property indicator_width5  1
#property indicator_width6  2
#property indicator_width7  2
//------
#property indicator_style3  2
#property indicator_style4  2
#property indicator_style5  2
//------
#property indicator_level1  0
#property indicator_levelcolor  clrDimGray  //clrDarkOrange  //C'10,80,30'  //DarkSlateBlue
#property indicator_levelstyle  STYLE_DOT
//+++======================================================================+++
//+++                 Custom indicator input parameters                    +++
//+++======================================================================+++

extern int                  History  =  1440;  //288;    //576 = M5 * 2Days   //Сколько свечей в Истории (глубина Истории для расчёта/отрисовки Индекса)
extern ENUM_TIMEFRAMES    TimeFrame  =  PERIOD_CURRENT;  //"current time frame";
extern bool             Interpolate  =  false;
extern int                RVIPeriod  =  10;
extern int                ADXPeriod  =  14;
extern ENUM_APPLIED_PRICE  ADXPrice  =  PRICE_CLOSE;
extern bool                DeltaADX  =  true;
extern int                 DeltaSig  =  15;
extern ENUM_MA_METHOD     SigMAMode  =  MODE_LWMA;

extern bool                 ShowRVI  =  true,
                         ShowRVISig  =  true,
                            ShowADX  =  true,
                          ShowDelta  =  true,
                       ShowDeltaSig  =  true;

//+++======================================================================+++
//+++                     Custom indicator buffers                         +++
//+++======================================================================+++
double DelUP[], DelDN[], DelSIG[];  double delta[];
double RVIBuff[], RVISign[];
double PLSDI[], MNSDI[];
double preRVIBuff[], preRVISign[];   
//+++======================================================================+++
//+++              Custom indicator initialization function                +++
//+++======================================================================+++
int init()
{
   IndicatorBuffers(10);   IndicatorDigits(Digits);   //if (Digits==3 || Digits==5) IndicatorDigits(Digits-1);
//------ indicator buffers mapping
   SetIndexBuffer(0,DelUP);
   SetIndexBuffer(1,DelDN);
   SetIndexBuffer(2,DelSIG);
   //------
   SetIndexBuffer(3,RVIBuff);
   SetIndexBuffer(4,RVISign);
   //------
   SetIndexBuffer(5,PLSDI);
   SetIndexBuffer(6,MNSDI);
   //------
   SetIndexBuffer(7,preRVIBuff);
   SetIndexBuffer(8,preRVISign);
   SetIndexBuffer(9,delta);
//------ indicator line
   int HST = DRAW_NONE;   if (ShowDelta) HST=DRAW_HISTOGRAM;    
   SetIndexStyle(0,HST);
   SetIndexStyle(1,HST);
   int HSG = DRAW_NONE;   if (ShowDeltaSig) HSG=DRAW_LINE;    
   SetIndexStyle(2,HSG);
   //------
   int RVM = DRAW_NONE;   if (ShowRVI) RVM=DRAW_LINE;    
   SetIndexStyle(3,RVM);
   int RSG = DRAW_NONE;   if (ShowRVISig) RSG=DRAW_LINE;    
   SetIndexStyle(4,RSG);
   //------
   int AXL = DRAW_NONE;   if (ShowADX) AXL=DRAW_LINE;    
   SetIndexStyle(5,AXL);
   SetIndexStyle(6,AXL);
//------ значение 0 отображаться не будет 
  	SetIndexEmptyValue(0,0.0);
   SetIndexEmptyValue(1,0.0);    ///убираем косяки при "Обрезке Истории"....
   SetIndexEmptyValue(2,0.0);
   SetIndexEmptyValue(3,0.0);
  	SetIndexEmptyValue(4,0.0);
   SetIndexEmptyValue(5,0.0);
   SetIndexEmptyValue(6,0.0);
   //SetIndexEmptyValue(7,0.0);
   //SetIndexEmptyValue(8,0.0);
   //SetIndexEmptyValue(9,0.0);
//------ drawing settings   
   SetIndexDrawBegin(0,ADXPeriod+7);     
   SetIndexDrawBegin(1,ADXPeriod+7);     
   SetIndexDrawBegin(2,DeltaSig+7);   
   //------
   SetIndexDrawBegin(3,RVIPeriod+3);   
   SetIndexDrawBegin(4,RVIPeriod+7);     
   //------
   SetIndexDrawBegin(5,ADXPeriod+7);     
   SetIndexDrawBegin(6,ADXPeriod+7);     
//------ name for DataWindow and indicator subwindow label
   SetIndexLabel(0,stringMTF(TimeFrame)+"_Delta UP");
   SetIndexLabel(1,stringMTF(TimeFrame)+"_Delta DN");
   SetIndexLabel(2,"Delta SigMA ["+IntegerToString(DeltaSig)+"]");
   //------
   SetIndexLabel(3,"RVIxn ["+IntegerToString(RVIPeriod)+"]");
   SetIndexLabel(4,"RVI SigMA");
   //------
   SetIndexLabel(5,"ADX +DI ["+IntegerToString(ADXPeriod)+"]");
   SetIndexLabel(6,"ADX -DI ["+IntegerToString(ADXPeriod)+"]");
   
//------ "короткое имя" для DataWindow и подокна индикатора 
   string SIG="";   if (DeltaSig>0) SIG=" —> SigMA ["+IntegerToString(DeltaSig)+"]";
   IndicatorShortName(stringMTF(TimeFrame)+"_RVIxn ["+IntegerToString(RVIPeriod)+"] vs ADXpmDI ["+IntegerToString(ADXPeriod)+"] MTF TT"+SIG);
   
//+++======================================================================+++
return(0);  ////------ initialization done
}
//+++======================================================================+++
//+++                      RVIxn + ADXpmDI MTF TT                          +++
//+++======================================================================+++
string stringMTF(int perMTF)
{  
   if (perMTF==0)      perMTF=Period();
   if (perMTF==1)      return("M1");
   if (perMTF==5)      return("M5");
   if (perMTF==15)     return("M15");
   if (perMTF==30)     return("M30");
   if (perMTF==60)     return("H1");
   if (perMTF==240)    return("H4");
   if (perMTF==1440)   return("D1");
   if (perMTF==10080)  return("W1");
   if (perMTF==43200)  return("MN1");
   if (perMTF== 2 || 3  || 4  || 6  || 7  || 8  || 9 ||       /// нестандартные периоды для грфиков Renko
               10 || 11 || 12 || 13 || 14 || 16 || 17 || 18)  return("M"+IntegerToString(Period()));
//------
   return("Ошибка периода");
}
//+++======================================================================+++
//+++              Custom indicator deinitialization function              +++
//+++======================================================================+++
int deinit() { return(0); }
//+++======================================================================+++
//+++                 Custom indicator iteration function                  +++
//+++======================================================================+++
int start()
{
   int i, j, y, limit, CountedBars;
   double valueUP, valueDN, NumUP, NumDN;
//+++======================================================================+++

   if (Bars<=RVIPeriod+8) return(0);
//------
   CountedBars=IndicatorCounted();
   if (CountedBars>0) limit=Bars-CountedBars;
   if (CountedBars<0) return(-1);       /// Стандарт-Вариант!!!
   limit=Bars-RVIPeriod-4;
   if (History>0) limit=History-RVIPeriod-4;
   if (CountedBars>RVIPeriod+4) limit=Bars-CountedBars;
//+++======================================================================+++
//+++                      RVIxn + ADXpmDI MTF TT                          +++
//+++======================================================================+++

   if (ADXPeriod>0)   
    { 
     for (i=limit; i>=0; i--) 
      {
       y = iBarShift(NULL,TimeFrame,Time[i],false);   if (TimeFrame < Period()) TimeFrame=PERIOD_CURRENT;   		
     //------
       PLSDI[i] = (NormalizeDouble(iADX(NULL,TimeFrame,ADXPeriod,ADXPrice,MODE_PLUSDI,y),Digits)-20) /10;
       MNSDI[i] = (NormalizeDouble(iADX(NULL,TimeFrame,ADXPeriod,ADXPrice,MODE_MINUSDI,y),Digits)-20) /10;
     //------
       if (DeltaADX) {
           delta[i] = PLSDI[i] - MNSDI[i];
           if (delta[i] > 0) DelUP[i] = delta[i];
           if (delta[i] < 0) DelDN[i] = delta[i]; }
      }  /// *конец цикла* for (i=limit; i>=0; i--) 
    }
//+++======================================================================+++
//+++======================================================================+++

   if (DeltaSig>0) for (i=limit; i>=0; i--) DelSIG[i] = iMAOnArray(delta,0,DeltaSig,0,SigMAMode,i);
//+++======================================================================+++
//+++                      RVIxn + ADXpmDI MTF TT                          +++
//+++======================================================================+++

   for (i=0; i<=limit; i++)
    {
     NumUP=0;  NumDN=0;
   //------
     for (j=i; j<i+RVIPeriod; j++)
      {
       int BK=j;   
       if (TimeFrame<=Period()) { TimeFrame=PERIOD_CURRENT;  BK=j; }
       if (!Interpolate && TimeFrame!=PERIOD_CURRENT) BK=i;
       y=iBarShift(NULL,TimeFrame,Time[BK],false);   
     //------
       valueUP = ////  ((Close[j]-Open[j])+2*(Close[j+1]-Open[j+1])+2*(Close[j+2]-Open[j+2])+(Close[j+3]-Open[j+3])) /6;
                 (    (iClose(NULL,TimeFrame,y)-iOpen(NULL,TimeFrame,y))
                  + 2*(iClose(NULL,TimeFrame,y+1)-iOpen(NULL,TimeFrame,y+1))
                  + 2*(iClose(NULL,TimeFrame,y+2)-iOpen(NULL,TimeFrame,y+2))
                  +   (iClose(NULL,TimeFrame,y+3)-iOpen(NULL,TimeFrame,y+3)) ) /6;
     //------
       valueDN = ////  ((High[j]-Low[j])+2*(High[j+1]-Low[j+1])+2*(High[j+2]-Low[j+2])+(High[j+3]-Low[j+3])) /6;
                 (    (iHigh(NULL,TimeFrame,y)-iLow(NULL,TimeFrame,y))
                  + 2*(iHigh(NULL,TimeFrame,y+1)-iLow(NULL,TimeFrame,y+1))
                  + 2*(iHigh(NULL,TimeFrame,y+2)-iLow(NULL,TimeFrame,y+2))
                  +   (iHigh(NULL,TimeFrame,y+3)-iLow(NULL,TimeFrame,y+3)) ) /6;
     //------
       NumUP += valueUP;
       NumDN += valueDN;
      }  /// *конец цикла* for (j=i; j<i+RVIPeriod; j++)
   //------
     if (NumDN!=0)
         preRVIBuff[i] = NumUP/NumDN;
     else
         preRVIBuff[i] = NumUP;   
    }  /// *конец цикла* for (i=0; i<=limit; i++)
//+++======================================================================+++
//+++                      RVIxn + ADXpmDI MTF TT                          +++
//+++======================================================================+++

   limit=Bars-RVIPeriod-7;
   if (CountedBars>RVIPeriod+8) limit=Bars-CountedBars+1;
//------
   for (i=0; i<=limit; i++)
    {
     preRVISign[i] = (preRVIBuff[i] + 2*preRVIBuff[i+1] + 2*preRVIBuff[i+2] + preRVIBuff[i+3]) /6;
     RVIBuff[i]    =  preRVIBuff[i]*6;
     RVISign[i]    =  preRVIBuff[i];  ////preRVISig[i]*1;
    }
//+++======================================================================+++
//+++======================================================================+++
//------
return(0);
}
//+++======================================================================+++
//+++                      RVIxn + ADXpmDI MTF TT                          +++
//+++======================================================================+++