Скачать MetaTrader 5

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

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

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

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

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

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
Alexander Laur
7793
Alexander Laur  

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

#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+

int lastDay;
int lastHour;
int lastMinute;

MqlDateTime tm;

int OnInit()
  {
   lastDay = 0;
   lastHour = 0;
   lastMinute = 0;

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   TimeToStruct(TimeCurrent(), tm);
   
   if(tm.day != lastDay){
      //здесь выполняется алгоритм для дневного диапазона
      lastDay = tm.day;
   }
   
   if(tm.hour != lastHour){
      //здесь выполняется алгоритм для часового диапазона
      lastHour = tm.hour;
   }
   
   if(tm.min != lastMinute){
      //здесь выполняется алгоритм для минутного диапазона
      lastMinute = tm.min;
   }
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
Lone_Irbis
261
Lone_Irbis  
papaklass:

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

Спасибо, на вид намного лучше моего варианта :) Попробую. 
Alexander Laur
7793
Alexander Laur  
Lone_Irbis:
Спасибо, на вид намного лучше моего варианта :) Попробую. 
 И быстрее (в плане работы робота). Пожалуйста.
pako
3319
pako  
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();
     }
  }
//+------------------------------------------------------------------+
Alain Verleyen
Модератор
31185
Alain Verleyen  
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()));
}
//+------------------------------------------------------------------+
Lone_Irbis
261
Lone_Irbis  
angevoyageur:
Thanks! This version is even better :) Adapted it for my script now -- works flawlessly and no longer requires multiple datetime counters. 
Alain Verleyen
Модератор
31185
Alain Verleyen  
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).
Eugeniy Lugovoy
1991
Eugeniy Lugovoy  
angevoyageur:
Seems that "count" variable should be set to 0 somewhere (f.e. based on daily) to be not overcounted.
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий