OnTimer и очередь выполнения.

 

Всем привет,

кто знает ответ на вопрос: как обстоит дела с очередью в OnTimer ? тоесть допустим есть OnTimer с 1 секундой, соответственно код внутри OnTimer выполняется например 5 секунд

значит ли это, что в очередь выполнения OnTimer выставится 5 приказов на исполнение OnTimer?

 
Vladislav Andruschenko:

Всем привет,

кто знает ответ на вопрос: как обстоит дела с очередью в OnTimer ? тоесть допустим есть OnTimer с 1 секундой, соответственно код внутри OnTimer выполняется например 5 секунд

значит ли это, что в очередь выполнения OnTimer выставится 5 приказов на исполнение OnTimer?

это лекго можно проверить в тесте

 
Vladislav Andruschenko:

Всем привет,

кто знает ответ на вопрос: как обстоит дела с очередью в OnTimer ? тоесть допустим есть OnTimer с 1 секундой, соответственно код внутри OnTimer выполняется например 5 секунд

значит ли это, что в очередь выполнения OnTimer выставится 5 приказов на исполнение OnTimer?

в советнике точно не придут сообщения

в индикаторе крайне не рекомендуется - там один поток на терминал на все индюки, проверяли, все виснет

в сове можно 

 

Никто не читает документацию...

https://www.mql5.com/ru/docs/eventfunctions/eventsettimer

Для каждой программы может быть запущено не более одного таймера. Каждая mql5-программа и каждый график имеют свою собственную очередь событий, куда складываются все вновь поступающие события. Если в очереди уже есть событие Timer либо это событие находится в состоянии обработки, то новое событие Timer в очередь mql5-программы не ставится.

Документация по MQL5: Работа с событиями / EventSetTimer
Документация по MQL5: Работа с событиями / EventSetTimer
  • www.mql5.com
Работа с событиями / EventSetTimer - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
//+------------------------------------------------------------------+
//|                                                            2.mq4 |
//|                                           Copyright 2016,  Yuraz |
//|                                                      yzh@mail.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016,  Yuraz"
#property link      "yzh@mail.ru"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
datetime ttim=0;
int iii=0;

int OnInit()
  {
//--- create timer
   EventSetTimer(1);
      
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
   EventKillTimer();
      
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
    ttim = TimeLocal();
    if ( iii == 3 )
    {
        Sleep(1000*10); ///  делаем зависание на 10 секунд
    }
    
    iii++;
    printf(" %d  %s " , iii , TimeToString( ttim , TIME_DATE|TIME_MINUTES|TIME_SECONDS ));
   
  }



провел тест на MT5 1368


2016.07.15 11:55:46.609    1 (EURUSD,H1)     7  2016.07.15 11:55:46
2016.07.15 11:55:45.609    1 (EURUSD,H1)     6  2016.07.15 11:55:45
2016.07.15 11:55:44.671    1 (EURUSD,H1)     5  2016.07.15 11:55:44
2016.07.15 11:55:44.671    1 (EURUSD,H1)     4  2016.07.15 11:55:34
2016.07.15 11:55:33.608    1 (EURUSD,H1)     3  2016.07.15 11:55:33
2016.07.15 11:55:32.608    1 (EURUSD,H1)     2  2016.07.15 11:55:32
2016.07.15 11:55:31.608    1 (EURUSD,H1)     1  2016.07.15 11:55:31



повторил тест на MT4   988



2016.07.15 11:52:27.289    2 EURUSD,H4:  9  2016.07.15 11:52:27
2016.07.15 11:52:26.289    2 EURUSD,H4:  8  2016.07.15 11:52:26
2016.07.15 11:52:25.289    2 EURUSD,H4:  7  2016.07.15 11:52:25
2016.07.15 11:52:24.288    2 EURUSD,H4:  6  2016.07.15 11:52:24
2016.07.15 11:52:23.335    2 EURUSD,H4:  5  2016.07.15 11:52:23
2016.07.15 11:52:23.335    2 EURUSD,H4:  4  2016.07.15 11:52:13
2016.07.15 11:52:12.288    2 EURUSD,H4:  3  2016.07.15 11:52:12
2016.07.15 11:52:11.288    2 EURUSD,H4:  2  2016.07.15 11:52:11
2016.07.15 11:52:10.288    2 EURUSD,H4:  1  2016.07.15 11:52:10
2016.07.15 11:52:09.288    2 EURUSD,H4: initialized
2016.07.15 11:52:07.475    Expert 2 EURUSD,H4: loaded successfully

---

работает как описано

 
Slawa:

Никто не читает документацию...

https://www.mql5.com/ru/docs/eventfunctions/eventsettimer

Спасибо. Действительно этот момент не заметил. Но вопрос возник именно по проблеме ниже. 

Включаю таймер 
Делаю в таймер слип для своих нужд. И время задержки растёт в геометрической прогрессии. 
Например таймер 1 секунда слип 5 секунд 
Через час таких извращенией получается исполнение таймера на 15-20 минут. 
Вот и решил спросить. 
Если новое событие таймера не выставляется в очередь тогда буду искать баг у себя. 
 
Slawa:

Никто не читает документацию...

https://www.mql5.com/ru/docs/eventfunctions/eventsettimer

Слава, мы именно с Вами это обсуждали. Для советников именно так, а все же для индикаторов одна очередь на всех?
 
Vladislav Andruschenko:
Спасибо. Действительно этот момент не заметил. Но вопрос возник именно по проблеме ниже. 

Включаю таймер 
Делаю в таймер слип для своих нужд. И время задержки растёт в геометрической прогрессии. 
Например таймер 1 секунда слип 5 секунд 
Через час таких извращенией получается исполнение таймера на 15-20 минут. 
Вот и решил спросить. 
Если новое событие таймера не выставляется в очередь тогда буду искать баг у себя. 
Я тоже такое замечал, такое чувство, что таймер неаппаратный. То есть зависит от времени выполнения в его теле.
 
Alexey Volchanskiy:
Слава, мы именно с Вами это обсуждали. Для советников именно так, а все же для индикаторов одна очередь на всех?
Slawa:

Никто не читает документацию...

Точно.

https://www.mql5.com/ru/docs/common/sleep

Функцию Sleep() нельзя вызывать из пользовательских индикаторов, так как индикаторы выполняются в интерфейсном потоке и не должны его тормозить.

Документация по MQL5: Общие функции / Sleep
Документация по MQL5: Общие функции / Sleep
  • www.mql5.com
Общие функции / Sleep - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Причина обращения: