Вопрос по OnTimer и возможным альтернативам

 
Предположим, есть три функции. Первая должна вызываться каждую минуту, вторая - каждый час, третья - раз в сутки.

Таймер, если я правильно понимаю, может быть только один. Как бы относительно эффективно реализовать две остальные?

Мой креатив на эту тему с горем пополам работает, но может есть более простой способ? 

Есть подозрение, что он заметно тормозит тестер как минимум на инициализации, а вероятнее каждый тик.

int Bar[];

int OnInit() {
   ArrayResize(Bar,2);
   BarCount(0,true);
   BarCount(1,true);
   EventSetTimer(60);
}

void OnTick() {
   if(BarCount() > Bar[0]){
      BarCount[0,true];
      FunctionDaily();
   }
   if(BarCount(1) > BarCount[1]){
      BarCount[1,true];
      FuncionHour();
   }
   return; 
}

void OnTimer() {
   FunctionMinute();
   return;
}

int BarCount(int Hour = 0, bool Save = false){
   ENUM_TIMEFRAMES Per = PERIOD_D1;
   if(Hour > 0) Per = PERIOD_H1;
   int BarsNow = Bars(_Symbol,Per);
   if(!Save) return(BarsNow);
   else Bar[Hour] = BarsNow;
   return(0);
}

 И смежная тема - устанавливаемый таймер а-ля "таймаут до". Есть ли варианты помимо просто записи времени в глобальную переменную? Просто есть смутное ощущение, что при написании большинства экспертов подобные задачи должны бы быть актуальными. И, следовательно, что их до меня уже сто раз успели реализовать более опытные товарищи. И вместо того, чтобы изобретать велосипед, стоило бы воспользоваться готовым девайсом, который почему-то не попадается среди документации...

Документация по MQL5: Основы языка / Переменные / Глобальные переменные
Документация по MQL5: Основы языка / Переменные / Глобальные переменные
  • www.mql5.com
Основы языка / Переменные / Глобальные переменные - Документация по MQL5
 
papaklass:

Попробуйте так:

Спасибо, на вид намного лучше моего варианта :) Попробую. 
 
Lone_Irbis:
Предположим, есть три функции. Первая должна вызываться каждую минуту, вторая - каждый час, третья - раз в сутки.

Таймер, если я правильно понимаю, может быть только один. Как бы относительно эффективно реализовать две остальные?

Мой креатив на эту тему с горем пополам работает, но может есть более простой способ? 

Есть подозрение, что он заметно тормозит тестер как минимум на инициализации, а вероятнее каждый тик.

 И смежная тема - устанавливаемый таймер а-ля "таймаут до". Есть ли варианты помимо просто записи времени в глобальную переменную? Просто есть смутное ощущение, что при написании большинства экспертов подобные задачи должны бы быть актуальными. И, следовательно, что их до меня уже сто раз успели реализовать более опытные товарищи. И вместо того, чтобы изобретать велосипед, стоило бы воспользоваться готовым девайсом, который почему-то не попадается среди документации...

так не устроит?

//+------------------------------------------------------------------+
//|                                                        timer.mq5 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                              http://www.mql5.com |
//+------------------------------------------------------------------+
long timerminut=0,
     timerhour=0,
     timerday=0;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(TimeCurrent()-timerminut>60)
     {
      //<---исполнение кода
      timerminut=TimeCurrent();
     }
   if(TimeCurrent()-timerhour>3600)
     {
      //<---исполнение кода
      timerhour=TimeCurrent();
     }
   if(TimeCurrent()-timerday>86400)
     {
      //<---исполнение кода
      timerday=TimeCurrent();
     }
  }
//+------------------------------------------------------------------+
 
Lone_Irbis:
Suppose there are three functions. The first to be called every minute, second - every hour, and the third - once a day.

Timer, if I understand correctly, there can be only one. How would relatively efficiently implement the other two?

My creative on this topic with grief in half works, but may have an easier way?

There is a suspicion that it noticeably slows tester at least initialization, and probably every tick.

...

#define HOUR 60
#define DAY 1440
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
   EventSetTimer(60);
      
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
//---
   static int count=0;
   
   count++;
   FunctionMinute();
   
   if(count%HOUR==0) FunctionHour();
      
   if(count%DAY==0) FunctionDaily();

  }

void FunctionMinute()
{
   Print(__FUNCTION__," ",TimeToString(TimeLocal()));
}

void FunctionHour()
{
   Print(__FUNCTION__," ",TimeToString(TimeLocal()));
}

void FunctionDaily()
{
   Print(__FUNCTION__," ",TimeToString(TimeLocal()));
}
//+------------------------------------------------------------------+
 
angevoyageur:
Thanks! This version is even better :) Adapted it for my script now -- works flawlessly and no longer requires multiple datetime counters. 
 
Lone_Irbis:
Thanks! This version is even better :) Adapted it for my script now -- works flawlessly and no longer requires multiple datetime counters. 
You are welcome. (sorry but I can't write in Russian).
 
angevoyageur:
Seems that "count" variable should be set to 0 somewhere (f.e. based on daily) to be not overcounted.
Причина обращения: