Баг MQL5 при работе c доступом к таймсериям iClose/iOpen и т.д. - страница 7

 
Renat Fatkhullin:

1) Замерьте время выполнения одного обсчета OnTick/OnCalculate в микросекундах и выводите их в лог.

Так вы сможете увидеть, сколько времени вы тратите на обсчет одного тика. После чего оцените, сколько тиков при такой скорости вы можете обсчитывать в секунду. Наверняка окажется, что не больше десятка тиков, а их приходит заведомо больше в секунду.


2) Замерьте время обсчета каждого OnCalculate на индикаторах, которые прикреплены в чартам/таймфреймам, откуда вы извлекаете данные.

Там наверняка аналогичная ситуация. Из-за тормозных вычислений терминал ждет, пока будет разблокирован просчитываемый символ:таймфрейм. Именно тормозные индикаторы, тем более на глубокой истории, приводят к заморозке отдачи чужих чартов.


При разработке индикаторов нужно вопросы производительности и экономные пересчеты ставить на первое место. Иначе убьете все вокруг.

Ренат, как-то совсем грустно стало. Тики теперь ждут, пока я разгребу свои проблемы? До сих пор я полагал, что тики генерируются сами по себе, а я либо успеваю, либо нет. А теперь оказывается, что я могу подвесить систему. 

 
Алексей Тарабанов:

Ренат, как-то совсем грустно стало. Тики теперь ждут, пока я разгребу свои проблемы? До сих пор я полагал, что тики генерируются сами по себе, а я либо успеваю, либо нет. А теперь оказывается, что я могу подвесить систему. 

Индикатор выполняется на каждом тике, без пропусков. Нужно все время контролировать длительность OnCalculate и частоту прихода тиков. Иначе получите затык.

Самое простое воспроизведение - запустить индикатор на кастомном символе и начать пробрасывать в него тики с определенной частотой. По мере увеличения частоты увидите тормоза. Все логично.

 

В каких случаях индикатор может не нарисовать своё значение? буферы заполнены валидными значениями, а на чарте у индикатора пусто.... ладно хоть не наоборот. билд 1940

1944 так же. наверно так и должно быть

 
fxsaber:

Индикатор выполняется на каждом тике, без пропусков. Нужно все время контролировать длительность OnCalculate и частоту прихода тиков. Иначе получите затык.

Самое простое воспроизведение - запустить индикатор на кастомном символе и начать пробрасывать в него тики с определенной частотой. По мере увеличения частоты увидите тормоза. Все логично.

Да, именно так.

 
Алексей Тарабанов:

Ренат, как-то совсем грустно стало. Тики теперь ждут, пока я разгребу свои проблемы? До сих пор я полагал, что тики генерируются сами по себе, а я либо успеваю, либо нет. А теперь оказывается, что я могу подвесить систему. 

Тики всегда ждали. Мы гарантируем вызов OnCalculate на каждом тике.

Если в четвёрке это приводило к заморозке GUI, то в пятёрке это всего лишь задержка отдельного потока обработки конкретного символа. И в пятёрке так было всегда. Просто Вы это увидели только теперь

 
Renat Fatkhullin:

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

Бета версия 1946 доступна через Help -> Check Desktop Updates -> Latest Beta Version.

Обновился, будем тестировать.

Вопрос, была ли текущая проблема связанна и с случаями загрузки данных других инструментов (невидимого таймфрейма), я о мультивалютных индикаторах и экспертах или это не взаимосвязанные проблемы?

 
Slava:

Тики всегда ждали. Мы гарантируем вызов OnCalculate на каждом тике.

Если в четвёрке это приводило к заморозке GUI, то в пятёрке это всего лишь задержка отдельного потока обработки конкретного символа. И в пятёрке так было всегда. Просто Вы это увидели только теперь

в логе терминала будет о такой ситуации сообщение, примерно как "indicator is too slow"

?

 
Igor Makanu:

в логе терминала будет о такой ситуации сообщение, примерно как "indicator is too slow"

?

В логе экспертов
 
Slava:
В логе экспертов

спасибо, это хоть что то, но я понимаю, что программно нельзя определить, что индикатор рассчитывает тики которые не актуальны и индикатор подвешивает поток терминала?

 
Igor Makanu:

спасибо, это хоть что то, но я понимаю, что программно нельзя определить, что индикатор рассчитывает тики которые не актуальны и индикатор подвешивает поток терминала?

Можно попытаться определить.

Если это минутки, то можно сравнить время последнего бара с TimeCurrent(). Если не M1, то можно спросить iTime(_Symbol,PERIOD_M1,0) и сравнить с TimeCurrent().

Можно сравнить цену Bid или Last (в зависимости от инструмента) с ценой Close последнего бара. Можно сразу спросить SymbolInfoTick текущего символа. Там кроме бида и ласта ещё и время тика еть