сontinue в for

 

Подскажите пожалуйста, внутри цикла for выражение 3 вычисляется при инициации итерации оператором continue или итерация происходит без вычисления выражения 3?

По всей видимости, если for - это разновидность while, то выражение 3 не должно вычисляться при условии continue.

Например

int i;

for(i=0; i<OrderTotal; i++)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2)

bool result=OrderDelete(OderTicket()); 

if(result==false) continue;

}

 
EfremovSergey:

Подскажите пожалуйста, внутри цикла for выражение 3 вычисляется при инициации итерации оператором continue или итерация происходит без вычисления выражения 3?

По всей видимости, если for - это разновидность while, то выражение 3 не должно вычисляться при условии continue.

Например

int i;

for(i=0; i<OrderTotal; i++)

{

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2)

bool result=OrderDelete(OderTicket()); 

if(result==false) continue;

}

Что есть "выражение 3"? 

Нужно заметить, что в коде выражение:

bool result=OrderDelete(OderTicket()); 

относится к условию:

if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2)

То есть при невыполнении вышеуказанного условия переменная result не будет даже создана. Напрашивается вывод, что такой код у Вас компилируется. А это возможно только в старом компиляторе (без директивы #property strict). Поставьте в коде такую директиву и уже на этапе компиляции увидите ошибку.

 
EfremovSergey:

По всей видимости, если for - это разновидность while, то выражение 3 не должно вычисляться при условии continue.

не разновидность, справку почитайте https://www.mql5.com/ru/docs/basis/operators/for

 
Igor Makanu:

не разновидность, справку почитайте https://www.mql5.com/ru/docs/basis/operators/for

Оператор for эквивалентен следующей последовательности операторов:

выражение1;
while(выражение2)
  {
   оператор;
   выражение3;
  };

Хорошо, не разновидность, эквивалент.

 
Ihor Herasko:

Что есть "выражение 3"? 

Нужно заметить, что в коде выражение:

относится к условию:

То есть при невыполнении вышеуказанного условия переменная result не будет даже создана. Напрашивается вывод, что такой код у Вас компилируется. А это возможно только в старом компиляторе (без директивы #property strict). Поставьте в коде такую директиву и уже на этапе компиляции увидите ошибку.

Вопрос не про result, а про continue. Что if result not true, because error 4108? i++ или i=i? ))

 

Почитал переписку и не очень понял вопроса. У Вас ошибка в коде, на которую указал Игорь, возможно в этом причина Вашего вопроса.

int i;
for(i=0; i<OrderTotal; i++)
   {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2)
      {
      bool result=OrderDelete(OderTicket());
      }
   if(result==false) continue;
   }

Ваше выражение компилятор читает так: если не будет выбран ордер или его тип окажется не BUY и не SELL if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2), то объявление переменной result пропускается, и далее происходит попытка приведения необъявленной переменной (неизвестного типа) к булево:  if(result==false). Это ошибка, исправьте и вопрос может решиться сам собой:

int i;
bool result=false;
for(i=0; i<OrderTotal; i++)
   {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2)
      {
      result=OrderDelete(OderTicket());
      }
   if(result==false) continue;
   }

Но и после исправления, выражение if(result==false) continue; в конце цикла не имеет смысла потому, что цикл и так на следующей закрывающей скобке перейдёт на for.

И ещё одна ошибка. У вас OrderTotal число, которое уже не меняется в цикле, а ордера внутри цикла Вы удаляете, то есть уменьшаете общее количество ордеров. Наступит момент, когда цикл начнёт выбирать ордера, которых нет.

int i;
for(i=0; i<OrderTotal; i++)
   {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2)
      {
      if(OrderDelete(OderTicket())
         {
         i--;
         OrderTotal--;
         }
      }
   }
 
Aleksei Stepanenko:

И ещё одна ошибка.

https://docs.mql4.com/ru/constants/tradingconstants/orderproperties

OrderType()<2 это OP_BUY и OP_SELL

их нельзя удалять через result=OrderDelete(OderTicket());

только через https://docs.mql4.com/ru/trading/orderclose

 
Igor Makanu:

Я честно говоря не задумывался, писал на пилоте :)

Вы правы, Игорь!

Тогда следующий вариант такой:

int i;
for(i=0; i<OrderTotal; i++)
   {
   if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES) && OrderType()<2)
      {
      if(OrderClose(OrderTicket(),OrderLots(),price,slippage,color))
         {
         i--;
         OrderTotal--;
         }
      }
   }
К слову, для краткости можете писать if(result) или if(!result). Сам оператор if проверяет истинность выражения в скобках и не требует сравнения с true и false, поскольку сам result либо истина, либо ложь.
 

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

for(int i=OrdersTotal()-1;i>=0;i--){
        if( OrderSelect(i,SELECT_BY_POS,MODE_TRASES) ){
                if( OrderType() > OP_SELL )continue;
                OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),(Ask-Bid)/Point*2,CLR_NONE);
        }
}

я знал что форум деградировал, но не до такой же степени...

 
Rustamzhan Salidzhanov:

но может быть обратный цикл применить, а ?

Да можно и так. Хорошо, что есть варианты, и Ваш вариант выглядит лучше.

Но, Вашим заключением, Вы как бы говорите: "Сынки, я круче вас!". Не?

 
Aleksei Stepanenko:

Да можно и так. Хорошо, что есть варианты, и Ваш вариант выглядит лучше.

Но, Вашим заключением, Вы как бы говорите: "Сынки, я круче вас!" Не?

   ворчу по стариковски )))

   но да, так и есть, если для вас важна именно эта часть моего послания...

   имею право...  "я там куда ты не смеешь даже заглянуть" (с) Дюна