Поиск времени открытия и закрытия сессии - страница 4

 
Sergey Gritsay:
Не знаю точно как вы это хотите использовать, но может такой вариант натолкнет на какие мысли
Основная проблема - это учет выходных/"дыр", то есть в некоторых случаях нам нужны бары не совпадающие со временем из входных параметров. Для этого должна быть логика обработки 4 описанных ситуаций, по крайней мере я вижу такое решение.
 
Dmitry Fedoseev:

Только узнаем об этом в понедельник. Нарисовать конец можно и нужно на пятничном баре, но только сдеалть это сможем в понедельник

Я за конец сессии пятницы беру открытие понедельника, так на разных таймфреймах будет одинаковое значение закрытия.
 
Timur Gatin:
Основная проблема - это учет выходных/"дыр", то есть в некоторых случаях нам нужны бары не совпадающие со временем из входных параметров. Для этого должна быть логика обработки 4 описанных ситуаций, по крайней мере я вижу такое решение.
В некоторых это каких? Пока конечно не могу въехать в вашу тему и понять какой результат вы хотите получить.
 
Timur Gatin:
Я за конец сессии пятницы беру открытие понедельника, так на разных таймфреймах будет одинаковое значение закрытия.
Если понедельник открылся так, что первый бар уже попадает в новую сессию?
 
Dmitry Fedoseev:


Пока что правильный результат смог получить только при сессии длинной 24 часа. 

int Index(int& index[][2], int open=0, int close=-1)
  {
//---
   if(open<0) open=0;
   if(open>23) open=23;
   if(close>23) close=23;
   if(close<-1) close=-1;
   if(close==-1) close=open+24;
   if(close<=open) close+=24;
   MqlDateTime mdt={NULL};
   TimeToStruct(Time[0],mdt);
   mdt.sec=0;
   mdt.min=0;
   mdt.hour=open;
   int td=(close-open)*3600;
   datetime to=StructToTime(mdt);//открытие текущей сессии
   datetime tc=to+td;//ее закрытие
   
   int indsize=0;
   for(int i=0;i<bars;i++)//поиск открытия по всем барам от сегодня в прошлое
     {if(Time[i]>to) continue;// не дошли до открытия
      if(Time[i]<to)// перескочили открытие (выходные к примеру)
        {int b=i-1;
         if(b>=0 && Time[b]<tc)//если закрытие не попадает на выходной
           {ArrayResize(index,indsize+1,100);
            index[indsize][0]=b;//сохраняем первый после выходных бар (например, открытие понедельника)
            indsize++;
           }
         while(Time[i]<to && to>Time[bars-1])// пропускаем выходные
           {to-=86400;
            tc-=86400;
           }
        }
      if(Time[i]==to)//открытие совпадает с временем бара
        {ArrayResize(index,indsize+1,100);
         index[indsize][0]=i;
         indsize++;
         to-=86400;
         tc-=86400;
        }
     }
   
   if(open+24==close)//поиск закрытия
     {index[0][1]=0;
      for(int i=1;i<indsize;i++)
        {index[i][1]=index[i-1][0];
        }
      return(indsize);
     }
//---
   return(indsize);
  }
 
Sergey Gritsay:
В некоторых это каких? Пока конечно не могу въехать в вашу тему и понять какой результат вы хотите получить.
При переходе через выходные, посмотрите первый скрин в теме, там вроде понятно все.
 
Dmitry Fedoseev:
Если понедельник открылся так, что первый бар уже попадает в новую сессию?

Предполагается, что время закрытия не входит в сессию, а открытие входит.

В цикле это будет так

for(int i=open;i>close;i--)
 

Лучше не придумал

int Index(int& index[][2], int open=0, int close=-1)
  {
//---
   if(open<0) open=0;
   if(open>23) open=23;
   if(close>23) close=23;
   if(close<-1) close=-1;
   if(close==-1) close=open+24;
   if(close<=open) close+=24;
   MqlDateTime mdt={NULL};
   TimeToStruct(Time[0],mdt);
   mdt.sec=0;
   mdt.min=0;
   mdt.hour=open;
   int td=(close-open)*3600;
   datetime to=StructToTime(mdt);
   datetime tc=to+td;
   if(Time[0]<to)
     {to-=86400;
      tc-=86400;
     }

   
   int A[]={0};
   int asize=0;
   for(int i=0;i<bars;i++)
     {if(to<Time[i]) continue;
      while(Time[i]<=to)
        {ArrayResize(A,asize+1,100);
         int a=i;
         if(Time[i]<to) a=i-1;
         A[asize]=a;
         asize++;
         to-=86400;
        }
     }

   
   int B[]={0};
   int bsize=0;
   for(int i=0;i<bars;i++)
     {if(tc<Time[i]) continue;
      while(Time[i]<=tc)
        {ArrayResize(B,bsize+1,100);
         int b=i;
         if(Time[i]<tc) b=i-1;
         B[bsize]=b;
         bsize++;
         tc-=86400;
        }
     }

   
   int indsize=0;
   for(int i=0;i<asize;i++)
     {if(A[i]!=B[i])
        {ArrayResize(index,indsize+1,100);
         index[indsize][0]=A[i];
         index[indsize][1]=B[i];
         indsize++;
        }
     }
//---
   return(indsize);
  } 
 
Timur Gatin:

Предполагается, что время закрытия не входит в сессию, а открытие входит.

В цикле это будет так

Имелся ввиду разрыв в барах, так, что время первого бара понедельника входит в сессию и время последнего бара пятницы входит в сессию.
Причина обращения: