Два таймера

 

Всем привет!

Есть у кого мысли по поводу реализации двух таймеров в одном советнике? (с разными таймингами соответственно)

 

Тоже мне, бином Ньютона.

int nTimer1 = 0;
int nTimer2 = 0;

int OnInit()
{
   EventSetTimer(1);
}

void OnTimer()
{
   if(nTimer1 >= 5)
   {
      // обработчик 5-секундного таймера
      ...


      nTimer1 = 0;
   }

   if(nTimer2 >= 7)
   {
      // обработчик 7-секундного таймера
      ...


      nTimer2 = 0;
   }

   nTimer1++;
   nTimer2++;
}
 
Sergei Vladimirov:

Тоже мне, бином Ньютона.

Я понимаю, что Вы умный.. запараллелить никак? У меня таймер в ms, каждые 100... задержки по 6 сек в минуту... при таком подходе.

input int         timer=100; //Main timer in ms

input int         watchdog_timer=1; //WatchDog in minutes

 

int watchdog=watchdog_timer*60*1000;

//+------------------------------------------------------------------+

//| Expert initialization function                                   |

//+------------------------------------------------------------------+

int OnInit()

 {

        if(watchdog <= 0)

           _init=INIT_FAILED;

//--- create timer

     EventSetMillisecondTimer(timer);

//---

     return(INIT_SUCCEEDED);

 }

//+------------------------------------------------------------------+

//| Timer function                                                   |

//+------------------------------------------------------------------+

void OnTimer()

{

//---

    watchdog-=timer;      

    if(watchdog <= 0)

    {

       watchdog=watchdog_timer*60*1000;

    }

 
Решил вопрос, спасибо!
 
Matvey Alekseev:

Я понимаю, что Вы умный.. запараллелить никак? У меня таймер в ms, каждые 100... задержки по 6 сек в минуту... при таком подходе.

Тогда можно не подсчитывать количество вызовов OnTimer(), а на каждом вызове проверять значение GetMicrosecondCount(). Распараллелить таймеры средствами МКЛ нельзя.
 
Matvey Alekseev:

У меня таймер в ms, каждые 100... задержки по 6 сек в минуту... при таком подходе.

Это — смотря что там внутри делать.. Можно и за один вызов 6 секунд что-то считать )

Хорошо, что уже решили.

 

Matvey Alekseev:
Решил вопрос, спасибо!

 

Решили ? -  выкладывайте решение в шапку своей темы. 

Или типо никому не дам?  

 
Matvey Alekseev:

Всем привет!

Есть у кого мысли по поводу реализации двух таймеров в одном советнике? (с разными таймингами соответственно)

набросал интерфейс, имплементацию может сделать сами :-)

/** Интервальный таймер
   вариант использования:
      class MyTimer: public Timer {
         MyTimer(int period,datetime startTime=0):Timer(period,startTime) {
            Print("MyTimer created");
         }
         ~MyTimer() {
            Print("MyTimer destroyed");
         }
         bool Clock() {
            Print("MyTimer clock");
         }
      }
      TimeService *ts = new TimeService;  
      MyTimer *new MyTimer(5,TimeCurrent()+5*60); // таймер вызывать раз в 5 сек, начиная с "через 5 мин"

      ts.Add(MyTimer);
      EventSetTimer(2);

      ...
      void OnTick() {
         if ( ((long)(TimeCurrent())%2)==0 ) ts.Clock();
      }
      void OnTimer() {
         ts.Clock()
      }
**/     
class Timer {
public:
   Timer(int period,datetime startTime=0);   // должен срабатывать с периодичностью period начиная со startTime (по умолч.прям сразу)
   ~Timer();
   virtual bool Clock();   // будет вызван при истечении period, если вернёт false то след.вызова не будет
public:
   int period;          // периодичность таймера
   datetime startTime;  // время начала работы
   datetime shedTime;   // время след. запланированного вызова (устанавливается службой)
   Timer *next;         // след. таймер в списке таймеров службы
   TimeService *ts;     // служба таймеров

};

/* служба таймеров - держит список таймеров и по мере необходимости их вызывает
   по идее хватит и одной службы на всё, но можно делать несколько

*/

class TimeService {
public:
   TimeService();      
   ~TimeService();
   virtual void Clock();// должен вызываться при каждом удобном случае
   bool Add(Timer &);   // добавить таймер
   bool Del(Timer &);   // удалить таймер
public:
   Timer *first;        // список таймеров сорт. по времени вызова (shedTime)
   datetime now;        // последнее известное время (время вызова Clock)
};

 
Vladislav Andruschenko:

Решили ? -  выкладывайте решение в шапку своей темы. 

Или типо никому не дам?  

 

int watchdog=1;
int minute_old=TimeMinute(TimeCurrent());

int minute_new=0;

 

void OnTimer()

  {
//---
      
      minute_new=TimeMinute(TimeCurrent());
      
      if((minute_new!=0 && minute_new > minute_old) || (minute_new==0 && minute_new < minute_old))
      {
         minute_old=minute_new;
         watchdog--;
      }
      
      if(watchdog <= 0)
      {

         watchdog=1; 

         //do something
      }
  }

//+------------------------------------------------------------------+

 

пс:админы верните назад форматирование нормальное или руки оторвите вашим вебам, код невозможно нормально вставить и оформить... постоянно пустые строки - бред... 

Автоматический трейдинг и тестирование торговых стратегий
Автоматический трейдинг и тестирование торговых стратегий
  • www.mql5.com
MQL5: язык торговых стратегий для MetaTrader 5, позволяет писать собственные торговые роботы, технические индикаторы, скрипты и библиотеки функций
 
всё одно, неспалось - вот тут https://www.mql5.com/ru/blogs/post/677209 интервальные таймеры :-)
Интервальный таймер
Интервальный таймер
  • 2016.07.29
  • Maxim Kuznetsov
  • www.mql5.com
В общее достояние - ОО реализация интервальных таймеров для MT4. Из фич - произвольное кол-во таймеров, привязка к реальному времени, возможность работы в тестере. Из недостатков - чтобы было совсем...
 
Matvey Alekseev:
int watchdog=1;
int minute_old=TimeMinute(TimeCurrent());

int minute_new=0;

void OnTimer()

  {
//---
      
      minute_new=TimeMinute(TimeCurrent());
      
      if((minute_new!=0 && minute_new > minute_old) || (minute_new==0 && minute_new < minute_old))
      {
         minute_old=minute_new;
         watchdog--;
      }
      
      if(watchdog <= 0)
      {

         watchdog=1; 

         //do something
      }
  }

//+------------------------------------------------------------------+

Как-то не видно двух таймеров...

Хотя, если додумать, то получаем то, что дал Sergei Vladimirov сразу же в очень доходчивой форме. Но его в итоге зафукали, потом подумали и выдали его же решение как свое.

Причина обращения: