сontinue в for - страница 4

 
EfremovSergey:

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

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

Правильно понимаю, что если в данном примере "оператор" заменить на continue, то for(1; 2; 3) будет вечным циклом?

Штатный выход из цикла и фо и вайл всегда происходит по условию выражения 2. Т.е. в фо сперва будет выражение 3 увеличения / уменьшения счетчика и только потом условия окончания цикла.  Континью в фо уйдет на выражение 3 - счетчик и потом на условие окончания, поэтому ДА, всегда после континью и штатному выходу из цикла по условию выражения 2 счетчик будет изменен.

В вайл нет счетчика, там просто условие истина продолжаем цикл, ложь выходим из цикла. Но если в условие выражения 2 поставить сравнение по счетчику итераций, и в теле цикла поставить счетчик итераций то это будет примерно тоже что и цикл фо. И Да, если выражение 2 в вайл всегда будет Истина, то будет вечный цикл.

И для выхода из цикла есть еще брейк - не штатное окончание цикла. Вот после брейк цикл сразу заканчивается и переходит к ближайшему после цикла оператору.

 

Да, Игорь, Вы правы.

Я почитал, увеличение i происходит в конце цикла (условно сказать на закрывающей скобке цикла). 

И переход continue делает в конец цикла, а не в начало.

Результат моих прежних рассуждений и новых знаний будет одинаковый, но ход мыслей был неправильный. Каюсь. Спасибо, друг.

 
Aleksei Stepanenko:

continue это просто переход. Вечный цикл будет, если условие цикла выполняется вечно.


нет не эквивалентен, в for выражение3 исполнится в любом случае, потому что continue оборвёт этот текущий проход и направит как раз к Выражению3

Вот описание из этого источника:

Респект.
 
EfremovSergey:
Респект.
О, и Вам Сергей тоже спасибо. Благодаря этой теме выведал у Игоря ценную информацию . Игорь, спасибо!
 
Aleksei Stepanenko:
О, и Вам Сергей тоже спасибо. Благодаря этой теме выведал у Игоря ценную информацию . Игорь, спасибо!

пожалуйста

но это не ценная информация а внимательность и практика, ну может быть привычка писать тестовые скрипты если есть сомнения

 
void work()
{
for(i=0; i<OrdersTotal(); i++)                                             //перебираем все ордера
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)                             // выбран
         && OrderSymbol()==Symbol()                                           // ордер по текущему инструменту
         && OrderType()<2                                                     // позиция рыночная
         && (OrderTakeProfit()==0 || OrderStopLoss()==0))                     // нет tp или sl
        
     {
   // рассчитываем уровни      
         
   double a= 1 + MathLog10(OrderLot/L) / MathLog10(Coefficient);               
         
   tpls = a * Pips;                                                    
         
   if(OrderType()==0)                                              // если покупка
     { 
      pr=NormalizeDouble(OrderOpenPrice(),Digits);
      sl=NormalizeDouble(pr-tpls*Point,Digits);
      tp=NormalizeDouble(pr+tpls*Point,Digits);
     }
   if(OrderType()==1)                                           // если продажа
     {
      pr=NormalizeDouble(OrderOpenPrice(),Digits);
      sl=NormalizeDouble(pr+tpls*Point,Digits);
      tp=NormalizeDouble(pr-tpls*Point,Digits);
     }
   bool result=OrderModify(OrderTicket(),pr,sl,tp,0);
     if(result==false && error==0){err=("ErrorOrderModify"+Symbol()+GetLastError()); error++; alarm(); i--; continue;}
      
        }
     }
}

Подскажите, такая часть кода является корректной? Это вот уже рабочий вариант. Компилируется, на графике запускается и вроде даже делает то, для чего задумывался.

 void OnTimer()
{
work(); 
alarm();
}

void alarm()
{ if(error==1)
  {
  SendNotification(err);                                 // отправляем сообщениe
  }                                                    
  
if(error>0)                                           // таймер задержки времени
   error++;
if(error>300)                                       // 30 секунд (300 циклов void OnTimer() по 100 мс)
   error=0;  
}  
 

Надо бы проверять минимально возможные расстояния от текущей цены до стопа и тейка.


i--; зачем?


continue; - зачем? Он и так стоит в конце цикла

 
Aleksei Stepanenko:

Надо бы проверять минимально возможные расстояния от текущей цены до стопа и тейка.


Переменную error вы сначала сравниваете с 0, а потом присваиваете строку. Если её тип строка тогда сравнивайте с "".


i--; зачем?


continue; - зачем? Он и так стоит в конеце цикла

continue лишнее согласен, a i-- чтобы сделать вторую попытку

 
error исправил немного, там дальше error++ и внизу void alarm() тоже на error завязано
 

Лучше убрать. Если ордер не модифицировался, нужно запомнить это и на следующем тике произвести следующую попытку. А то Вы в цикле забомбите сервер.