Индикаторы: RSI 7TF - страница 3

 
ilmel:
Идея интересная, автору респект, но два момента : на живом графике после перезагрузки индикатора, показания меняются. В тестере вообще что-то невероятное. Мало того, что то, что в тестере не соответствует тому , что на Live Chart, но и еще и в зависимости от даты старта тестирования показания на предыдущей истории ( в тестере) меняются, причем зачастую противоположно...То есть проверить стратегию на истории вообще непонятно как.. Покопался-покопался в коде , но так и не понял, в чем причина такого "поведения" )) ...

в первую очередь зависит от BarShift  - нулевая свеча перерисовывается всегда - не забываем

настройки смотреть надо

 
Всем привет! Автору респект за идею. Что скажу про реализацию, к сожалению мало кто понимает, что индикатор на истории старших ТФ просто дико обманывает, суть обмана в том, что стандартный расчет индикатора производится по цене закрытия, на реальном графике она изменяется, а на истории известна уже в начале свечи. Эту проблему (корректного отображения индикатора старших ТФ) я решил, но уложил на это слишком много сил, чтобы отдать даром. 
Предупреждаю сразу, (я собаку, и не только свою, вынужден был сожрать с потрохами, когда разбирался, почему на истории, в тестере и на онлайн графиках индикатор рисует по разному) если используются индикаторы старших ТФ со стандартным вычислением, то проверить, что он будет рисовать можно ТОЛЬКО на онлайн графиках (причем ТОЛЬКО от времени установки на график). Для примера можете посмотреть триал моего МТФ RSI в маркете (ссылка на продукт удалена). Такой индюк по крайней мере отображает положение индикатора старшего ТФ на закрытии свечи текущего. 
Попробуйте получить эту линию стандартным индикатором на истории ...(
 
Aleksandr Martynov:

Не нарушайте правила ресурса о рекламе пожалуйста.

 
Нем думал, что это реклама. Я предложил взять инструмент и бесплатно оценить разницу между тем, что будет рисовать стандартный индикатор на истории и как "реально" дело обстоит в некотором приближении на младшем ТФ. К сожалению, по крайней мере мне так кажется, стандартные средства терминала работают некорректно в разных режимах. Из за чего страдают люди пытающиеся реализовать свои идеи на основе анализа нескольких ТФ на истории.
Повторюсь еще раз НА ИСТОРИИ цена закрытия свечи любого ТФ известна, а по сему стандартный индикатор будет рисовать старший ТФ совсем не так, как это происходит в реальном времени. С тестером, можно еще поэкспериментировать, Но много вы видели людей, которым интересно прогнать сначала индюк на тестере, где график будет жить ровно до отключения терминала (если мне память не изменяет), и только потом анализировать
 

Ну...! За понимание!


//+------------------------------------------------------------------+
//|                                                      RSI_7TF.mq4 |
//|                                              Copyright 2016, Tor |
//|                                             http://einvestor.ru/ |
//+------------------------------------------------------------------+
/*


*/

#property strict
#property indicator_chart_window
#property indicator_buffers 6
#property indicator_plots   2


input int barlimit=1000;            // Limiting the number of bars
input int RSIPeriod=14;             // RSI Period
input int BarShift=1;               //Bar shift (0=current)
input bool alerts=false;            // Enable alerts
input bool alertReversSignal=true; // Alert when changing trend
enum TypeFR
  {
   DeltaRSI  = 0,    // RSI Trend for 1 bar
   DeltaRSI2 = 1,    // RSI Trend for 2 bar
   Znachenie = 2,    // OverSell / OverBuy
   Chena     = 3,    // Price difference
   Crossing  = 4,    // Crossing line
   TrendCross = 5,   // Trend + Crossing line
  };
//--- input parameters
input TypeFR TypePostroenia=DeltaRSI; // Mode 


//+------------------------------------------------------------------+



double increaser=1.2; // Sensitivity (1 - 1.5)
input color BuyClr=clrAqua;
input color SellClr=clrCoral;



double BufferBuy[];
double BufferSell[];

int TF[7];//Массив таймфреймов для перебора.Всего восемь ячеек.
int Maperiod=5;
int alertLevel1=90; // Signal level
int alertLevel2=70; // Signal level
int alertLevel = 0;
int sto=100;
int Maperiod2=26;

bool ArrowTrue[7];
static datetime lastsig[7];





//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping



   SetIndexBuffer(0,BufferBuy);   SetIndexStyle(0,DRAW_ARROW,STYLE_SOLID,1,BuyClr);     SetIndexArrow(0,233);    SetIndexLabel(0,"Buy");
   SetIndexBuffer(1,BufferSell);  SetIndexStyle(1,DRAW_ARROW,STYLE_SOLID,1,SellClr);    SetIndexArrow(1,234);    SetIndexLabel(1,"Sell");

   


   TF[0] = 5;
   TF[1] = 15;
   TF[2] = 30;
   TF[3] = 60;
   TF[4] = 240;
   TF[5] = 1440;
   TF[6]=10080;
  



  
   ArrayInitialize(lastsig,0);

 

   if(TypePostroenia==2 || TypePostroenia==4)
     {
      alertLevel=alertLevel2;
        }else{
      alertLevel=alertLevel1;
     }

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {

   return(0);
  }
//+------------------------------------------------------------------+
//| 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 i,limit; 

   
   if(_Period>10080)
   {
      Alert("Max TF W1, please change TF"); 
      return(0); 
   }
   
   
//---
   if(rates_total<=0)
      return(0);
//--- last counted bar will be recounted





   static string LastSignal=""; 
   static string type5="";
 
   int seletedTF;
   
   for(int chtf=0; chtf<ArrayRange(TF,0);chtf++)
     {
      if(TF[chtf]==_Period)  seletedTF=chtf; 
     }

     
     
   limit=rates_total-prev_calculated;
   if(prev_calculated>0)
      limit++;

   if(barlimit>0 && prev_calculated==0){ limit=barlimit; }
   if(barlimit>rates_total){ limit=rates_total; }

   if(limit>rates_total){ limit=rates_total; }else{ limit=limit; }

   double tmpSinf; int cnt;
 
  

  
   
   
   for(i=limit-1; i>=0; i--)
     {

      type5="";
      cnt=0; tmpSinf=0;
      double a=2;
      
      
      
      //Цикл перебора таймфреймов,всего семь проходов В ШЕСТЬ УСЛОВИЙ.
 
      for(int tf0=0; tf0<ArrayRange(TF,0); tf0++)//ЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦ
        {
         double sinf=0; double c=0;  double b;
         double Tfsinf=0;

         int shiftFF=iBarShift(Symbol(),TF[tf0],iTime(Symbol(),TF[seletedTF],i));//отосительно выбранного TF
         
         if(shiftFF<BarShift)  
         shiftFF=BarShift; 
         
         double rsi0 = iRSI(Symbol(), TF[tf0], RSIPeriod, PRICE_CLOSE, shiftFF);   //ЭТИ ПЕРЕМЕННЫЕ БУДУТ ИСПОЛЬЗОВАНЫ ДЛЯ ИЗМЕРЕНИЯ RSI/
         double rsi1 = iRSI(Symbol(), TF[tf0], RSIPeriod, PRICE_CLOSE, shiftFF+1);
         double rsi2 = iRSI(Symbol(), TF[tf0], RSIPeriod, PRICE_CLOSE, shiftFF+2);
         
         datetime optime=iTime(Symbol(),TF[tf0],shiftFF); // время открытия на этой свече

         double DeltaClose=0;

         if(TypePostroenia==0)
           {
            a=1;                     //количество баров для вычисления угла
            
            //----------------------------------------------------------------
            // Проверка  типа что то синус угла фи.
            // Короче это попитка измерить синус углa на одном баре .
            DeltaClose=rsi0-rsi1;          
            b = MathAbs(DeltaClose);
            c = MathSqrt(MathPow(a,2)+MathPow(b,2));
            if(c==0.0 || b==0.0 || a==0.0) continue; //переход в начало цикла если проверка не удалась
            sinf=(b/c);
            
            
            //----------------------------------------------------------------
            if(rsi0>rsi1) // Короче,просто померяем что больше а что меньше и дело в шляпе.
              {
               Tfsinf=sto*sinf;
              }
            if(rsi0<rsi1) 
              {
               Tfsinf=-sinf*sto;// А потом приделаем минус ну что бы было понятнее что вверх а что вниз.
              }
            Tfsinf=increaser*Tfsinf; //ну и заодно умножим на  (инкрисер?). 
           }
           //Результат ЭТИХ вычислений В ЭТОМ УСЛОВИИ будет либо положительным либо отрицательным И ВСЁ.
           
  

  
 ////////////////////////          
         if(TypePostroenia==1)
           {     // попытка измерения СИНУСА угла на 2х барах аналогичная описанной выше.     
            a =2;//количество баров для вычисления синуса угла
            
            //----------------------------------------------------------------

            DeltaClose=rsi0-rsi2;           
            b = MathAbs(DeltaClose);
            c = MathSqrt(MathPow(a,2)+MathPow(b,2));
            if(c==0.0 || b==0.0 || a==0.0) continue; //переход в начало цикла если проверка не удалась
            sinf=(b/c);
            
            
            //----------------------------------------------------------------
            if(rsi0>rsi2)
              {
               Tfsinf=sto*sinf;
              }
            if(rsi0<rsi2)
              {
               Tfsinf=-sinf*sto;
              }
            Tfsinf=increaser*Tfsinf;
           }
           //Результат ЭТИХ вычислений будет либо положительным либо отрицательным.
           
           
           
           
           
 ////////////////////////
         if(TypePostroenia==2)Tfsinf=(rsi0-50)*5;
         //Результат будет положительным если rsi больше 50 и отрицательным если rsi меньше 50.

           
           
           
 //////////////////////// 
 //Автор измеряет совсем не rsi а просто цену закрытия свечи,вернее синус сначала а потом что бальше или меньше.
 
         if(TypePostroenia==3)
           {
            a=2;
            DeltaClose=iClose(Symbol(),TF[tf0],shiftFF)-iClose(Symbol(),TF[tf0],shiftFF+2);
            b = MathAbs(DeltaClose)/_Point;
            c = MathSqrt(MathPow(a,2)+MathPow(b,2));
            if(c==0.0 || b==0.0 || a==0.0) continue; //переход в начало цикла
            sinf=(b/c);
            //--------------------------------------
            if(DeltaClose>0)
              {
               Tfsinf=sto*sinf;
              }
            if(DeltaClose<0)
              {
               Tfsinf=-sinf*sto;
              }
            Tfsinf=increaser*Tfsinf;
           }

           
           
           
           
           
           
           
 ////////////////////////           
         if(TypePostroenia==4)
           {
            Tfsinf=(rsi0-50)*2;
            double levelUp   = alertLevel;
            double levelDown = 50-(alertLevel-50);
            int asize=tf0-1; if(asize<1){ asize=1; }
            if(asize>1 && asize<=4){ asize=2; }
            if(asize>4){ asize=3; }
            if(rsi0>levelDown && rsi1<=levelDown && lastsig[tf0]!=optime)
              {
               
               lastsig[tf0]=optime;
               if(ArrowTrue[tf0]){ BufferBuy[i]=iLow(Symbol(),0,i); }
               LastSignal="Buy";

               
              }
            if(rsi0<levelUp && rsi1>=levelUp && lastsig[tf0]!=optime)
              {
               lastsig[tf0]=optime;
               if(ArrowTrue[tf0]){ BufferSell[i]=iHigh(Symbol(),0,i); }
               LastSignal="Sell";

               
              }
           }

           
           
           
           
           
  //////////////////////// 

         if(TypePostroenia==5)
           {
            a=1;
            DeltaClose=rsi0-rsi1;
            b = MathAbs(DeltaClose);
            c = MathSqrt(MathPow(a,2)+MathPow(b,2));
            if(c==0.0 || b==0.0 || a==0.0) continue; //переход в начало цикла
            sinf=(b/c);
            
            
             //------------------------------
            if(rsi0>rsi1)
              {
               Tfsinf=sto*sinf;
              }
            if(rsi0<rsi1)
              {
               Tfsinf=-sinf*sto;
              }
            Tfsinf=increaser*Tfsinf;
            
            
            //------------------------------
            double levelUp   = 70;
            double levelDown = 50-(70-50);//Автор инициализирует переменную.
  
            if(rsi0>levelDown && (rsi1<=levelDown))
              {
               if(ArrowTrue[tf0] && lastsig[tf0]!=optime){ type5="Buy"; lastsig[tf0]=optime; }
              }
            if(rsi0<levelUp && (rsi1>=levelUp))
              {
               if(ArrowTrue[tf0] && lastsig[tf0]!=optime){ type5="Sell"; lastsig[tf0]=optime; }
              }
           }

           
           
           
           
  ////////////////////////          
         if(Tfsinf>110) Tfsinf=110; 
         if(Tfsinf<-110)Tfsinf=-110; 
         tmpSinf=tmpSinf+Tfsinf;
  

        }//ЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦЦ
        
        
        
        
        
        
        
        
        
      double prebuf=tmpSinf/(ArrayRange(TF,0));
      if(prebuf>110){ prebuf=110; }
      if(prebuf<-110){ prebuf=-110; }


      
      
      
      
      if(prebuf>=alertLevel && TypePostroenia<4)
        {
         
         LastSignal="Buy";

         BufferBuy[i]=iLow(Symbol(),0,i);
        }
        
        
      if(prebuf<=-alertLevel && TypePostroenia<4)
        {
         
         BufferSell[i]=iHigh(Symbol(),0,i);
         LastSignal="Sell";

        }

        
        
        
        
        
        
        
        
      if(prebuf>=alertLevel && TypePostroenia==5)
        {
         LastSignal="Buy";
        }
      if(prebuf<=-alertLevel && TypePostroenia==5)
        {
         LastSignal="Sell";
        }
        
        
        
        
      if(TypePostroenia==5 && LastSignal=="Sell" && type5=="Sell")
        {
         
         BufferSell[i]=iHigh(Symbol(),0,i);

        }
      if(TypePostroenia==5 && LastSignal=="Buy" && type5=="Buy")
        {
         

         BufferBuy[i]=iLow(Symbol(),0,i);
        }

     }

  //--- return value of prev_calculated for next call
   return(rates_total);
   }
 
Индикатор полностью зависит от недельной свечи, если тренд поменяется - всю неделю перерисует (на 0 свече недельной), а это очень много... поетому нет реальной истории