Вопросы оператора цикла "для

 

Здравствуйте сообщество MQL4,


Первая ссылка: https://book.mql4.com/operators/for

По первой ссылке пример формата оператора 'for':

  for (Expression_1; Condition; Expression_2)         // Cycle operator header
      One operator, cycle body                     // Cycle body is one operator


Вторая ссылка: https://docs.mql4.com/basis/operators/for

Согласно второй ссылке, пример формата оператора 'for' описан так:

for (Expression1; Expression2; Expression3)
   operator;


Почему первый пример содержит "условие" в качестве второго параметра, а второй пример содержит "Выражение2" в качестве второго параметра?

В чем смысл этого противоречия?

Имеет ли оно вообще значение?

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

Спасибо.

 

Возможно, вы сможете лучше понять цикл 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 и т.д.).

Спасибо

 
WhooDoo22:

Саймон,

выражение может быть условием

Итак, параметр два в заголовке оператора 'for' может быть выражением ИЛИ условием? Я предполагаю, что выражения Expression_1 и Expression_3 должны оставаться выражениями и не меняться на условия, верно? Я не понимаю, почему выражения 1 и 3 не могут также быть условиями. Оба выражения 1 и 3 являются просто параметрами для заполнения. (быть условием МОЖЕТ альтернативно быть параметром два, а также целью Выражения_2)

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

Документация - while

Книга - while
 
WhooDoo22: Итак, параметр два в заголовке оператора 'for' может быть выражением ИЛИ условием?
Любое выражение приводит к числу. Число, преобразованное в булево число, является условием. То же самое. Вы говорите tuh-mey-toh, а я говорю tuh-mah-toh.
 

Саймон, я буду практиковать использование операции while в коде. сделайте себе одолжение... Мне нравится, как это звучит! :) Спасибо.

Уильям, Число, преобразованное в булеву формулу, является условием ... (1=истина, 0=ложь). Большое спасибо.

Спасибо.

 

Саймон,

Я написал советника, который должен ;) быть в состоянии сделать то, что вы просили.

Я делюсь комбинацией этого советника в сочетании со снимком результата из вкладки "Эксперты" в терминале.


Похоже, что советник может выбрать ордер USDJPY и распечатать информацию о нем на вкладке "Эксперты". Почему советник не закрывает ордер, а также не печатает информацию о нем?

Спасибо.

Файлы:
 
WhooDoo22:

Саймон,

Я написал советника, который должен ;) быть в состоянии сделать то, что вы просили.

Я делюсь комбинацией этого советника в сочетании со снимком результата из вкладки "Эксперты" в терминале.


Похоже, что советник может выбрать ордер USDJPY и распечатать информацию о нем на вкладке "Эксперты". Почему советник не закрывает ордер, а также не печатает информацию о нем?

Спасибо.

Вы сказали, что понимаете скобки?https://www.mql5.com/en/forum/142732


Пожалуйста, объясните ваш код и что он должен делать... в частности, расскажите мне об этом, пожалуйста.
 

Саймон,

Пожалуйста, объясните ваш код и то, что он должен делать... в частности, расскажите мне об этом, пожалуйста.

Я сделаю все возможное, чтобы объяснить код и его назначение.


Назначение кода:

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);

Спасибо.

 
WhooDoo22:

Саймон,


Логика цикла 'while':

Функция OrderSelect() использует переменную 'i' как заменитель числа 1,2,3 и т.д.. (имейте это в виду, пожалуйста).

Итак, если переменная i в функции OrderSelect() и OrderSymbol() НЕ USDJPY, увеличьте переменную i на 1. ( i++; )

Цикл 'while' увеличивает переменную 'i' до тех пор, пока функция OrderSelect() не выберет нужный билет ордера И функция OrderSymbol() не выберет ордер USDJPY. Когда обе цели достигнуты, цикл while становится ложным и управление передается ниже i++; (тело цикла while).

Извините, я неправильно понял ваш код. ... спасибо за объяснение, теперь я понимаю, что вы делаете. Проблема у вас очень простая ... просто посмотрите на сообщение об ошибке в приведенном вами снимке экрана ... посмотрите на то, что выдает OrderPrint(), включая номер ордера, затем посмотрите на ошибку.

Если бы вы включили проверку возвращаемых значений и сообщение об ошибке, вы бы, вероятно, сами увидели свою проблему.
 

Саймон,

Я не понимаю, что именно вы видите, но ;) Я немедленно включу функцию GetLastOrder(), чтобы пролить свет на этот вопрос. Прошу прощения за то, что задал вопрос, не включив в код функцию GetLastOrder().

Спасибо.

Причина обращения: