![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
когда это происходит во время запуска и
когда это происходит во время остановки?
StringHighStatus="True";
Я тоже так думал, пока не протестировал, удивительно, но часть if(double == double) действительно работает, это заставляет меня задуматься, не обрабатывается ли сравнение двоек по-другому в новых билдах.
EURUSD,M15: Условия фракталов выполнены на баре 98
EURUSD,M15: Условия фракталов выполнены на баре 95
EURUSD,M15: Условия фракталов выполнены на баре 91
EURUSD,M15: Условия фракталов выполнены на баре 81
EURUSD,M15: Условия фракталов выполнены на баре 77
EURUSD,M15: Условия фракталов выполнены на баре 68
EURUSD,M15: Условия фракталов выполнены на баре 61
EURUSD,M15: Условия фракталов выполнены на баре 48
EURUSD,M15: Условия фракталов выполнены на баре 39
EURUSD,M15: Условия фракталов выполнены на баре 24
EURUSD,M15: Условия фракталов выполнены на баре 19
EURUSD,M15: Условия фракталов выполнены на баре 12
EURUSD,M15: Условия фракталов выполнены на баре 4
Спасибо GumRai за ваше терпение.
Возможно, я ошибаюсь и не могу понять логику...
Если первый IF превращает, как вы предлагаете, строку в "true" при, скажем, SwinghHighShift=10, то счетчик не увеличивается в этом цикле; после этого управление возвращается в WHILE: цикл должен закончиться в этой точке, потому что WHILE содержит логическое ИЛИ и одно из его условий выполнено.
И наоборот, если переменная остается ложной, счетчик должен достичь своего максимального значения, и снова у вас есть условие выхода.
Я думаю, что ваше соображение было бы верным при использовании оператора AND.
Следуя вашей интерпретации, я могу пропустить OR внутри WHILE; я могу просто поставить первое условие IF на строке: если переменная станет "истинной", то прерывание завершит WHILE, в противном случае счетчик будет идти дальше до своего максимума.
Код будет выглядеть так:
Но это все еще обходной путь и, к сожалению, он не объясняет (для меня), почему WHILE не справляется с OR.
Нет ничего плохого в WHILE или логическом ИЛИ, у вас есть два условия в вашем WHILE, и ОБА они должны быть нарушены, прежде чем WHILE сможет выйти.
Вот почему он застревает
Существует лишь небольшой шанс, что цикл while когда-либо выйдет из цикла, и это произойдет, когда условие IF не будет выполнено для всех 100 баров (SwingBarCount), так что второе условие WHILE будет нарушено раньше первого. Затем фракталы удовлетворяют условию IF и выполняется код, нарушающий условие первого WHILE (модификация StringHighStatus).
Вам нужно либо убрать SwingHighShift++; из ELSE и поместить его самостоятельно в цикл while после оператора IF, чтобы независимо от того, что происходит с условиями IF, он все равно увеличивался, и цикл мог перейти к следующему бару, либо использовать break после блока кода рисования объекта, чтобы выйти из цикла while, когда объект нарисован.
Вам также нужно дать объекту возможность создавать различные имена для себя, иначе он будет отрисован только один раз. (если вы не хотите, чтобы он был нарисован только один раз).
Я тоже так думал, пока не протестировал, удивительно, но if(double == double) часть этого работает, это заставляет меня задуматься, не обрабатывается ли сравнение двойников по-другому в новых билдах.
EURUSD,M15: Fractals conditions met on bar 98
EURUSD,M15: Fractals conditions met on bar 95
EURUSD,M15: Fractals conditions met on bar 91
EURUSD,M15: Fractals conditions met on bar 81
EURUSD,M15: Fractals conditions met on bar 77
EURUSD,M15: Fractals conditions met on bar 68
EURUSD,M15: Fractals conditions met on bar 61
EURUSD,M15: Fractals conditions met on bar 48
EURUSD,M15: Fractals conditions met on bar 39
EURUSD,M15: Fractals conditions met on bar 24
EURUSD,M15: Fractals conditions met on bar 19
EURUSD,M15: Fractals conditions met on bar 12
EURUSD,M15: Fractals conditions met on bar 4
Причина, по которой это работает, заключается в том, что код эффективно сравнивает одно и то же значение
Фрактальный буфер будет либо иметь пустое значение, либо его значение будет взято из максимума соответствующего бара.
Код эффективно
Я не вижу причин, по которым его нельзя заменить на
Я не вижу причин, по которым его нельзя заменить на
Я перечитал ваши сообщения в этой теме и понял, где теперь возникает ваша путаница. Вы думаете о логике WHILE и OR в обратном порядке. OR - это не остановка WHILE. Это о том, чтобы продолжать его, когда одно из условий действительно... Это похоже на следующее: у вас есть два включенных светильника. Ваша инструкция гласит: "Пока горит свет 1 ИЛИ свет 2, продолжайте делать что-то". Очевидно, что перед завершением работы должны погаснуть обе лампочки, а не только одна из них.
Вот и все!
Как мне не стыдно... :-)
Более того, я не в первый раз использую WHILE, но я начал думать в обратном направлении и так и не вышел из СВОЕГО цикла :-/
Так что предложение deVries о замене || на && оказывается верным.
Из этой темы вытекает много других вещей, на которые следует обратить внимание, например, как работает IF( == ).
Спасибо всем за ваше терпение и время, которое вы потратили на то, чтобы я понял.
Я бы хотел сделать это таким образом, с помощью break, чтобы прервать цикл while, правильно ли это?