Как определить открытие нового бара?

Многие разработчики сталкиваются с задачей определения закрытия бара или момент открытия нового бара т.к. часто нет необходимости анализировать индикаторы каждый тик, а достаточно проанализировать закрытые бары и войти в момент закрытия\открытия бара.

Я в своей практике часто пользуюсь этим и выработал универсальную функцию для определения нового бара, которая работает как на стандартных интервалах так и на нестандартных.

И хочу с вами поделиться ею, можете использовать ее в своих работах и не изобретать велосипед.

 

bool bar_isNew(int mode=0,int period=0){
//0 - при первом запуске возвращает true
//1 - при первом запуске ожидает следующий бар
   static datetime tm[10];
   int t=tfA(period);
   //mn1,w1,d1,h4,h1,m30,m15,m5,m1
   if(tm[t]==0 && mode==1) tm[t]=iTime(Symbol(),period,0);
   if(tm[t] == iTime(Symbol(),period,0)) return (false);
   tm[t] = iTime(Symbol(),period,0);
 
   return (true);
}
 
int tfA(int tf){
switch (tf){
   case PERIOD_M1: return (0);
   case PERIOD_M5: return (1);
   case PERIOD_M15: return (2);
   case PERIOD_M30: return (3);
   case PERIOD_H1: return (4);
   case PERIOD_H4: return (5);
   case PERIOD_D1: return (6);
   case PERIOD_W1: return (7);
   case PERIOD_MN1: return (8);
   default: return (9);
}
}
 
//&& замените на &&

Многие возразят мне, а почему бы не сделать решение простое, например так:

datetime tm_last=0;
...
bool new_bar=(Time[0]!=tm_last);
tm_last=Time[0];

Если у вас простой советник торгующий на одном ТФ, то этого решения будет достаточно. Однако, если вам нужно   анализировать сразу несколько ТФ на разных инструментах, то этого решения недостаточно.

Теперь я немного расскажу логику работы своей функции:

  • мы храним время каждого интервала, по которому мы будем отслеживать закрытие бара
  • если ТФ у нас нестандартный, то мы это храним в отдельной ячейки массива