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

 
Привет!
 

#property tester_everytick_calculate может решит проблемы?

24. MQL5: Добавлено новое свойство для пользовательских индикаторов #property tester_everytick_calculate. Оно используется в тестере стратегий и позволяет принудительно влючить расчет индикаторов на каждом тике.

25.Tester: Теперь при невизуальном тестировании/оптимизации все используемые индикаторы (стандартные и пользовательские) рассчитываются только по запросу данных. Исключение составляют индикаторы, содержащие вызовы функции EventChartCustom и использующие обработчик OnTimer. Ранее в тестере стратегий при приходе любого тика (даже от чужого инструмента) все индикаторы рассчитывались безусловно. Нововведение позволило существенно ускорить тестирование и оптимизацию.

Чтобы принудительно включить расчет индикаторов на каждом тике, добавьте для программы свойство #property tester_everytick_calculate.

Индикаторы, скомпилированные предыдущими версиями компилятора, будут рассчитываться как раньше — на каждом тике.
 

Также всегда рекомендовалось, если работаете с чужим таймфреймом - то раз в минуту необходимо получать OHLC с этого таймфрейма (любая CopyXXXX функция).

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

 
Vladimir Karputov:

Также всегда рекомендовалось, если работаете с чужим таймфреймом - то раз в минуту необходимо получать OHLC с этого таймфрейма (любая CopyXXXX функция).

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

Не серьёзно!

Зачем тогда: iHigh(Symbol(),TF,i);

P.S. В мт4 всё работает без проблем с первых дней его основания, почему не сделать также в мт5, чтобы не было танцев с бубном? Если работает в мт4 - значит возможно также наладить работу и в мт5
 
Vitaly Muzichenko:

Не серьёзно!

Зачем тогда: iHigh(Symbol(),TF,i);

P.S. В мт4 всё работает без проблем с первых дней его основания, почему не сделать также в мт5, чтобы не было танцев с бубном? Если работает в мт4 - значит возможно также наладить работу и в мт5

Также всегда рекомендовалось, если работаете с чужим таймфреймом - то раз в минуту необходимо получать OHLC с этого таймфрейма (любая CopyXXXX функция). Это было всегда.

 
double high_k = NormalizeDouble(iHigh(Symbol(),TimeFrames, k),DigitsM);
double low_k = NormalizeDouble(iLow(Symbol(),TimeFrames, k),DigitsM);
double open_k = NormalizeDouble(iOpen(Symbol(),TimeFrames, k),DigitsM);
double close_k = NormalizeDouble(iClose(Symbol(),TimeFrames, k),DigitsM);

Попробуйте перед этим обновлять котировки через RefreshRates.

 
Dmitry Fedorchenko:

Попробуйте перед этим обновлять котировки через RefreshRates.

"RefreshRates" - несуществующая функция.

 
Vladimir Karputov:

"RefreshRates" - несуществующая функция.

Я про
https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/csymbolinfo/csymbolinforefreshrates

Была подобная проблема только в советнике, мне помогло.

 
Farkhat Guzairov:
Версия этого индикатора на MQL4 работает уже более 2-х лет и такого рода проблем/ошибок не было выявлено ни разу.

Ни какие CopyXXX вам не помогут. Это баг МТ5  который начался с 30-го билда и по 44 включительно не исправлен. Почитайте последние 5-6 страниц https://www.mql5.com/ru/forum/285631/page29 и увидите ,что вы не одиноки.

Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5
Новая версия платформы MetaTrader 5 build 1930: Плавающие окна графиков и .Net библиотеки в MQL5
  • 2018.11.13
  • www.mql5.com
26 октября 2018 года будет выпущена обновленная версия платформы MetaTrader 5...
 
Farkhat Guzairov:

Доброго времени суток!

В данный момент переношу ранее написанные индикаторы с MQL4 в MQL5. Не большие танцы с бубнами и вроде как все нормально, но....

В какой то момент, данные индикатора перестают обновляться, долго не мог понять где именно ошибка, чисто случайно обратил внимание, что значения iClose/iOpen и т.д. в какой то момент перестают обновляться, т.е. возращают одно и тоже значение.

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

Только если открыть свойства индикатора и закрыть через "Ок", данные обновляются и корректно отражаются, но до какого то момента, который может возникнуть в любое время(но 100% это происходит). В данном случае индикатор перестал обновлять данные в 2018.11.14 00:00, в общем это происходить через какое-то время регулярно.

Ранее выявился другой баг, функция iBars(Symbol(),TimeFrames)/Bars(Symbol(),TimeFrames) возвращает нулевое значение. Благо этот баг не носит характер постоянной ошибки, но так же возникает и приходиться ее контролировать.

Тут выясняется, что MQ прекращают поддержку MQL4, это замечательно, но с такими багами что наблюдаются в MQL5, все будет очень печально.

И так, как решается выше описанная проблема?

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

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


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

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


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

 
Renat Fatkhullin:

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

Тогда подскажите, почему происходит заморозка у меня ? У меня отдача данных в OnTick замерзает до функции опроса индикаторовю Тоесть обновление CopyTime по M1 выступает в качестве тригера запускающего остальную обработку в OnTick, а до CopyTime ни каких функций или опросов индикатора.

И почему до 30-го билда таких проблем не было и с октября 2017 года всё работало отлично ?