Помогите разобратся с while - страница 2

 
gince:

Другими словами мне надо .................пока нртр синяя............ внутри цикла еще куча условий и циклов. Потому я и выбрал while

Помогите с этим


ну тогда внесите в цикл свои расчеты, Вы понимаете, что в теле цикла у Вас идет просто проверка флагов, а изменение этих флагов за пределами цикла?

 

int start()
  {
//----
  bool NRTRUP=true,NRTRDOWN=true;   
    while(NRTRUP)
      {

     double nrtrUp=iCustom(NULL,0,"NRTR_ATR_STOP",24,3,0,1);
     double nrtrDn=iCustom(NULL,0,"NRTR_ATR_STOP",24,3,1,1);
     
     if(nrtrUp!=EMPTY_VALUE){NRTRUP=true;NRTRDOWN=false;}    //синяя
     if(nrtrDn!=EMPTY_VALUE){NRTRDOWN=true;NRTRUP=false;}    //красная
     
     double ma   = iMA(NULL,0,13,8,MODE_SMMA,PRICE_MEDIAN,1);




        Comment(ma);
  
       if(NRTRDOWN)break;
     }
//----
   return(0);
  }
ЗЫ: выже начали тему помогите, вот давайте и разбирайтесь с mql, пока не поймете, что у Вас ошибка при построении структуры кода самостоятельно не сможете программировать
 
я это понял, но как переделать? Может так
int start()
  {
//----
  bool NRTRUP=true,NRTRDOWN=true;   
    while(NRTRUP)
      {

     double nrtrUp=iCustom(NULL,0,"NRTR_ATR_STOP",24,3,0,1);
     //
     
     if(nrtrUp!=EMPTY_VALUE){NRTRUP=true;NRTRDOWN=false;}    //синяя
     if(nrtrDn!=EMPTY_VALUE){NRTRDOWN=true;NRTRUP=false;}    //красная
     
     double ma   = iMA(NULL,0,13,8,MODE_SMMA,PRICE_MEDIAN,1);




        Comment(ma);
       double nrtrDn=iCustom(NULL,0,"NRTR_ATR_STOP",24,3,1,1);
       if(nrtrDn!=EMPTY_VALUE){NRTRDOWN=true;NRTRUP=false;}


       if(NRTRDOWN)break;
     }
//----
   return(0);
  }
 
gince:
я это понял, но как переделать? Может так  


может и так, в суть кода не вникал, но обычно программисты стараются уйти от таких конструкций:

if(NRTRDOWN)break;

обычно составляется цикл со всеми необходимыми условиями, наверно так:

bool NRTRUP=true,NRTRDOWN=false;
while(NRTRUP && !NRTRDOWN){

...
}

с помощью такого условия отпадает необходимость принудительно разрывать цикл с помощью break

 

Что-то сложное делаете?

Сразу же и не понять!

 
IgorM:


может и так, в суть кода не вникал, но обычно программисты стараются уйти от таких конструкций:

обычно составляется цикл со всеми необходимыми условиями, наверно так:

с помощью такого условия отпадает необходимость принудительно разрывать цикл с помощью break



Спосибо IgorM

Vinin, ничемо мудрого и сложниго. Просто мне покозалось, что можно уменшить количество неправильных входов. Вот это и хочу проветить. Тем самым учюсь mql

 
Помогите еще. В этом коде хотел зделатть чтобы в цикле пока синяя линия  было разрешено открыть три ордера. второй разрешается открыть только после закрытия первого, тетий после закрытия второго. Пока все закрываетжся по СтопЛосу или Тейку. Пока мне открывает и больше трех.
      k=0;                             //количество открытых ордеров перед циклом  while(NRTRUP && !NRTRDOWN)
      while(NRTRUP && !NRTRDOWN)       // цикл пока синяя линия
      {
      
         if(k<count)                  //  count=3    -количество ордеров сколько можно открыть в цикле  while(NRTRUP && !NRTRDOWN)
                                      //  когда будет три , больше открывать небудем
                                      //  цикл while(NRTRUP && !NRTRDOWN) крутиться дальше в пустую (так задумано)
         {  
  
            if(условие открытия)      //
            {
               
               res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Bid-SL*Point,Ask+TP*Point,"",MAGICMA,0,Blue); 
               
               if(OrdersTotal()>0)k++;  // если открылся , увеличиваем количество открытых ордеров в цикле
            }
         }
      }
 
gince:
Помогите еще. В этом коде хотел зделатть чтобы в цикле пока синяя линия  было разрешено открыть три ордера. второй разрешается открыть только после закрытия первого, тетий после закрытия второго. Пока все закрываетжся по СтопЛосу или Тейку. Пока мне открывает и больше трех.


немного путано просите что Вам надо, вижу пока ошибку:

 if(OrdersTotal()>0)k++; // если открылся, увеличиваем количество открытых ордеров в цикле

фактом открытия ордера является или получение его тикета:

 res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Bid-SL*Point,Ask+TP*Point,"",MAGICMA,0,Blue)

или перебором ордеров в терминале с заданными свойствами - обычно это символ инструмента, магик (у Вас MAGICMA), может быть комментарий

в Вашем случае, проще по появлению номера тикета ордера делать вывод, что ордер открылся, это примерно так:

res= -1;
res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Bid-SL*Point,Ask+TP*Point,"",MAGICMA,0,Blue)
Sleep(5000); // пауза не помешает, будет надежнее
if (res > 0) // если тикет больше нуля, значит ордер выставлен, производим необходимые действия

ЗЫ: вот тут https://www.mql5.com/ru/forum/129829 я выложил ф-цию для поиска/перебора своих ордеров, посмотрите, может сразу пригодится 

 

Спасибо за ответ, но открывается пять вместо трех на протяжении синей линии. В цикле пока синяя линия было разрешено открыть три ордера. Второй разрешается открыть только после закрытия первого, тетий после закрытия второго. Пока все закрываетжся по СтопЛосу или Тейку.

 k=0;                             //количество открытых ордеров перед циклом  while(NRTRUP && !NRTRDOWN)
      while(NRTRUP && !NRTRDOWN)       // цикл пока синяя линия
      {
      
         if(k<count)                  //  count=3    -количество ордеров сколько можно открыть в цикле  while(NRTRUP && !NRTRDOWN)
                                      //  когда будет три , больше открывать небудем
                                      //  цикл while(NRTRUP && !NRTRDOWN) крутиться дальше в пустую (так задумано)
         {  
  
            if(условие открытия)      //
            {
               res= -1;
               res=OrderSend(Symbol(),OP_BUY,LotsOptimized(),Ask,3,Bid-SL*Point,Ask+TP*Point,"",MAGICMA,0,Blue); 
               Sleep(5000);
               if (res > 0)   k++;   // если открылся , увеличиваем количество открытых ордеров в цикле
            }
         }
      }


 
gince:

Спасибо за ответ, но открывается пять вместо трех на протяжении синей линии. В цикле пока синяя линия было разрешено открыть три ордера. Второй разрешается открыть только после закрытия первого, тетий после закрытия второго. Пока все закрываетжся по СтопЛосу или Тейку.



никак не могу понять, что Вы хотите, но и теперь вижу ошибку:

if (res > 0) k++; // если открылся, увеличиваем количество открытых ордеров в цикле

если у Вас к это счетчик ордеров, тогда и нужно перед открытием ордера проверять  это к, примерно так:

if(условие открытия && k< количестов_ордеров)      //
            {
               res= -1;
               res=OrderSend(Symbo

но не забудьте к=0 сделать где-то за пределами цикла, когда нет ордеров 

ЗЫ: ну хорошо, открылись, увеличили к, а где к будет изменяться если ордер закрылся по тейку и стоплосс?

 

к=0 стоит перед циклом. По кокому условию закрылся ордер неважно. Главное что он закрылся. Значит можно открывать другой если выполняется условие входа if(условие открытия) 

Тут в цикле как бы должен бытть микро советник с условиями входа и выхода. Разница микросоветника в том, что в нем должно быть ограничение на количество открываемых ордеров. Во время работы микро советника ограничено откытие ордеров до k<count . При достижений count , микросоветник перестает открывать ордера. Остается работать условия в микро советнике условия на закрытие. 

Первый ордер открываетя if(условие открытия ...) Второй разрешается открыть только после закрытия первого, тетий после закрытия второго  и т.д.

 

Микросоветник оканчивает работу когда заканчиваетс цикл

 int start
   {
      while(NRTRUP && !NRTRDOWN)
          {

              //start mikroEA
                k=0;
                if(k<count)
                     {
                
                   ..................
                     }
                 k++;
             //end  mikroEA
         }
  } 

Это только сейчас понял. Такого я еще невидел. А может видел но непонял.

Как это сделать? 

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