Может ли OnTimer вызываться реже из-за использования библиотек

 
Коротко: имеем задержки между вызовами OnTimer не связанные с работой советника

Ситуация целиком:
Ситуация следующая, есть несколько советников на терминале которые используют одну и туже библиотеку. 
Основная работа советников прописана в OnTimer. OnTick вообще не используется.
Задержку я поставил в 50 милисекунд - EventSetMillisecondTimer(50);
Но заметил что появились лаги, советник будто бы замирает на 5-40 секунд, не откликается ни на что (есть очень много обрабатываемых событий в OnChartEvent). 
Задержки произвольного характера, не зависят ни от действий пользователя, ни от задач самого советника.

С начала стал грешить на сам советник, он очень очень очень большой, 7.5к строчек кода. 
Стал отлавливать максимальное время выполнения всех функций и сброс отчета каждые 5 минут.

datetime time_bar_ontimer_all;
int      ontimes_parts_all=18;
int      ontimer_partall_interation[18];
uint     ontimer_partall_time_total[18];
uint     ontimer_partall_time_max[18];

void OnTimer() {
   // каждые 5 минут сбросим отчет в журнал
   if(time_bar_ontimer_all!=iTime(Symb,PERIOD_M5,0)) {
      time_bar_ontimer_all = iTime(Symb,PERIOD_M5,0);
      double avg = 0;
      if(ontimer_partall_interation[0]>0) avg = ontimer_partall_time_total[0]/ontimer_partall_interation[0];
         else avg=0;
      Print(StringConcatenate(login," report OnTimer: max: ",(string)ontimer_partall_time_max[0]," avg: ",(string)avg,
            " total: ",(string)ontimer_partall_time_total[0]," / ",(string)ontimer_partall_interation[0]));
      // т.... тут также еще для 17 функций
      // обнулим массивы
      ArrayInitialize(ontimer_partall_interation,0);
      ArrayInitialize(ontimer_partall_time_total,0);
      ArrayInitialize(ontimer_partall_time_max,0);
      }

   // маркер времени в начале функции   
   uint  ontime_marker_all  = GetTickCount();    

   ... тут код функции ....

   // в конце функции   
   ontimer_partall_interation[0]++;
   ontimer_partall_time_total[0]+=GetTickCount()-ontime_marker_all;
   if(GetTickCount()-ontime_marker_all > ontimer_partall_time_max[0]) ontimer_partall_time_max[0] = GetTickCount()-ontime_marker_all;
   }

Никаких критичных задержек не оказалось, функции выполняются достаточно быстро (в крайнем случае в районе 1000 минисекунд, но на то были причины). никаких задержек в 5-40 секунд нет и близко.

Пошел дальше, решил отловить сколько времени проходит с момента вызова прошлого OnTimer()
uint     ontimer_last_tick;

   if(GetTickCount()-ontimer_last_tick>=5000) PnC(StringConcatenate("Задержка более 5 секунд Tick ",(string)ontimer_last_tick," - ",(string)GetTickCount()," : ",(string)(GetTickCount()-ontimer_last_tick)),0);
   ontimer_last_tick = GetTickCount();
и вот тут я увидел эти самые задержки на 5+ секунд. Что удивило - каждая копия советинка получает эти задержки в одно и тоже время.

Ради эксперимента я поставил рядом еще один советник, который только и делает что отлавливает эти задержки, никакова функционала в нем нет (код прикладываю).
Опять та же самая ситуация - задержки, синхронно с остальными советниками. В момент задержки графики переключаются хорошо, но OnTimer у советников не работает по расписанию, даже у тех у которых вообще ничего нет в коде.

Из библиотек подключены kernel32.dll и user32.dll - работа с буфером обмена. И еще одна библиотека которую сделал другой программист. Вот в ней то и есть сомнения. 

Вопрос: могут ли используемые библиотеки приводить к задержке вызова OnTimer самим терминалом? могут ли они так его "ложить"? 
Файлы:
Test.mq4  2 kb
 
Nikolay Khrushchev:
Коротко: имеем задержки между вызовами OnTimer не связанные с работой советника

Ситуация уже обсуждалась. Советник однопоточен, так что в случае занятости OnTimer может быть пропущен. Пропущенные не выполняются в догонку.

Вообще, 50 мс очень мало, в windows собственная гранулярность вызова задач 16-25 мс минимум, это же не система реального времени. Бог его знает, как в MQL устроен таймер, но все же.

Я у себя задаю одну секунду.

 
Alexey Volchanskiy:

Ситуация уже обсуждалась. Советник однопоточен, так что в случае занятости OnTimer может быть пропущен. Пропущенные не выполняются в догонку.

Вообще, 50 мс очень мало, в windows собственная гранулярность вызова задач 16-25 мс минимум, это же не система реального времени. Бог его знает, как в MQL устроен таймер, но все же.

Я у себя задаю одну секунду.

можно ссылку где было обсуждение?
задержки не постоянные, то они есть, то их часами нет. 
стоит 8 советников, "зависают" они одновременно вот что странно. 
на втором терминале 6 советников, также одновременные зависания, но гораздо реже. (рабочая нагрузка там раза в 3 меньше чем на первом, и зависаний также раза в 3 меньше).
на третьем терминале стоит 2 советника, рабочей нагрузки в нем 1/20 от того что у первого - зависаний вообще нет.

т.е. зависания как то связанны с обьемом работы на терминале, зависания проходят по всем советникам на всем терминале, сама работа советников хоть и весьма обьемная но тем не мение проходит быстро.
обращений к функциям третьей библиотеки достаточно много. Суммарно со всех терминалов 15-20 тысяч в минуту. 

К сожалению для решаемой задачи минуты не достаточно.

Остается вариант зацикленного советника вместе с sleep(50) ?
поставил на тест простой зацикленный советник также с отслеживанием задержек. если он не будет "виснуть" - перейду на этот вариант вероятно.

кстати OnTimer нормально переваривает и меньший тайминг, пробовал 10 милисекунд - работает каждые 10 милисекунд.
 
Nikolay Khrushchev:
можно ссылку где было обсуждение?
задержки не постоянные, то они есть, то их часами нет. 
стоит 8 советников, "зависают" они одновременно вот что странно. 
на втором терминале 6 советников, также одновременные зависания, но гораздо реже. (рабочая нагрузка там раза в 3 меньше чем на первом, и зависаний также раза в 3 меньше).
на третьем терминале стоит 2 советника, рабочей нагрузки в нем 1/20 от того что у первого - зависаний вообще нет.

т.е. зависания как то связанны с обьемом работы на терминале, зависания проходят по всем советникам на всем терминале, сама работа советников хоть и весьма обьемная но тем не мение проходит быстро.
обращений к функциям третьей библиотеки достаточно много. Суммарно со всех терминалов 15-20 тысяч в минуту. 

К сожалению для решаемой задачи минуты не достаточно.

Остается вариант зацикленного советника вместе с sleep(50) ?
поставил на тест простой зацикленный советник также с отслеживанием задержек. если он не будет "виснуть" - перейду на этот вариант вероятно.

кстати OnTimer нормально переваривает и меньший тайминг, пробовал 10 милисекунд - работает каждые 10 милисекунд.

Увы, ссылку не сохранил, надо искать.

Какой минуты? Я написал, у меня секунда.

Кстати, а нагрузку на процессор посмотрите

 
замерь скорость выполнения в функции таймера мест работающих с ордерами и файлами. тут только искать какое место создаёт задержку. запустить профилирование или реализуй свое
 
Alexandr Gavrilin:
замерь скорость выполнения в функции таймера мест работающих с ордерами и файлами. тут только искать какое место создаёт задержку. запустить профилирование или реализуй свое
так и сделал и написал об этом в первом сообщении.
Стал отлавливать максимальное время выполнения всех функций и сброс отчета каждые 5 минут.
Никаких критичных задержек не оказалось, функции выполняются достаточно быстро (в крайнем случае в районе 1000 минисекунд, но на то были причины). никаких задержек в 5-40 секунд нет и близко.
 
Alexey Volchanskiy:

Увы, ссылку не сохранил, надо искать.

Какой минуты? Я написал, у меня секунда.

Кстати, а нагрузку на процессор посмотрите

опечатался, секунды не достаточно для решаемых задач.

нагрузка не превышает 20%. использование памяти 9 гигов.
Все стоит на сервере с ксеоном на 16 физичиских ядер (32 потока) и 128 гигами памяти. 
 
Ищите тормозной индикатор, необязательно в советнике, может просто на графике.
 
Комбинатор:
Ищите тормозной индикатор, необязательно в советнике, может просто на графике.
индикаторов вообще не используется.
только советники. скорость выполнение советников своего кода замерял - все в норме всегда.
"зависания" синхронные на всех советниках терминала. т.е. по какой то причине терминал не вызывает OnTimer по заданному расписанию.
 
А сам терминал не тормозит при этом? Просто по описанию советник ни при чем. Ну или в коде советника есть ситуация когда советник может тупить непрерывно 40 секунд.
 
Комбинатор:
А сам терминал не тормозит при этом? Просто по описанию советник ни при чем. Ну или в коде советника есть ситуация когда советник может тупить непрерывно 40 секунд.

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

терминал висит частично, цифры "средства" бегают быстро всегда, а вот все остальное тормозит.

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