Коротко: имеем задержки между вызовами OnTimer не связанные с работой советника
Ситуация уже обсуждалась. Советник однопоточен, так что в случае занятости OnTimer может быть пропущен. Пропущенные не выполняются в догонку.
Вообще, 50 мс очень мало, в windows собственная гранулярность вызова задач 16-25 мс минимум, это же не система реального времени. Бог его знает, как в MQL устроен таймер, но все же.
Я у себя задаю одну секунду.
Ситуация уже обсуждалась. Советник однопоточен, так что в случае занятости OnTimer может быть пропущен. Пропущенные не выполняются в догонку.
Вообще, 50 мс очень мало, в windows собственная гранулярность вызова задач 16-25 мс минимум, это же не система реального времени. Бог его знает, как в MQL устроен таймер, но все же.
Я у себя задаю одну секунду.
задержки не постоянные, то они есть, то их часами нет.
стоит 8 советников, "зависают" они одновременно вот что странно.
на втором терминале 6 советников, также одновременные зависания, но гораздо реже. (рабочая нагрузка там раза в 3 меньше чем на первом, и зависаний также раза в 3 меньше).
на третьем терминале стоит 2 советника, рабочей нагрузки в нем 1/20 от того что у первого - зависаний вообще нет.
т.е. зависания как то связанны с обьемом работы на терминале, зависания проходят по всем советникам на всем терминале, сама работа советников хоть и весьма обьемная но тем не мение проходит быстро.
обращений к функциям третьей библиотеки достаточно много. Суммарно со всех терминалов 15-20 тысяч в минуту.
К сожалению для решаемой задачи минуты не достаточно.
Остается вариант зацикленного советника вместе с sleep(50) ?
поставил на тест простой зацикленный советник также с отслеживанием задержек. если он не будет "виснуть" - перейду на этот вариант вероятно.
кстати OnTimer нормально переваривает и меньший тайминг, пробовал 10 милисекунд - работает каждые 10 милисекунд.
можно ссылку где было обсуждение?
задержки не постоянные, то они есть, то их часами нет.
стоит 8 советников, "зависают" они одновременно вот что странно.
на втором терминале 6 советников, также одновременные зависания, но гораздо реже. (рабочая нагрузка там раза в 3 меньше чем на первом, и зависаний также раза в 3 меньше).
на третьем терминале стоит 2 советника, рабочей нагрузки в нем 1/20 от того что у первого - зависаний вообще нет.
т.е. зависания как то связанны с обьемом работы на терминале, зависания проходят по всем советникам на всем терминале, сама работа советников хоть и весьма обьемная но тем не мение проходит быстро.
обращений к функциям третьей библиотеки достаточно много. Суммарно со всех терминалов 15-20 тысяч в минуту.
К сожалению для решаемой задачи минуты не достаточно.
Остается вариант зацикленного советника вместе с sleep(50) ?
поставил на тест простой зацикленный советник также с отслеживанием задержек. если он не будет "виснуть" - перейду на этот вариант вероятно.
кстати OnTimer нормально переваривает и меньший тайминг, пробовал 10 милисекунд - работает каждые 10 милисекунд.
Увы, ссылку не сохранил, надо искать.
Какой минуты? Я написал, у меня секунда.
Кстати, а нагрузку на процессор посмотрите
замерь скорость выполнения в функции таймера мест работающих с ордерами и файлами. тут только искать какое место создаёт задержку. запустить профилирование или реализуй свое
Никаких критичных задержек не оказалось, функции выполняются достаточно быстро (в крайнем случае в районе 1000 минисекунд, но на то были причины). никаких задержек в 5-40 секунд нет и близко.
Увы, ссылку не сохранил, надо искать.
Какой минуты? Я написал, у меня секунда.
Кстати, а нагрузку на процессор посмотрите
нагрузка не превышает 20%. использование памяти 9 гигов.
Все стоит на сервере с ксеоном на 16 физичиских ядер (32 потока) и 128 гигами памяти.
Ищите тормозной индикатор, необязательно в советнике, может просто на графике.
только советники. скорость выполнение советников своего кода замерял - все в норме всегда.
"зависания" синхронные на всех советниках терминала. т.е. по какой то причине терминал не вызывает OnTimer по заданному расписанию.
А сам терминал не тормозит при этом? Просто по описанию советник ни при чем. Ну или в коде советника есть ситуация когда советник может тупить непрерывно 40 секунд.
вот вот, советник не причем. если бы были тормоза в советнике - я бы увидел это в замерах. Замеры фиксирует каждый раз как вызывается функция и записывают максимальное время выполнение функции.
терминал висит частично, цифры "средства" бегают быстро всегда, а вот все остальное тормозит.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Ситуация целиком:
Ситуация следующая, есть несколько советников на терминале которые используют одну и туже библиотеку.
Основная работа советников прописана в 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;
}
Пошел дальше, решил отловить сколько времени проходит с момента вызова прошлого OnTimer()
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();
Ради эксперимента я поставил рядом еще один советник, который только и делает что отлавливает эти задержки, никакова функционала в нем нет (код прикладываю).
Опять та же самая ситуация - задержки, синхронно с остальными советниками. В момент задержки графики переключаются хорошо, но OnTimer у советников не работает по расписанию, даже у тех у которых вообще ничего нет в коде.
Из библиотек подключены kernel32.dll и user32.dll - работа с буфером обмена. И еще одна библиотека которую сделал другой программист. Вот в ней то и есть сомнения.
Вопрос: могут ли используемые библиотеки приводить к задержке вызова OnTimer самим терминалом? могут ли они так его "ложить"?