Возможно, вы сможете лучше понять цикл for, сначала разобравшись с циклом while... цикл for - это просто цикл while с начальным условием и инкрементом, встроенным в него...
Посмотрите документацию поfor, там сказано...
"Операторfor эквивалентен следующей последовательности операторов:".
Expression1;
while(Expression2)
{
operator;
Expression3;
};
Если говорить конкретно о вашем вопросе:"Почему первый примерсодержит "условие" в качестве второго параметра, а второй пример содержит "Выражение2" вкачестве второго параметра?" выражение может быть условием, условие приводит к истинному или ложному значению, например (a > b) или (c || d) или (OrdersTotal() >= 0), также в документации сказано. ..."Выражение2- это условный тест на завершение цикла."
Саймон,
выражение может быть условием
Итак, параметр два в заголовке оператора 'for' может быть выражением ИЛИ условием? Я предполагаю, что выражения Expression_1 и Expression_3 должны оставаться выражениями и не превращаться в условия, верно? Я не понимаю, почему выражения 1 и 3 не могут также быть условиями. Оба выражения 1 и 3 являются просто параметрами для заполнения. (быть условием МОЖЕТ альтернативно быть параметром два, а также целью Выражения_2).
Пожалуйста, подтвердите свои мысли.
Выражения могут быть арифметическими операциями (2+2=4), присваиванием и т.д. (все они перечислены в словаре MetaEditor Dictionary).
Условие - true || false (примеры: a>b, a>=b, a==b и т.д.).
Операции также содержатся в словаре MetaEditor (примеры: Break, Continue, Return, while, for и т.д.).
Спасибо
Саймон,
выражение может быть условием
Итак, параметр два в заголовке оператора 'for' может быть выражением ИЛИ условием? Я предполагаю, что выражения Expression_1 и Expression_3 должны оставаться выражениями и не меняться на условия, верно? Я не понимаю, почему выражения 1 и 3 не могут также быть условиями. Оба выражения 1 и 3 являются просто параметрами для заполнения. (быть условием МОЖЕТ альтернативно быть параметром два, а также целью Выражения_2)
Документация - while
Книга - while
Саймон, я буду практиковать использование операции while в коде. сделайте себе одолжение... Мне нравится, как это звучит! :) Спасибо.
Уильям, Число, преобразованное в булеву формулу, является условием ... (1=истина, 0=ложь). Большое спасибо.
Спасибо.
Саймон,
Я написал советника, который должен ;) быть в состоянии сделать то, что вы просили.
Я делюсь комбинацией этого советника в сочетании со снимком результата из вкладки "Эксперты" в терминале.
Похоже, что советник может выбрать ордер USDJPY и распечатать информацию о нем на вкладке "Эксперты". Почему советник не закрывает ордер, а также не печатает информацию о нем?
Спасибо.
Саймон,
Я написал советника, который должен ;) быть в состоянии сделать то, что вы просили.
Я делюсь комбинацией этого советника в сочетании со снимком результата из вкладки "Эксперты" в терминале.
Похоже, что советник может выбрать ордер USDJPY и распечатать информацию о нем на вкладке "Эксперты". Почему советник не закрывает ордер, а также не печатает информацию о нем?
Спасибо.
Пожалуйста, объясните ваш код и что он должен делать... в частности, расскажите мне об этом, пожалуйста.
Саймон,
Пожалуйста, объясните ваш код и то, что он должен делать... в частности, расскажите мне об этом, пожалуйста.
Я сделаю все возможное, чтобы объяснить код и его назначение.
Назначение кода:
1. Выберите ордер USDJPY из трех ордеров.
2. Измените TP и SL ордера USDJPY.
3. Выполните функцию OrderPrint().
4. Закройте ордер USDJPY.
Объяснение кода:
Во-первых, объявляются переменные.
int i; double bid_ask;
Во-вторых, выполняется цикл 'while'.
Логика цикла 'while':
Функция OrderSelect() использует переменную 'i' в качестве замены числа 1,2,3 и т.д.. (просто запомните это, пожалуйста).
Итак, если переменная i в функции OrderSelect() и OrderSymbol() НЕ USDJPY, увеличиваем переменную i на 1. ( i++; )
while(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true && OrderSymbol()!="USDJPY")
i++;
Цикл 'while' увеличивает переменную 'i' до тех пор, пока функция OrderSelect() не выберет нужный билет ордера И функция OrderSymbol() не выберет ордер USDJPY. Когда обе цели достигнуты, цикл while становится ложным и управление передается ниже i++; (тело цикла while).
В-третьих, выполняется функция OrderModify().
OrderModify(i,OrderOpenPrice(),50*Point,50*Point,0,CLR_NONE);
В-четвертых, выполняется функция OrderPrint().
OrderPrint();
В-пятых, включаются параметры, позволяющие определить, является ли закрываемый ордер ордером на покупку или продажу.
if(OrderType()==OP_BUY){bid_ask=Bid;} if(OrderType()==OP_SELL){bid_ask=Ask;}
В-шестых, как только программа определит, является ли ордер покупкой или продажей, она выполняет функцию OrderClose().
OrderClose(i,OrderLots(),bid_ask,3,CLR_NONE);
В-седьмых (и последнее), программа включает комментарий, который покажет переменную 'i', чтобы подтвердить, что номер билета действительно является билетом на USDJPY во время визуального тестирования в тестере стратегий.
Comment("i = " ,i);
Спасибо.
Саймон,
Логика цикла 'while':
Функция OrderSelect() использует переменную 'i' как заменитель числа 1,2,3 и т.д.. (имейте это в виду, пожалуйста).
Итак, если переменная i в функции OrderSelect() и OrderSymbol() НЕ USDJPY, увеличьте переменную i на 1. ( i++; )
Цикл 'while' увеличивает переменную 'i' до тех пор, пока функция OrderSelect() не выберет нужный билет ордера И функция OrderSymbol() не выберет ордер USDJPY. Когда обе цели достигнуты, цикл while становится ложным и управление передается ниже i++; (тело цикла while).
Если бы вы включили проверку возвращаемых значений и сообщение об ошибке, вы бы, вероятно, сами увидели свою проблему.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте сообщество MQL4,
Первая ссылка: https://book.mql4.com/operators/for
По первой ссылке пример формата оператора 'for':
Вторая ссылка: https://docs.mql4.com/basis/operators/for
Согласно второй ссылке, пример формата оператора 'for' описан так:
Почему первый пример содержит "условие" в качестве второго параметра, а второй пример содержит "Выражение2" в качестве второго параметра?
В чем смысл этого противоречия?
Имеет ли оно вообще значение?
Если я собираюсь использовать оператор цикла 'for', я считаю, что должен хорошо понимать все его параметры.
Спасибо.