![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Что-то фильтр кривовато работает:
Использование вызова функции в том месте цикла, где этот вызов считается (подразумевается) инвариантным - многие прямо в условии цикла лепят проверку с вызовом функции ( for(int i=0; i<TradesTotal(); i++) {...} ), не задумываясь о тормозах на каждой итерации
Поясните, плиз, дотошному. В качестве ликбеза.
В каких ещё местах цикла for() вызовы функций подразумеваются инвариантными? В каких ещё операторах имеет место быть инвариантность вызова функций. Ничего про это ранее в Справочнике не встречал.
"Тормоза на каждой итерации" - это время, теряющееся на вычисление функции, которую можно было посчитать всего один раз перед циклом и закешировать!
А теперь подробнее о инвариантности:
Когда используется цикл, подобный
Мы принимаем условие в цикле
i < TradesTotal()
инвариантным (неизменным).
Но разве это условие может быть инвариантным? Со всеми выходящими с этим последствиями.
Также инвариантность имеет место быть в цикле с предусловием while, например:
А вот инвариантность в операторе if (искусственно построенный цикл с постусловием):
Придумал ещё пример, когда писал пост ниже:
или же
Ещё примеры нужны? :)))
И не важно, что за функция стоит в условии... Мы полагаем условие неизменным на всех итерациях!
Вроде всё разжевал.
p.s.: заранее извиняюсь, что влез...
Присоединяюсь к вопросу. Хотелось подробнее и систематизированно узнать про оптимизацию программного кода. Хотелось бы в виде статьи или отдельного раздела в справке. Такой материал мог бы сильно помочь например в написании экспертов для чемпионата, тем паче, что востребованность есть..
Зачем же? Мы весьма разумный Вид.
Yedelkin:
В каких ещё местах цикла for() вызовы функций подразумеваются инвариантными?
Цитирую документацию:
Оператор for состоит из трех выражений и выполняемого оператора:
for(выражение1; выражение2; выражение3)
оператор;
Выражение1 описывает инициализацию цикла. Выражение2 - проверка условия завершения цикла. Если оно истинно, то выполняется оператор тела цикла for. Все повторяется, пока выражение2 не станет ложным. Если оно ложно, цикл заканчивается и управление передается следующему оператору. ВыражениеЗ вычисляется после каждой итерации.
Оператор for эквивалентен следующей последовательности операторов:
выражение1;
while(выражение2)
{
оператор;
выражение3;
};
Ответ:
Особое внимание обратите на эквивалент оператору for. Выражение1 не входит в цикл (итерации), всё остальное входит. Заметьте, туда входит и оператор! Если в операторе есть функции, которые Мы полагаем также инвариантными, то смысл их считать n-итераций раз?
Теперь надеюсь точно всё...
:DD
Прогнал, я прогнал
Посмотрите пожалуйста советник 800232. Сдаётся мне, что есть какие-то проблемы с терминалом, так как советник не выполняет заданные операции и в журнале нет никакой информации об ошибках.
Поясните, плиз, дотошному. В качестве ликбеза.
В каких ещё местах цикла for() вызовы функций подразумеваются инвариантными? В каких ещё операторах имеет место быть инвариантность вызова функций. Ничего про это ранее в Справочнике не встречал.
Это из области эффективного программирования.
Вообще, инвариант цикла программист должен определять для себя сам. Хороший оптимизатор кода сам находит инвариантные выражения и выносит их за пределы цикла с тем, чтобы вычислить их однократно. Однако никакой оптимизатор не может сказать, насколько инвариантым является вызов той или иной функции.
На самом деле вызов гипотетической функции TradesTotal может и не быть инвариантным - здесь программист решает сам. AccountInfoDouble - точно не инвариантная функция из-за асинхронности, но для упрощения расчётов (если программист - не параноик) необходимо предположить, что она инвариантна и перед первым использованием (которым обязательно должна быть проверка на 0) возвращённое значение необходимо закешировать
Здравствуйте, модератор!
Пожалуйста, проверьте текущий билд терминала МТ5 на предмет ошибок, связанных с сообщением INVALID STOPS.
Разве может такое быть, чтобы журнал ЭКСПЕРТ до отказа был забит этими сообщениями у такого участника как предыдущий победитель ЧЕМПИОНАТА - BOBSLEY?
Здравствуйте, модератор!
Пожалуйста, проверьте текущий билд терминала МТ5 на предмет ошибок, связанных с сообщением INVALID STOPS.
Разве может такое быть, чтобы журнал ЭКСПЕРТ до отказа был забит этими сообщениями у такого участника как предыдущий победитель ЧЕМПИОНАТА - BOBSLEY?
Разве может такое быть, чтобы журнал ЭКСПЕРТ до отказа был забит этими сообщениями у такого участника как предыдущий победитель ЧЕМПИОНАТА?