Бета-версия платформы MetaTrader 5 build 1845: Функции для работы с барами в MQL5 и улучшения в тестере стратегий - страница 7

Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
P./S.: Однократное не редко применяется много-много-многократно. Помимо этого, часто ведь на графиках параллельно работают другие программы, в сочетании с которыми могут возникать дополнительные нагрузки в плане перерисовки. Как-то так
P./S.: Уточню,на всякий случай: - я не стремилась вас как-то задеть, задав свой вопрос
Два раза по тридцать оборотов у вас работают по несколько секунд или скрипт может вообще зависнуть?
Вы что-то путаете.
По всей видимости Вы даже не читали то что было написано в моем сообщении где был выложен скрипт и не пытались его запустить с теми параметрами, которые вызывают зависание. И сравнить как он работает на МТ4 и на МТ5. Вместо разговора по существу разводите ненужный флуд.
По всей видимости Вы даже не читали то что было написано в моем сообщении где был выложен скрипт и не пытались его запустить с теми параметрами, которые вызывают зависание. И сравнить как он работает на МТ4 и на МТ5. Вместо разговора по существу разводите ненужный флуд.
Читала. Но вы правы, не запускала тогда. А в МТ4 не запускала и сейчас.
По поводу флуда - попробуйте всё же перечитать полностью и вдумчиво то, что вы им назвали.
А ваш вариант кода действительно будет тормозить капитально. Это и причины этого поняла, когда более углубленно присмотрелась к вашему коду./* а потом убедилась, когда его опробовала*/
Поняла после этого, и почему вы поставили замер времени при столь малом числе оборотов.
В тормозах работы вашего кода не функция виной, о которой вы пишите.
Код, который приложу ниже - летает мгновенно, поэтому я убрала замер времени при столь малом числе оборотов.
Вариант ниже, как и сказала, сделан на основе вашего. Но он уже без тех основных ошибок, которые могли приводить к торможению.
Теперь о том, что может в вашем варианте приводить к сильнейшему торможению:
1. Ноль в for, в то время как у вас bars = 1:
2. В iHighest и iLowest у вас так:
iHighest(... bars, i)
iLowest(... bars, i)
То есть, там, где число элементов - у вас стоит 1, а в индексе (номере начального бара) - у вас i.
Кроме того, за счёт перечисленного мной в конце поста выше, у вас и выходили итоги, более напоминающие перечисление. Что привело вас к выводу, что iLowest и iHighest работают с ошибками.
После исправления того, что вам описала, картинка становится уже иной:
Вот что не помнила, так это этих строк конце вашего того поста:
Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий
Бета-версия платформы MetaTrader 5 build 1845: Функции для работы с барами в MQL5 и улучшения в тестере стратегий
Sergey Klimov, 2018.06.12 14:36
...
При bars=1, iHighest отрабатывает корректно и моментально. iLowest выполняет код более 16-ти секунд! И выдает некорректные значения. Должны выдаваться номера баров по порядку начиная с нулевого.
При bars=0 или отрицательном значении, обе функции вообще виснут. В MQL4 они в этом случае искали минимальное и максимальное значение среди всей доступной истории баров.
Дело в том, что iLowest/iHigest - возвращают индексы наименьшего/наибольшего значения (смещение относительно текущего бара) соответствующего графика. Т.е., не номера баров по порядку должны выдаваться.
Но тут, и в остальном, полагаю, вы уже, наверное, сами разобрались (самостоятельно, или на основе того, что привела выше).
Лан. Бывает. И не такое, когда заработаешься
Дело в том, что iLowest/iHigest - возвращают индексы наименьшего/наибольшего значения (смещение относительно текущего бара) соответствующего графика. Т.е., не номера баров по порядку должны выдаваться.
именно так и есть, понятнее будет сказать примерно так: iHigest вернет номер бара у которого будет максимальная цена таймсерии начиная с позиции start , количество баров на которых будет произведен поиск это count
Читала. Но вы правы, не запускала тогда. А в МТ4 не запускала и сейчас.
Вы даже не вникли в суть моего кода и что он должен делать, но доказываете мне что он не правильный. Запустите его на МТ4 и посмотрите как он моментально и правильно отработает. На то он и тестовый код чтобы выявить несоответствия между тем что должно быть при логических предположениях и тем что выводится в реале. Посмотрите логически что должно выводиться при моем коде и что выдает функция iLowest в разных терминалах. Постараюсь разжевать более подробно.
Код написан специально таким образом чтобы можно было отследить нарушение в логике расчетов.
при изменении переменной i от нуля до 30 мы должны получать на выходе номера баров попорядку от нуля до 29
Исходный результат это номер бара с наименьшей ценой. Т.к. количество баров для поиска стоит = 1, то в результате мы должны всегда получать значение равное сдвигу т.е. равное пременной i.
iHighest при количестве баров для поиска = 1 выдает правильный результат и работает моментально.
iLowest выдает не правильные результаты и вызывает тормоза, хотя функция должна отработать также быстро как и iHighes.
При установке кол-ва баров для поиска равным нулю или WHOLE_ARRAY, в МТ4 происходит поиск среди всех доступных в истории баров. И там этот скрип также отрабатывает корректно. В МТ5 же происходит зависание в работе.
iLowest и iHighest работают с ошибками. Если iHighest работает еще более-менее сносно, то iLowest работает совсем некорректно и ужасно тормозит. Код скрипта для проверки:
При bars=1, iHighest отрабатывает корректно и моментально. iLowest выполняет код более 16-ти секунд! И выдает некорректные значения. Должны выдаваться номера баров по порядку начиная с нулевого.
При bars=0 или отрицательном значении, обе функции вообще виснут. В MQL4 они в этом случае искали минимальное и максимальное значение среди всей доступной истории баров.
У меня этого подвисания не произошло, но iLowest действительно выдает ошибочные значения.
Это подвисание очень мне напоминает подвисание в такой ситуации.
Результат - такое же подвисание на 16 секунд:
Этот подвисание происходит когда действие функции происходит внутри одного бара или вне области существования баров (например интервал времени внутри выходных днях или в временом интервале будущего). И этот баг плавающий. И он по разному себя ведет в индикаторах, экспертах и скриптах, в нормальном, в профилировочном и отладочном кодах. Больше всего этот баг подвисания заметен в скриптах по моим наблюдениям.
Я уже писал много на форуме об этом подвисании, и в CД обращался, и даже в CodeBase код опубликовал с обходом этого бага. Но в ответ гробовая тишина.
И похоже, что этот малозаметный трудноуловимый баг перекочевал и в эти функции. Т.к. в Вашем коде именно тот случай когда значения считаются в одном баре. При bars=2 iLowest обрабатывает уже нормально без ошибок.
Пользуясь случаем, ещё раз прошу разработчиков обратить на это внимание. Так как это мегабаг. Человек столкнется с такой ситуацией, которую вычислить очень сложно и будет думать что MT5 очень тормознутая система, хотя, на самом деле, МТ5 - самая быстрая система в мире для алготрейдинга.
Вы даже не вникли в суть моего кода и что он должен делать, но доказываете мне что он не правильный. Запустите его на МТ4 и посмотрите как он моментально и правильно отработает. На то он и тестовый код чтобы выявить несоответствия между тем что должно быть при логических предположениях и тем что выводится в реале. Посмотрите логически что должно выводиться при моем коде и что выдает функция iLowest в разных терминалах. Постараюсь разжевать более подробно.
Код написан специально таким образом чтобы можно было отследить нарушение в логике расчетов.
при изменении переменной i от нуля до 30 мы должны получать на выходе номера баров попорядку от нуля до 29
Исходный результат это номер бара с наименьшей ценой. Т.к. количество баров для поиска стоит = 1, то в результате мы должны всегда получать значение равное сдвигу т.е. равное пременной i.
iHighest при количестве баров для поиска = 1 выдает правильный результат и работает моментально.
iLowest выдает не правильные результаты и вызывает тормоза, хотя функция должна отработать также быстро как и iHighes.
При установке кол-ва баров для поиска равным нулю, в МТ4 происходит поиск среди всех доступных в истории баров. И там этот скрип также отрабатывает корректно. В МТ5 же происходит зависание в работе.
Наше с вами недопонимание связано в основном с тем, что мы с вами несколько по разному относимся к формированию данных в MT5.
Впредь, пожалуйста, оставьте где-то на стороне диалект наподобие "разжевать".
Попробую кратко пояснить свою точку зрения.
В MetaTrader 5 несколько иные глубинные построения в целом, чем в МТ4.
Функции iHigest/iLowest, аналогичные одноимённым в МТ4, которые сейчас ввели в бета-версии МТ5 - возвращают индексы найденного наибольшего/наименьшего значения (смещение относительно текущего бара).
Поэтому я действительно не могла посчитать, что применение iHigest и iLowest для поиска в цикле for среди числа элементов, количество которых равно 1 - это так было вами и задумано:
Тем более, что по аналогии с тем, как получаются значения в МТ5 через функции CopyHigh и т.д., могу предполагать, что такой вызов, как у вас (массово, циклом, при этом на единицу значения единичный), может приводить к замедлению./*но долговременное по ожиданию зависание в вашем варианте кода вызывало не это */
Соответственно, пока вы не пояснили задумку, я действительно полагала, что у вас это в коде случайные ошибки (установка переменных не на свои места). Поэтому ранее перевела в более для себя логичное и посчитала ваш bars = 1, как смотреть с первого бара, а i - как число элементов, среди которых смотреть:
Однако после того, как вы пояснили вашу логику, поняла, что мы с вами говорили о разном/смотрели по разному.
iLowest - да, и в вашем, и в моём коде работает не корректно. При этом, как раз в моём варианте iLowest возвращает номера по порядку.
Если в ваш вариант кода (к МТ5) в iLowest не ставить i = 0, то зависаний не возникает, похоже.
Да, есть проблемы с этой функцией.
при таком сочетании получается у меня конкретное зависание работы скрипта, с вариантом кода Sergey Klimov:
P./S.: Это если переводить в цифры bars(равный 1) и i(равный 0)