Бесконечное зацикливания цикла, как исправить? - страница 4

 
Artem Onopin:

Проблема осталась. Я не совсем полно написал в первом посте, как именно проявляется закисленность. Конечно я проверил с помощью printf. Получается всегда оба условия true и в массив MassLockSellTrade постоянно в бесконечном цикле добавляются по 2 тикета (по условию цикл срабатывает, когда срабатывают 2 SellStop) таким образом 2,4,6,8 и так до бесконечности.


Наверно перед всем этим делом надо размер массива уменьшать до нуля. 

 
Artem Onopin:

Проблема осталась. Я не совсем полно написал в первом посте, как именно проявляется закисленность. Конечно я проверил с помощью printf. Получается всегда оба условия true и в массив MassLockSellTrade постоянно в бесконечном цикле добавляются по 2 тикета (по условию цикл срабатывает, когда срабатывают 2 SellStop) таким образом 2,4,6,8 и так до бесконечности.

вы пробовали мой код в вашем советнике?

с уважением.
 
fxsaber:

Достаточно проанализировать результат выполнения этого скрипта


Результат (читать снизу-вверх)

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

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

цитата:

Короткая оценка логических операций

К логическим выражениям применяется схема так называемой "короткой оценки", то есть, вычисление выражения прекращается в тот момент, когда можно точно оценить результат выражения.
конец цитаты.

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

с уважением.

P.S. хотя уже сейчас есть компиляторы разных компаний, которые проверяют код на его оптимизацию на уровне машинного кода, для ускорения быстродействия.
 
Andrey Kisselyov:
по результатам ваших тестов, могу только сказать, что идет оптимизация на уровне компилятора.

Исполнения.

по условиям написания оператор IF должен проверить все условия написанные в скобках и только потом их анализировать
В этом мало целесообразности.
 
Andrey Kisselyov:
по результатам ваших тестов, могу только сказать, что идет оптимизация на уровне компилятора.
нашел этому подтверждение в приведенной вами статьи из документации.

цитата:

Короткая оценка логических операций

К логическим выражениям применяется схема так называемой "короткой оценки", то есть, вычисление выражения прекращается в тот момент, когда можно точно оценить результат выражения.
конец цитаты.

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

с уважением.

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

Ошибочно.

Условие if начинает проверять условия поочерёдно, и если первое выполнилось, то идёт дальше, если второе не выполнилось - выход и третье уже не проверяет, что экономит время и системные ресурсы.

 
Andrey Kisselyov:
вы пробовали мой код в вашем советнике?

с уважением.

С вашим кодом советник проходит весь цикл и добавляет два тикета в массив, но потом тестер останавливается и выдаёт такую ошибку 

Скриншот
Скриншот
  • prnt.sc
Снято с помощью Lightshot
 
Artem Onopin:

С вашим кодом советник проходит весь цикл и добавляет два тикета в массив, но потом тестер останавливается и выдаёт такую ошибку 


Деление на 0 в сроке 91, на символе 44. 

 
Artem Onopin:

С вашим кодом советник проходит весь цикл и добавляет два тикета в массив, но потом тестер останавливается и выдаёт такую ошибку

//внесите изменения
if(count>0)      
SredStopSellLock=NormalizeDouble(Sum/count-SLLock*Point,Digits);
да, конечно, нужно было проверить на 0 если ордера не добавлялись, то не  нужно менять стоп лосс.
по логике стоп лосс нужно считать на все ордера, а у вас он считается только на те, которые были добавлены в данной функции.

с уважением.

P.S. ошибки я вам сказал, анализируйте код, рабочий код представил. остальное дело техники.
 

Спасибо всем за помощь! Особенно Andrey Kisselyov

 
fxsaber:

Исполнения.

В этом мало целесообразности.
вы забываете следующую цепочку.

программист ---> среда разработки ---> компилятор ---> исполняемый файл ---> процессор

в данном случае среда разработки это MQL, как язык программирования, и его оболочка "Редактор кода", в котором вы пишите код, в него встроен компилятор, который создает рабочий код советника или еще чего.
1 процессор точно выполняет то, что ему предписано в исполняемом файле, тут не может быть никаких отклонений от хода программы иначе получился бы хаос и компьютер перестанет быть компьютером, а будет уже аналитической машиной, "хочу делаю так, хочу делаю по другому, не важно что хочет программист".
2 исполняемый фал создает компилятор, на основе вашего кода и согласно тем правилам которые в него заложены создателями. если в нем есть оптимизация кода, то вы это можете обнаружить, как это было проделано ранее.
3 среда разработки позволяет вам оперировать набором команд которые понятны компилятору для преобразования их в исполняемый код.тут вы можете оперировать только теми командами которые вам дает данная среда разработки.
4 на основе данных вам команд вы можете на основе вашего опыта и фантазии реализовать все, что пожелаете нужным.

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

с уважением

P.S. здесь не затрагивается вопрос о движке Терминала, на котором он работает, каким образом составляется исполняемый файл ех4/ех5 и как потом эти команды преобразуются в команды самого процессора.
Причина обращения: