Как подсчитать количество баров в текущих сутках

 
У меня идёт перебор по барам. В зависимости от конкретного часа я вписываю в массив конкретного часа значение. Всё хорошо, когда на графике 24 часа, но что делать с нестандартными графиками S&P500 например ? Там всего 21 час. В ручную выставляю количество баров, но и там подвох. Отсчёт начинается не с 0 часов. Замаялся.

Код работает с обычными валютными парами:

void OnTick()
  {
   int currenthour = Hour(); //Узнаём какой сейчас час
   double srKolSvV=0, srKolSvN=0, verPrV=0, verPrN=0, tekOt=0, maxTekOt=0, tekPunctu=0, maxPunctu=0, srTelSv=0, maxTelSv=0;
   double VerSR[]= {};//для отрисовки линий
   double VerPr[]= {};//для отрисовки линий
   double VerRz[]= {};//для отрисовки линий
   double VerSv[]= {};//для отрисовки линий
   
   int VerSRint[]= {};//для отрисовки линий
   int VerPrint[]= {};//для отрисовки линий
   int VerRzint[]= {};//для отрисовки линий
   int VerSvint[]= {};//для отрисовки линий
   
   ArrayResize(VerSR,Unit);//для отрисовки линий
   ArrayResize(VerPr,Unit);//для отрисовки линий
   ArrayResize(VerRz,Unit);//для отрисовки линий
   ArrayResize(VerSv,Unit);//для отрисовки линий
   
   ArrayResize(VerSRint,Unit);//для отрисовки линий
   ArrayResize(VerPrint,Unit);//для отрисовки линий
   ArrayResize(VerRzint,Unit);//для отрисовки линий
   ArrayResize(VerSvint,Unit);//для отрисовки линий
   
   string sComment;
   string pComment;
   string rComment;
   string vComment;
   
   
   
//-----------------------------------------------------
   for(int i=Step-1; i>=0; i--) //проходимся по барам и записываем значение в массив конкретного часа
     {


      if(Open[i]<Close[i])
        {
         srKolSvV++;

         if(Open[i+1]<Close[i+1])
           {
            verPrV++;
           }
        }

      if(Open[i]>Close[i])
        {
         srKolSvN++;

         if(Open[i+1]>Close[i+1])
           {
            verPrN++;
           }
        }

      tekOt = NormalizeDouble((MathMax(srKolSvV,srKolSvN) - MathMin(srKolSvV,srKolSvN))/(i+1)*10,2);
      if(tekOt>maxTekOt)
        {
         maxTekOt=tekOt;
        }

      tekPunctu = (int)((MathMax(Open[i],Close[i]) - MathMin(Open[i],Close[i]))/Point/10);
      if(tekPunctu>maxPunctu)
        {
         maxPunctu=tekPunctu;
        }

      srTelSv += (int)(MathAbs(Open[i]-Close[i])/Point/10);
      maxTelSv += (int)((High[i]-Low[i])/Point/10);
      



     }
//-----------------------------------------------------


   verPrV = round(verPrV/srKolSvV*100);
   verPrN = round(verPrN/srKolSvN*100);
   srTelSv = round(srTelSv/Step);
   maxTelSv = round(maxTelSv/Step);
   srKolSvV = round(srKolSvV/Step*100);
   srKolSvN = round(srKolSvN/Step*100);


   for(int i=Step; i>=1; i--)// тут переменные записываем в массив в зависимости от конкретного часа
     {
     
      int HH=TimeHour(Time[i]);   // Hour  
      int k = currenthour;
      k -= i;

      double r = (int)round((High[i]-Low[i])/Point/10);


      while(k<0)
        {
         k+=Unit;
        }
      while(k>Unit-1)
        {
         k-=Unit;
        }

      if(r>maxTelSv)
        {
         VerSR[HH] +=1 ;
        }
         VerSRint[HH] +=1 ;
        

      if((Open[i]<Close[i]&&Open[i+1]<Close[i+1])||(Open[i]>Close[i]&&Open[i+1]>Close[i+1]))
        {
         VerPr[HH] +=1 ;
        }
         VerPrint[HH] +=1 ;
        
        
      if((Open[i]>Close[i]&&Open[i+1]<Close[i+1])||(Open[i]<Close[i]&&Open[i+1]>Close[i+1]))
        {
         VerRz[HH] +=1 ;
        }
         VerRzint[HH] +=1 ;
      
      VerSv[HH] += (High[i]-Low[i])/Point/10;
      VerSvint[HH] +=1 ;
      

     }
     
     
   for(int j=0; j<ArraySize(VerSR); j++)//записываем комментарии
     {
      sComment = sComment+DoubleToStr(j,0)+":"+DoubleToStr(VerSR[j]/VerSRint[j]*100,0)+ "%  ";
      pComment = pComment+DoubleToStr(j,0)+":"+DoubleToStr(VerPr[j]/VerPrint[j]*100,0)+ "%  ";
      rComment = rComment+DoubleToStr(j,0)+":"+DoubleToStr(VerRz[j]/VerRzint[j]*100,0)+ "%  ";
      string comment = DoubleToStr(j,0)+":"+DoubleToStr(VerSv[j]/VerSvint[j]/maxTelSv*100,0)+ "%";
      while(StringLen(comment)<7)
       {
       comment += "  ";
       }
      vComment = vComment+comment;
     }

   sComment = "Вероятность что свечка окажется большой " + sComment;
   pComment = "Вероятность что будет продолжение         " + pComment;
   rComment = "Вероятность что будет разворот               " + rComment;
   vComment = "Средняя величина свечи в это время         " + vComment;


   if(ti!=iTime(NULL,TF1,0))
     {

      ti=iTime(NULL,TF1,0);

      ObjectsDeleteAll();             // удаляются все объекты с графика.

      for(int i=Step; i>=1; i--)
        {

         if(MathAbs(Close[i]-Open[i])>maxTelSv*_Point*10)// графика 
           {
           // PutTrendLine("up1"+DoubleToStr(i,0),Time[i],High[i]-maxTelSv*_Point*2-srTelSv*_Point*2,Time[i]+PeriodSeconds()*10,High[i]-maxTelSv*_Point*2-srTelSv*_Point*2,Red);
            PutTrendLine("up2"+DoubleToStr(i,0),Time[i],High[i]+(Ask-Bid)/2+maxTelSv*_Point-srTelSv*_Point,Time[i]+PeriodSeconds()*10,High[i]+(Ask-Bid)/2+maxTelSv*_Point-srTelSv*_Point,Red);

           // PutTrendLine("dn1"+DoubleToStr(i,0),Time[i],Low[i]+maxTelSv*_Point*2-srTelSv*_Point*2,Time[i]+PeriodSeconds()*10,Low[i]+maxTelSv*_Point*2-srTelSv*_Point*2,Red);
            PutTrendLine("dn2"+DoubleToStr(i,0),Time[i],Low[i]-maxTelSv*_Point-srTelSv*_Point,Time[i]+PeriodSeconds()*10,Low[i]-maxTelSv*_Point-srTelSv*_Point,Red);

            PutTrendLine("mid"+DoubleToStr(i,0),Time[i],(High[i]+Low[i])/2,Time[i]+PeriodSeconds()*10,(High[i]+Low[i])/2,Aqua);
           }
           
        }
     }

//-----------------------------------------------------
   Comment("\n Количество часов обработанно: ", Step,
           "\n Вероятность роста: ", srKolSvV,
           "\n Вероятность падения: ", srKolSvN,
           "\n Вероятность продолжения роста: ", verPrV,
           "\n Вероятность продолжения падения: ", verPrN,
           "\n Текущее расхождение: ", tekOt,
           "\n Максимальное расхождение: ", maxTekOt,
           "\n Максимальная свеча: ", maxPunctu,
           "\n Среднее тело свечи: ", srTelSv,
           "\n Средней размер свечи: ", maxTelSv,
           "\n ",sComment,
           "\n ",pComment,
           "\n ",rComment,
           "\n ",vComment,
           "\n Прибыль за день: ",Earn(TimeCurrent() / SECONDS_PER_DAY * SECONDS_PER_DAY)
          );





  }
//+----------------------------------
Буду рад за любую помощь, если код будет работать на любом графике таком как нефти или S&P500
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
Документация по MQL5: Доступ к таймсериям и индикаторам / Bars
  • www.mql5.com
Bars - Доступ к таймсериям и индикаторам - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

- определяем время начала суток - iTime - PERIOD_D1
- находим ближайший бар - iBarShift
- если у найденного бара вчерашняя дата, то -1

Полученная цифра = количество сегодняшних баров.

 
Taras Slobodyanik #:

- определяем время начала суток - iTime - PERIOD_D1
- находим ближайший бар - iBarShift
- если у найденного бара вчерашняя дата, то -1

Полученная цифра = количество сегодняшних баров.

Спасибо. Разобрался.

 

получился индикатор

AUDUSDM15

Файлы:
so_v8.5.mq4  19 kb
 
Надо еще одну строчку добавить: "вероятность, что все будет хорошо"
 
SanAlex #:

получился индикатор

на этой паре не хотел показывать 

USA500.IDXM15

вот здесь что то не то 

Снимок экрана 2021-10-11 183620

 

Просьба удалить  эту созданную мною ветку форума. Спасибо

Причина обращения: