Бесконечное зацикливания цикла, как исправить?

 

Всем привет! Проблема в том, что цикл бесконечно зацикливается, в чем причина не могу понять. Суть этого цикла, проверить сделки селл рыночные, в каких массивах содержаться, если все условия true то занести массив MassLockSellTrade[]. Условия проверки: Если сделка есть в массиве MassSellLock[], то это значит, что сделка являлась SellStop, который стал рыночным в этом случае переменная InArraySell=true; Далее следующая проверка, если Size==0 (int Size = ArraySize(MassLockSellTrade); это массив сработавших SellStop), значит что в массиве MassLockSellTrade[] ещё нет сделок и переменная InArraySell2=true; и этот тикет этого ордера заноситься в массив MassLockSellTrade[]. Если Size!=0 то тикет ордера проверяется на наличие в массиве MassLockSellTrade[k]!=OrderTicket() если его там нет, то переменная InArraySell2=true; и тикет ордера заноситься в массив MassLockSellTrade[]. 

Кусок кода работает и заносит сделки в массив MassLockSellTrade[], но происходит это бесконечно, голову уже сломал, что делать не знаю, подскажите или направьте советом))

if (CountMassSell()>=2) // Если >= 2х SellStop сработало и они стали рыночными сделками
   { 
   if (FindMassSell()==true) //Если появился рыночный селл ордер, который не входит в массив MassLockSellTrade[] 
      {  
         Sum = 0; int count=0;
         bool InArraySell;
         bool InArraySell2;
         for (int i=0; i<OrdersTotal(); i++)
            { InArraySell=false;
              InArraySell2=false;
               if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
               if(OrderType()==OP_SELL)
                  {  
                     int SizeLock = ArraySize(MassSellLock);
                     int Size = ArraySize(MassLockSellTrade);
                     for(int m=0; m<SizeLock; m++)
                        {  
                           if(MassSellLock[m]==OrderTicket())//
                              {
                                 InArraySell=true;
                                 break;       
                              }
                        }
                      
                      if (Size==0)
                        { 
                           InArraySell2=true;
                        }else
                           {
                              for(int k=0; k<Size; k++)
                                 {  
                                    if(MassLockSellTrade[k]!=OrderTicket())
                                       {
                                          InArraySell2=true;
                                          break;       
                                       }
                                 }
                            }     
                   if(InArraySell==true && InArraySell2==true )
                     { 
                        Sum+=OrderOpenPrice(); 
                        count++;
                        SredStopSellLock=NormalizeDouble(Sum/count-SLLock*Point, Digits);  // вычисляем среднюю цену ордеров
                        int new_size = ArraySize(MassLockSellTrade)+1; // Заносим ордер в массив
                                 ArrayResize(MassLockSellTrade,new_size);
                                 ArrayFill(MassLockSellTrade,new_size-1,1,OrderTicket());         
                     }
               
                  }
             }    
       }
      
   }
 

Здесь три цикла, выясните какой конкретно зацикливается.

 
Dmitry Fedoseev:

Здесь три цикла, выясните какой конкретно зацикливается.


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

 
Artem Onopin:   А как это сделать?

Внутрь самого внутреннего цикла вставьте Alert("Внутренний цикл"); Если на экран полезут сообщения, значит - он. Затем ...

 
Еще можно отладчик, встроенный в редактор кодов MetaEditor, использовать. Там можно многое
 
Artem Onopin:

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


Alert(), Print(), Comment(), можно в свой файл писать.

Так ничего не видно, где бы могло быть зацикливание.

 
Artem Onopin:

Кусок кода работает и заносит сделки в массив MassLockSellTrade[], но происходит это бесконечно, голову уже сломал, что делать не знаю, подскажите или направьте советом))

добрый день.

ArrayFill(MassLockSellTrade,new_size-1,1,OrderTicket());
//можно написать так, 
//зачем мудрить с автозаполнением массива, если есть решение проще и в плане экономии времени исполнения и написания??? 
MassLockSellTrade[new_size-1]=OrderTicket();
чтоб найти ошибку нужно посмотреть при каких условиях ордер будет занесен в массив, первое наличие его в первом массиве, второе это отсутствие его во втором массиве.
так как вы не удаляете его из первого массива у вас первое условие всегда будет TRUE, если ордер там был(я бы удалял после занесения в другой массив).
второе условие интереснее, так как у вас не верно организована проверка наличия ордера
   for(int k=0; k<Size; k++)
     {
      if(MassLockSellTrade[k]!=OrderTicket())
        {
         InArraySell2=true;
         break;
        }
     }
//данный цикл всегда будет выдавать TRUE при условии что ордер который ищем не первый
//правильнее организовать цикл так
   InArraySell2=true;
   for(int k=0; k<Size && InArraySell2; k++)
     {
      if(MassLockSellTrade[k]==OrderTicket())InArraySell2=false;//если ордер есть не вносить его в массив
     }


с уважением.

P.S. старайтесь писать проще и у вас не будет лишних проблем, пользуйтесь стилизатором (Ctrl+<).
        для того чтоб найти эту ошибку не нужно заморачиватся на все премудрости что вы тут писали.

Стилизатор - Работа с исходным кодом - Разработка программ - Справка по MetaEditor
Стилизатор - Работа с исходным кодом - Разработка программ - Справка по MetaEditor
  • www.metatrader5.com
Данная функция предназначена для оформления исходного кода в соответствии с рекомендуемым стандартом. Это позволяет сделать код более читаемым...
 
//на мой взгляд данный код может выглядеть так, как приведено ниже, оптимальный вариант во всех отношениях
if(CountMassSell()>=2)
  {
   if(FindMassSell())
     {
      Sum=0; int count=0;         
      int SizeLock=ArraySize(MassSellLock);
      for(int i=0; i<OrdersTotal() && !_StopFlag; i++)
        {
         if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue;
         if(OrderSymbol()!=Symbol())continue;
         if(OrderMagicNumber()!=Magic)continue;
         if(OrderType()!=OP_SELL)continue;

         bool InArraySell=false;
         for(int m=0; m<SizeLock && !_StopFlag && !InArraySell; m++)
            if(MassSellLock[m]==OrderTicket())InArraySell=true;
         if(!InArraySell)continue;  
       
         int Size=ArraySize(MassLockSellTrade);
         for(int k=0; k<Size && !_StopFlag && InArraySell; k++)
            if(MassLockSellTrade[k]==OrderTicket())InArraySell=false;
         if(!InArraySell)continue;
         
         Sum+=OrderOpenPrice();
         count++;
         int new_size=ArraySize(MassLockSellTrade);
         ArrayResize(MassLockSellTrade,new_size+1);
         MassLockSellTrade[new_size]=OrderTicket();
        }        
      SredStopSellLock=NormalizeDouble(Sum/count-SLLock*Point,Digits);
     }
  }

с уважением.
 
Artem Onopin:

Всем привет! Проблема в том, что цикл бесконечно зацикливается, в чем причина не могу понять. Суть этого цикла, проверить сделки селл рыночные, в каких массивах содержаться, если все условия true то занести массив MassLockSellTrade[]. Условия проверки: Если сделка есть в массиве MassSellLock[], то это значит, что сделка являлась SellStop, который стал рыночным в этом случае переменная InArraySell=true; Далее следующая проверка, если Size==0 (int Size = ArraySize(MassLockSellTrade); это массив сработавших SellStop), значит что в массиве MassLockSellTrade[] ещё нет сделок и переменная InArraySell2=true; и этот тикет этого ордера заноситься в массив MassLockSellTrade[]. Если Size!=0 то тикет ордера проверяется на наличие в массиве MassLockSellTrade[k]!=OrderTicket() если его там нет, то переменная InArraySell2=true; и тикет ордера заноситься в массив MassLockSellTrade[]. 

Кусок кода работает и заносит сделки в массив MassLockSellTrade[], но происходит это бесконечно, голову уже сломал, что делать не знаю, подскажите или направьте советом))


if (CountMassSell()>=2) // Если >= 2х SellStop сработало и они стали рыночными сделками
   { 
   if (FindMassSell()==true) //Если появился рыночный селл ордер, который не входит в массив MassLockSellTrade[] 
      {  

Где-то есть присваивание этой переменной значения false?

 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Бесконечное зацикливания цикла, как исправить?

Andrey Kisselyov, 2017.07.22 22:47

      for(int i=0; i<OrdersTotal() && !_StopFlag; i++)
        {
         if(!OrderSelect(i,SELECT_BY_POS,MODE_TRADES))continue;
         if(OrderSymbol()!=Symbol())continue;
         if(OrderMagicNumber()!=Magic)continue;
         if(OrderType()!=OP_SELL)continue;
Для меня загадка, почему многие так пишут.
 
Andrey Kisselyov:

///

Обратите внимание, там ест пара таких строчек:

InArraySell=false;
InArraySell2=false;

В самом начале цикла.

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