нужна помощь спецов

 

Здравствуйте помогите сделать функцию для советника которая закрывала бы все ордера с определенным магиком и в случае ошибки повторяла ордер на закрытие.Спасибо!

Сколько не пытался почему то советник виснет после нескольких попыток неудачного закрытия ордера

 
extern int MinTP = 50;                   // минимальный виртуальный тейк профит 
extern int MinSL = 50;                   // минимальный виртуальный стоп лосс
extern string Magic="Магическое число";
extern int mn=7777;                      // "магический номер" для отличия своих ордеров от чужих
extern string Server="Параметры сервера";
extern int Slippage=10;                  // допустимое проскальзование цены
//+------------------------------------------------------------------+
//|                 Закрыть прибыльные ордера                        |
//+------------------------------------------------------------------+
// ====================== Закрыть BUY в профите ===============================
double ClossAllProfitBuy ()

{
   int Profit1=MinTP;
   int col1=Gold;
   int ask1, bid1, open1;
   double point1;
   for (int i1=OrdersTotal()-1; i1>=0; i1--)
   {
      if (!OrderSelect(i1,SELECT_BY_POS,MODE_TRADES)) break;
      if ((OrderType()==OP_BUY) && (OrderMagicNumber()==mn))
      {
         point1=MarketInfo(Symbol(),MODE_POINT);
         if (point1==0) break;
         bid1=MathRound(MarketInfo(OrderSymbol(),MODE_BID)/point1);
         open1=MathRound(OrderOpenPrice()/point1);
         if (bid1-open1<Profit1) continue;
         OrderClose(OrderTicket(),OrderLots(),bid1*point1,Slippage,col1);
      }
   }
}
// End

// ====================== Закрыть SELL в профите ===============================
double ClossAllProfitSell ()

{
   int Profit2=MinTP;
   int col2=Gold;
   int ask2, bid2, open2;
   double point2;
   for (int i2=OrdersTotal()-1; i2>=0; i2--)
   {
      if (!OrderSelect(i2,SELECT_BY_POS,MODE_TRADES)) break;
      if ((OrderType()==OP_SELL) && (OrderMagicNumber()==mn))
      {
         point2=MarketInfo(Symbol(),MODE_POINT);
         if (point2==0) break;
         ask2=MathRound(MarketInfo(OrderSymbol(),MODE_ASK)/point2);
         open2=MathRound(OrderOpenPrice()/point2);
         if (open2-ask2<Profit2) continue;
         OrderClose (OrderTicket(),OrderLots(),ask2*point2,Slippage,col2) ;
      }
   }
}
// End


//+------------------------------------------------------------------+
//|                 Закрыть убыточные ордера                         |
//+------------------------------------------------------------------+

// ====================== Закрыть BUY в убытке ===============================

double ClossAllLossBuy()
{
   int Stop4=MinSL;
   int ask4, bid4, open4;
   double point4;
   for (int i4=OrdersTotal()-1; i4>=0; i4--)
   {
      if (!OrderSelect(i4,SELECT_BY_POS,MODE_TRADES)) break;
      if ((OrderType()==OP_BUY) && (OrderMagicNumber()==mn))
      {
         point4=MarketInfo(Symbol(),MODE_POINT);
         if (point4==0) break;
         bid4=MathRound(MarketInfo(Symbol(),MODE_BID)/point4);
         open4=MathRound(OrderOpenPrice()/point4);
         if (open4-bid4<Stop4) continue;
         OrderClose(OrderTicket(),OrderLots(),bid4*point4,Slippage,Red);
      }
   }
}
// End

// ====================== Закрыть SELL в убытке ===============================

double ClossAllLossSell()
{
   int Stop5=MinSL;
   int ask5, bid5, open5;
   double point5;
   for (int i5=OrdersTotal()-1; i5>=0; i5--)
   {
      if (!OrderSelect(i5,SELECT_BY_POS,MODE_TRADES)) break;
      if ((OrderType()==OP_SELL) && (OrderMagicNumber()==mn))
      {
         point5=MarketInfo(Symbol(),MODE_POINT);
         if (point5==0) break;
         ask5=MathRound(MarketInfo(Symbol(),MODE_ASK)/point5);
         open5=MathRound(OrderOpenPrice()/point5);
         if (ask5-open5<Stop5) continue;
         OrderClose (OrderTicket(),OrderLots(),ask5*point5,Slippage,Red);
      }
   }
}
// End
Пользуюсь таким вариантом, настройки под пятизнак, работает без проблем.
Причина обращения: