открытие нового бара на другом ТФ

Yerkin Sagandykov  
 if  (iTime(nameSym, LPeriod, 0) == counted_bar)  return;  
      counted_bar = iTime( nameSym, LPeriod, 0); 

Здравствуйте !


использую приведенный код для контроля откытия нового бара при ТФ = PERIOD_H1

надо также при некоторых условиях (тог есть не всегда) отслеживать открытие нового бара на меньшем ТФ = PERIOD_5min

как бы это красиво сделать в коде ? 

Valeriy Yastremskiy  
Yerkin Sagandykov:

Здравствуйте !


использую приведенный код для контроля откытия нового бара при ТФ = PERIOD_H1

надо также при некоторых условиях (тог есть не всегда) отслеживать открытие нового бара на меньшем ТФ = PERIOD_5min

как бы это красиво сделать в коде ? 

bool FlagNewBar1=false, FlagNewBar5=false, FlagNewBar15=false, FlagNewBarH1=false,
     FlagNewBarH4=false, FlagNewBarD1=false, FlagNewBarW1=false, FlagNewBarMN1=false;
datetime BarTime1, BarTime5, BarTime15, BarTimeH1, BarTimeH4, BarTimeD1,
         BarTimeW1, BarTimeMN1;

void OnTick()                                      // Спец.функция start
  {
  
if(FlagNewBarF(1, BarTime1,FlagNewBar1))
Alert("FlagNbar1 " ,FlagNewBar1 ,"BarTime1 ",TimeToStr(BarTime1,TIME_DATE|TIME_SECONDS));

if(FlagNewBarF(5, BarTime5,FlagNewBar5))
Alert("FlagNbar5 " ,FlagNewBar5 ,"BarTime5 ",TimeToStr(BarTime5,TIME_DATE|TIME_SECONDS));

if(FlagNewBarF(5, BarTime5,FlagNewBar5))
Alert("FlagNbar5 " ,FlagNewBar5 ,"BarTime5 ",TimeToStr(BarTime5,TIME_DATE|TIME_SECONDS));

if(FlagNewBarF(15, BarTime15,FlagNewBar15))
Alert("FlagNbar15 " ,FlagNewBar15 ,"BarTime15 ",TimeToStr(BarTime15,TIME_DATE|TIME_SECONDS));

if(FlagNewBarF(60, BarTimeH1,FlagNewBarH1))
Alert("FlagNbarH1 " ,FlagNewBarH1 ,"BarTimeH1 ",TimeToStr(BarTimeH1,TIME_DATE|TIME_SECONDS));

if(FlagNewBarF(240, BarTimeH4,FlagNewBarH4))
Alert("FlagNbarH4 " ,FlagNewBarH4 ,"BarTimeH4 ",TimeToStr(BarTimeH4,TIME_DATE|TIME_SECONDS));




   return;                                       // Выход из start()

  }
//--------------------------------------------------------------------
bool FlagNewBarF(int prd, datetime &BarTime,bool &FlagNbar)
  {
   FlagNbar=false;
   if(BarTime!=iTime(NULL,prd,0))
     {
      BarTime=iTime(NULL,prd,0);
      FlagNbar=true;
     }

   return(FlagNbar);
  }
//+------------------------------------------------------------------+

Тока что нарисовал. Алертит как надо)

Mihail Marchukajtes  
bool isNewBar(string INST,int K, ENUM_TIMEFRAMES timeFrame)
  {
//----
   static datetime old_Times[17];// массив для хранения старых значений
   bool res=false;               // переменная результата анализа  
   int  i=0;                     // номер ячейки массива old_Times[]     
   datetime new_Time[1];         // время нового бара

   switch(K)
     {
      case 0:  i= 0; break;
      case 1:  i= 1; break;
      case 2:  i= 2; break;
      case 3:  i= 3; break;
      case 4:  i= 4; break;
      case 5:  i= 5; break;
      case 6: i= 6; break;
      case 7: i= 7; break;
      case 8: i= 8; break;
      case 9: i= 9; break;
      case 10: i=10; break;
      case 11:  i=11; break;
      case 12:  i=12; break;
      case 13:  i=13; break;
      case 14:  i=14; break;
      case 15:  i=15; break;
     }
   // скопируем время последнего бара в ячейку new_Time[0]   
   int copied=CopyTime(INST,timeFrame,0,1,new_Time);
   
   if(copied>0) // все ок. данные скопированы
      {
      if(old_Times[i]!=new_Time[0])       // если старое время бара не равно новому
         {
         if(old_Times[i]!=0) res=true;    // если это не первый запуск, то истина = новый бар
         old_Times[i]=new_Time[0];        // запоминаем время бара
         }
      }
//----
   return(res);
  }
  
Igor Makanu  

Mihail Marchukajtes:

switch(K)
     {
      case 0:  i= 0; break;
      case 1:  i= 1; break;
      case 2:  i= 2; break;
      case 3:  i= 3; break;
      case 4:  i= 4; break;
      case 5:  i= 5; break;
      case 6: i= 6; break;
      case 7: i= 7; break;
      case 8: i= 8; break;
      case 9: i= 9; break;
      case 10: i=10; break;
      case 11:  i=11; break;
      case 12:  i=12; break;
      case 13:  i=13; break;
      case 14:  i=14; break;
      case 15:  i=15; break;
     }

при всем уважении... но по-моему это шедевр ))


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

Обработчик события "новый бар"
Обработчик события "новый бар"
  • www.mql5.com
Для создателей индикаторов и экспертов всегда был актуален вопрос написания экономичного кода с точки зрения времени выполнения. Можно подойти к решению этой задачи с разных сторон. Из этой обширной темы в данной статье будет затронут, казалось бы уже решенный вопрос: проверка появления нового бара. Это достаточно популярный способ ограничения...
Mihail Marchukajtes  
Igor Makanu:

при всем уважении... но по-моему это шедевр ))


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

Так это для 15 инструментов. Пользуюсь по сей день...
Valeriy Yastremskiy  
Mihail Marchukajtes:
Так это для 15 инструментов. Пользуюсь по сей день...
bool isNewBar(string INST,int K, ENUM_TIMEFRAMES timeFrame)
  {
//----
   static datetime old_Times[17];// массив для хранения старых значений
   bool res=false;               // переменная результата анализа  
//   int  i=0;                     // номер ячейки массива old_Times[]     
   datetime new_Time[1];         // время нового бара

  
   // скопируем время последнего бара в ячейку new_Time[0]   
   int copied=CopyTime(INST,timeFrame,0,1,new_Time);
   
   if(copied>0) // все ок. данные скопированы
      {
      if(old_Times[K]!=new_Time[0])       // если старое время бара не равно новому
         {
         if(old_Times[K]!=0) res=true;    // если это не первый запуск, то истина = новый бар
         old_Times[K]=new_Time[0];        // запоминаем время бара
         }
      }
//----
   return(res);
  }
  

А так нельзя разве?)

Mihail Marchukajtes  
Valeriy Yastremskiy:

А так нельзя разве?)

Можно и так, но изначально код был не мой поэтому сильной правки не был подвержен. А если нужно мониторить 15 иснтрументов по 10 таймфреймам, тогда как?
Igor Makanu  
Mihail Marchukajtes:
Можно и так, но изначально код был не мой поэтому сильной правки не был подвержен. А если нужно мониторить 15 иснтрументов по 10 таймфреймам, тогда как?

поверьте на слово, что выделенный мной фрагмент кода ничего не делает с 15-ю инструментами или что еще

ладно, это из другой вселенной видимо знание, закончим

Yerkin Sagandykov  
Igor Makanu:

при всем уважении... но по-моему это шедевр ))


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

..... религия наверное не позволяла   ))

Спасибо всем ! 

тема закрыта для меня

Valeriy Yastremskiy  
Mihail Marchukajtes:
Можно и так, но изначально код был не мой поэтому сильной правки не был подвержен. А если нужно мониторить 15 иснтрументов по 10 таймфреймам, тогда как?

150 переменных, 15 массивов размерностью десять, 15 массивов структуры, один массив размерностью 15 на 10, класс и там функция с 15 переменными и 10 переменных или наоборот. А перечисления еще.... Вариантов много))) 

Вот вопрос что больше места занимает 150 глобальных переменных, 15 массивов размерностью десять, 15 структур в массиве размерностью 10 или массив 15 на 10?

И к чем доступ быстрее к переменным или к элементам массива или структуры?

Mihail Marchukajtes  
Valeriy Yastremskiy:

150 переменных, 15 массивов размерностью десять, 15 массивов структуры, один массив размерностью 15 на 10, класс и там функция с 15 переменными и 10 переменных или наоборот. А перечисления еще.... Вариантов много))) 

Вот вопрос что больше места занимает 150 глобальных переменных, 15 массивов размерностью десять, 15 структур в массиве размерностью 10 или массив 15 на 10?

И к чем доступ быстрее к переменным или к элементам массива или структуры?

К сожалению ответов на Ваш вопрос у меня нет, но то же очень интересно какой из предложенных вариантов более оптимален по времени исполнения и надёжности.
Причина обращения: