Проблемы с одновременным закрытием открытых позиций и отложенных ордеров

 
Собственно сабж. Вылазит какая-то ошибка №2. Посмотрите, может я что-то не так делаю.
//+------------------------------------------------------------------+
//|                                                   ShadowTrader   |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//|                                                             v1.2 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern double Lots     = 0.1;
extern int TakeProfit  =  200;
extern int StopLoss    =  200;
extern int hour        =  12; // Время, по истечении которого ордер будет закрыт
extern int limit       =   5; // Уровень установки отложенного ордера
extern int ProfitLevel =  20; // Общий профит для всех позиций при котором они закрываются

static int magicNumber = 23456;

bool AllowTorg,NewBar;
datetime LastTrade,PrevTime;
int ticket,CountBars;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
   AllowTorg=True;
   LastTrade=CurTime();PrevTime=Time[0];
   ticket=0;CountBars=0;
   return(0);
}

//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
   return(0);
}

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{

int cnt=0,total=0,i=0,totalcountpos=0;
NewBar=false;
   

//+------------------------------------------------------------------------------------------------+
//| Модуль счетчика баров                                           
//+------------------------------------------------------------------------------------------------+
//Отфильтрововаем бары от ценовых тиков
if (Time[0]>PrevTime)
{   
   CountBars=CountBars+1;
   NewBar=True;
   PrevTime=Time[0];
}
//+------------------------------------------------------------------------------------------------+
//| Конец модуля счетчика баров                                           
//+------------------------------------------------------------------------------------------------+


if (CountBars>531)
{
bool result=false;
AllowTorg=false;
total=OrdersTotal();
if (total>0)
{
for (cnt=total-1;cnt>=0;cnt--)
{  
   if ((CurTime()-LastTrade)<10) return (0);
   result=false;
   OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
   {
      if ((OrderSymbol()==Symbol()) && (OrderType()==OP_BUY)&& (OrderMagicNumber()== magicNumber))
      {
         result=OrderClose(OrderTicket(),OrderLots(),Bid,10,Yellow);  
         if (result) LastTrade=CurTime();
         break;
      }
      if ((OrderSymbol()==Symbol()) && (OrderType()==OP_SELL)&& (OrderMagicNumber()== magicNumber))
      {
         result=OrderClose(OrderTicket(),OrderLots(),Ask,10,Blue );  
         if (result) LastTrade=CurTime();
         break;
      }
      if ((OrderSymbol()==Symbol()) && (OrderType()==OP_BUYSTOP) && (OrderMagicNumber()== magicNumber))
      {
         result=OrderDelete(OrderTicket());  
         if (result) LastTrade=CurTime();
         break;
      }   
      if ((OrderSymbol()==Symbol()) && (OrderType()==OP_SELLSTOP) && (OrderMagicNumber()== magicNumber))
      {
         result=OrderDelete(OrderTicket());  
         if (result) LastTrade=CurTime();
         break;
      }   
   
   }
}

if(result==false)
{
   Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );
   Sleep(3000);
}   
}
}

//Открытие позиций
if (CountBars==503 && NewBar)
{
   OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"OP_SELL",magicNumber,0,Blue);
}
if (CountBars==505 && NewBar)
{
   OrderSend(Symbol(),OP_SELLSTOP,Lots,1.1,3,1.5,1.0,"OP_SELLSTOP", magicNumber,0,SkyBlue);
}
if (CountBars==507 && NewBar)
{
   OrderSend(Symbol(),OP_BUYSTOP,Lots,1.4,3,1.1,1.5, "OP_BUYSTOP", magicNumber,0,Pink);
}
if (CountBars==509 && NewBar)
{
   OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"OP_BUY",magicNumber,0, Yellow);
}
if (CountBars==511 && NewBar)
{
   OrderSend(Symbol(),OP_SELLSTOP,Lots,1.1,3,1.5,1.0,"OP_SELLSTOP", magicNumber,0,SkyBlue);
}
if (CountBars==513 && NewBar)
{
   OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"OP_SELL",magicNumber,0,Blue);
}
if (CountBars==515 && NewBar)
{
   OrderSend(Symbol(),OP_BUYSTOP,Lots,1.4,3,1.1,1.5, "OP_BUYSTOP", magicNumber,0,Pink);
}
if (CountBars==519 && NewBar)
{
   OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"OP_BUY",magicNumber,0, Yellow);
}


   return(0);
}
//+------------------------------------------------------------------+
 
Стандартный случай - не учитывается устаревание цен.
Поищите, пожалуйста, обсуждения по форуму.
 
Ну вот, использую я обновление рыночного окружения - тоже самое:
//+------------------------------------------------------------------+
//|                                                   ShadowTrader   |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//|                                                             v1.2 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern double Lots     = 0.1;
extern int TakeProfit  =  200;
extern int StopLoss    =  200;
extern int hour        =  12; // Время, по истечении которого ордер будет закрыт
extern int limit       =   5; // Уровень установки отложенного ордера
extern int ProfitLevel =  20; // Общий профит для всех позиций при котором они закрываются

static int magicNumber = 23456;

bool AllowTorg,NewBar;
datetime LastTrade,PrevTime;
int ticket,CountBars;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
   AllowTorg=True;
   LastTrade=CurTime();PrevTime=Time[0];
   ticket=0;CountBars=0;
   return(0);
}

//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
   return(0);
}

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{

int cnt=0,total=0,i=0,totalcountpos=0;
NewBar=false;
   

//+------------------------------------------------------------------------------------------------+
//| Модуль счетчика баров                                           
//+------------------------------------------------------------------------------------------------+
//Отфильтрововаем бары от ценовых тиков
if (Time[0]>PrevTime)
{   
   CountBars=CountBars+1;
   NewBar=True;
   PrevTime=Time[0];
}
//+------------------------------------------------------------------------------------------------+
//| Конец модуля счетчика баров                                           
//+------------------------------------------------------------------------------------------------+


if (CountBars>531)
{
bool result=false;
AllowTorg=false;
total=OrdersTotal();
if (total>0)
{
for (cnt=total-1;cnt>=0;cnt--)
{  
   if ((CurTime()-LastTrade)<10) return (0);
   result=false;
   OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
   RefreshRates();
   {
      if ((OrderSymbol()==Symbol()) && (OrderType()==OP_BUY)&& (OrderMagicNumber()== magicNumber))
      {
         result=OrderClose(OrderTicket(),OrderLots(),Bid,10,Yellow);  
         if (result) LastTrade=CurTime();
         break;
      }
      if ((OrderSymbol()==Symbol()) && (OrderType()==OP_SELL)&& (OrderMagicNumber()== magicNumber))
      {
         result=OrderClose(OrderTicket(),OrderLots(),Ask,10,Blue );  
         if (result) LastTrade=CurTime();
         break;
      }
      if ((OrderSymbol()==Symbol()) && (OrderType()==OP_BUYSTOP) && (OrderMagicNumber()== magicNumber))
      {
         result=OrderDelete(OrderTicket());  
         if (result) LastTrade=CurTime();
         break;
      }   
      if ((OrderSymbol()==Symbol()) && (OrderType()==OP_SELLSTOP) && (OrderMagicNumber()== magicNumber))
      {
         result=OrderDelete(OrderTicket());  
         if (result) LastTrade=CurTime();
         break;
      }   
   
   }
}

if(result==false)
{
   Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );
   Sleep(3000);
}   
}
}

//Открытие позиций
if (CountBars==503 && NewBar)
{
   OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"OP_SELL",magicNumber,0,Blue);
}
if (CountBars==505 && NewBar)
{
   OrderSend(Symbol(),OP_SELLSTOP,Lots,1.1,3,1.5,1.0,"OP_SELLSTOP", magicNumber,0,SkyBlue);
}
if (CountBars==507 && NewBar)
{
   OrderSend(Symbol(),OP_BUYSTOP,Lots,1.4,3,1.1,1.5, "OP_BUYSTOP", magicNumber,0,Pink);
}
if (CountBars==509 && NewBar)
{
   OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"OP_BUY",magicNumber,0, Yellow);
}
if (CountBars==511 && NewBar)
{
   OrderSend(Symbol(),OP_SELLSTOP,Lots,1.1,3,1.5,1.0,"OP_SELLSTOP", magicNumber,0,SkyBlue);
}
if (CountBars==513 && NewBar)
{
   OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"OP_SELL",magicNumber,0,Blue);
}
if (CountBars==515 && NewBar)
{
   OrderSend(Symbol(),OP_BUYSTOP,Lots,1.4,3,1.1,1.5, "OP_BUYSTOP", magicNumber,0,Pink);
}
if (CountBars==519 && NewBar)
{
   OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"OP_BUY",magicNumber,0, Yellow);
}


   return(0);
}
//+------------------------------------------------------------------+



Ошибка №2 #define ERR_COMMON_ERROR 2. Млин, нельзя ли своей рукой поправить код, чтобы он работал?
И зачем тогда в OrderClose() проскальзование используется? Очевидно, что когда в цикле по тикетам перебераются все ордера и после ордера BUY или SELL встречаются ордера BUYSTOP или SELLSTOP, или наоборот - вылазит эта ошибка. Имхо, это явно глюк MQL4.

 
Видно по Вашим записям, что Вы хотели решить проблему устаревания данных. Попробуйте вывести на печать значение LastTrade. Иногда бывает, что во время выполнения запроса на ордер неправильно отрабатывается функция времени и возвращается 0. Из-за этого у Вас может и не быть паузы в запросах и, соответственно, может из-зи этого и выплывает Ваша ошибка.
 
Так как гораздо лучше самостоятельно научиться ловить рыбу, чем каждый раз ждать рыбу от других:
1) подсчитайте количество мест, где есть задержки и устаревание цен
2) проверьте, есть ли защита от устаревания везде где нужно?
3) поищите, пожалуйста, темы, в которых я детально объяснял аналогичные вопросы

Имхо, это явно глюк MQL4

Представленный код очень плох.
Настолько плох, что речи об каких-либо ошибках в MQL4 даже не может идти речи.
 
Ну, вот я кажется поймал Вашу рыбку. Ошибка пропала, по крайней мере, я её замаскировал:
//+------------------------------------------------------------------+
//|                                                   ShadowTrader   |
//|                      Copyright © 2005, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//|                                                             v1.2 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"

extern double Lots     = 0.1;
extern int TakeProfit  =  200;
extern int StopLoss    =  200;
extern int hour        =  12; // Время, по истечении которого ордер будет закрыт
extern int limit       =   5; // Уровень установки отложенного ордера
extern int ProfitLevel =  20; // Общий профит для всех позиций при котором они закрываются

static int magicNumber = 23456;

bool AllowTorg,NewBar;
datetime LastTrade,PrevTime;
int ticket,CountBars;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
{
   AllowTorg=True;
   LastTrade=CurTime();PrevTime=Time[0];
   ticket=0;CountBars=0;
   return(0);
}

//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
   return(0);
}

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{

int cnt=0,total=0,i=0,totalcountpos=0;
NewBar=false;
   

//+------------------------------------------------------------------------------------------------+
//| Модуль счетчика баров                                           
//+------------------------------------------------------------------------------------------------+
//Отфильтрововаем бары от ценовых тиков
if (Time[0]>PrevTime)
{   
   CountBars=CountBars+1;
   NewBar=True;
   PrevTime=Time[0];
}
//+------------------------------------------------------------------------------------------------+
//| Конец модуля счетчика баров                                           
//+------------------------------------------------------------------------------------------------+


if (CountBars>571)
{
bool result=false;
AllowTorg=false;
total=OrdersTotal();
if (total>0)
{
for (cnt=total-1;cnt>=0;cnt--)
{  
//   Print(LastTrade);
   if (((CurTime()-LastTrade)<10) || (LastTrade==0)) return (0);
   result=false;
   OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);
   RefreshRates();
   {
      if ((OrderSymbol()==Symbol()) && (OrderType()==OP_BUY))
      {
         result=OrderClose(OrderTicket(),OrderLots(),Bid,5,Yellow);  
         if (result){ LastTrade=CurTime();break; }
      }
      if ((OrderSymbol()==Symbol()) && (OrderType()==OP_SELL))
      {
         result=OrderClose(OrderTicket(),OrderLots(),Ask,5,Blue );  
         if (result){ LastTrade=CurTime();break; }
      }
      if ((OrderSymbol()==Symbol()) && (OrderType()==OP_BUYSTOP) && (OrderMagicNumber()== magicNumber))
      {
         result=OrderDelete(OrderTicket());  
         if (result){ LastTrade=CurTime();break; }
      }   
      if ((OrderSymbol()==Symbol()) && (OrderType()==OP_SELLSTOP) && (OrderMagicNumber()== magicNumber))
      {
         result=OrderDelete(OrderTicket());  
         if (result){ LastTrade=CurTime();break; }
      }   
   
   }
}

if(result==false)
{
   Alert("Order " , OrderTicket() , " failed to close. Error:" , GetLastError() );
   Sleep(3000);
}   
}
}



//Открытие позиций
if (CountBars==503 && NewBar)
{
   OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"OP_SELL",magicNumber,0,Blue);
   LastTrade=CurTime();
}
if (CountBars==505 && NewBar)
{
   OrderSend(Symbol(),OP_SELLSTOP,Lots,1.1,3,1.5,1.0,"OP_SELLSTOP", magicNumber,0,SkyBlue);
   LastTrade=CurTime();
}
if (CountBars==507 && NewBar)
{
   OrderSend(Symbol(),OP_BUYSTOP,Lots,1.4,3,1.1,1.5, "OP_BUYSTOP", magicNumber,0,Pink);
   LastTrade=CurTime();
}
if (CountBars==509 && NewBar)
{
   OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"OP_BUY",magicNumber,0, Yellow);
   LastTrade=CurTime();
}
if (CountBars==511 && NewBar)
{
   OrderSend(Symbol(),OP_SELLSTOP,Lots,1.1,3,1.5,1.0,"OP_SELLSTOP", magicNumber,0,SkyBlue);
   LastTrade=CurTime();
}
if (CountBars==513 && NewBar)
{
   OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,0,"OP_SELL",magicNumber,0,Blue);
   LastTrade=CurTime();
}
if (CountBars==515 && NewBar)
{
   OrderSend(Symbol(),OP_SELLSTOP,Lots,1.1,3,1.5,1.0,"OP_SELLSTOP", magicNumber,0,SkyBlue);
   LastTrade=CurTime();
}
if (CountBars==517 && NewBar)
{
   OrderSend(Symbol(),OP_SELLSTOP,Lots,1.1,3,1.5,1.0,"OP_SELLSTOP", magicNumber,0,SkyBlue);
   LastTrade=CurTime();
}
if (CountBars==519 && NewBar)
{
   OrderSend(Symbol(),OP_SELLSTOP,Lots,1.1,3,1.5,1.0,"OP_SELLSTOP", magicNumber,0,SkyBlue);
   LastTrade=CurTime();
}
if (CountBars==521 && NewBar)
{
   OrderSend(Symbol(),OP_BUYSTOP,Lots,1.4,3,1.1,1.5, "OP_BUYSTOP", magicNumber,0,Pink);
   LastTrade=CurTime();
}
if (CountBars==523 && NewBar)
{
   OrderSend(Symbol(),OP_BUYSTOP,Lots,1.4,3,1.1,1.5, "OP_BUYSTOP", magicNumber,0,Pink);
   LastTrade=CurTime();
}
if (CountBars==525 && NewBar)
{
   OrderSend(Symbol(),OP_BUYSTOP,Lots,1.4,3,1.1,1.5, "OP_BUYSTOP", magicNumber,0,Pink);
   LastTrade=CurTime();
}
if (CountBars==527 && NewBar)
{
   OrderSend(Symbol(),OP_BUYSTOP,Lots,1.4,3,1.1,1.5, "OP_BUYSTOP", magicNumber,0,Pink);
   LastTrade=CurTime();
}
if (CountBars==529 && NewBar)
{
   OrderSend(Symbol(),OP_BUYSTOP,Lots,1.4,3,1.1,1.5, "OP_BUYSTOP", magicNumber,0,Pink);
   LastTrade=CurTime();
}
if (CountBars==531 && NewBar)
{
   OrderSend(Symbol(),OP_BUYSTOP,Lots,1.4,3,1.1,1.5, "OP_BUYSTOP", magicNumber,0,Pink);
   LastTrade=CurTime();
}
if (CountBars==533 && NewBar)
{
   OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,0,"OP_BUY",magicNumber,0, Yellow);
   LastTrade=CurTime();
}


   return(0);
}
//+------------------------------------------------------------------+



Хотя иногда ордера закрываются не в том порядке, котором открывались... И это смущает. Предусмотрел ситуацию, если вдруг LastTrade будет равен 0.


Представленный код очень плох.

А я и не претендую на звание супер-пупер программиста MQL4 и Ваш форум, как мне показалось, для того и существует, чтобы помочь разобраться, а не отсылать к проотцам учиться. Хотя бы ссылку дали...

 
Интерестно посмотреть результат при попытке удалить в куче ордера Buy, например, вот в такой конструкции:
      if ((OrderSymbol()==Symbol()) && (OrderType()==OP_BUY) && (OrderMagicNumber()== magicNumber))
      {
         while (result==false)
         {
            RefreshRates();
            result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),5,Yellow);  
            Print(" Тикет: ",OrderTicket()," Результат: ",result);
            attempt++;
            if (attempt==10) break;
            Sleep(1000);
         }
         if (result) LastTrade=CurTime();
         break;
      }



Тесер закрывает все ордера Buy, кроме последнего, в протколе пишеться вот, что:


04:46:04 2005.06.03 21:00 NemoX-0002: open #46 buy 0.10 EURUSD at 1.2225 sl: 1.1225 tp: 1.3225 ok
04:46:04 2005.06.06 00:00 NemoX-0002: close #46 buy 0.10 EURUSD at 1.2225 sl: 1.1225 tp: 1.3225 at price 1.2227
04:46:04 2005.06.06 00:00 NemoX-0002: Тикет: 46 Результат: 1
04:46:04 2005.06.06 00:00 NemoX-0002: close #44 buy 0.10 EURUSD at 1.2287 sl: 1.1287 tp: 1.3287 at price 1.2229
04:46:04 2005.06.06 00:00 NemoX-0002: Тикет: 44 Результат: 1
04:46:04 2005.06.06 00:00 NemoX-0002: close #40 buy 0.10 EURUSD at 1.2274 sl: 1.1274 tp: 1.3274 at price 1.2224
04:46:04 2005.06.06 00:00 NemoX-0002: Тикет: 40 Результат: 1
04:46:04 2005.06.06 00:01 NemoX-0002: close #32 buy 0.10 EURUSD at 1.2290 sl: 1.1290 tp: 1.3290 at price 1.2225
04:46:04 2005.06.06 00:01 NemoX-0002: Тикет: 32 Результат: 1
04:46:04 2005.06.06 00:02 NemoX-0002: close #26 buy 0.10 EURUSD at 1.2288 sl: 1.1288 tp: 1.3288 at price 1.2229
04:46:04 2005.06.06 00:02 NemoX-0002: Тикет: 26 Результат: 1
04:46:04 2005.06.06 00:02 NemoX-0002: close #22 buy 0.10 EURUSD at 1.2216 sl: 1.1216 tp: 1.3216 at price 1.2223
04:46:04 2005.06.06 00:02 NemoX-0002: Тикет: 22 Результат: 1
04:46:04 2005.06.06 00:02 NemoX-0002: close #18 buy 0.10 EURUSD at 1.2206 sl: 1.1206 tp: 1.3206 at price 1.2225
04:46:04 2005.06.06 00:02 NemoX-0002: Тикет: 18 Результат: 1
04:46:04 2005.06.06 00:03 NemoX-0002: close #16 buy 0.10 EURUSD at 1.2237 sl: 1.1237 tp: 1.3237 at price 1.2224
04:46:04 2005.06.06 00:03 NemoX-0002: Тикет: 16 Результат: 1
04:46:04 2005.06.06 00:03 NemoX-0002: close #12 buy 0.10 EURUSD at 1.2257 sl: 1.1257 tp: 1.3257 at price 1.2229
04:46:04 2005.06.06 00:03 NemoX-0002: Тикет: 12 Результат: 1
04:46:04 2005.06.06 00:03 NemoX-0002: close #10 buy 0.10 EURUSD at 1.2251 sl: 1.1251 tp: 1.3251 at price 1.2227
04:46:04 2005.06.06 00:03 NemoX-0002: Тикет: 10 Результат: 1
04:46:04 2005.06.06 00:04 NemoX-0002: Тикет: 2 Результат: 0
04:46:04 2005.06.06 00:04 NemoX-0002: Тикет: 2 Результат: 0
04:46:04 2005.06.06 00:04 NemoX-0002: Тикет: 2 Результат: 0
04:46:04 2005.06.06 00:04 NemoX-0002: Тикет: 2 Результат: 0
04:46:04 2005.06.06 00:04 NemoX-0002: Тикет: 2 Результат: 0
04:46:04 2005.06.06 00:04 NemoX-0002: Тикет: 2 Результат: 0
04:46:04 2005.06.06 00:04 NemoX-0002: Тикет: 2 Результат: 0
04:46:04 2005.06.06 00:04 NemoX-0002: Тикет: 2 Результат: 0
04:46:04 2005.06.06 00:04 NemoX-0002: Тикет: 2 Результат: 0
04:46:04 2005.06.06 00:04 NemoX-0002: Тикет: 2 Результат: 0
04:46:04 2005.06.06 00:04 NemoX-0002: Alert: Order 2 failed to close. Error:2
04:46:04 2005.06.06 00:04 NemoX-0002: Тикет: 2 Результат: 0
04:46:04 2005.06.06 00:04 NemoX-0002: Тикет: 2 Результат: 0
04:46:04 2005.06.06 00:04 NemoX-0002: Тикет: 2 Результат: 0


И ошибка №2 будет выплывать до тех пор, пока не закроются все ордера BuyStop. И Вы мне ещё говорите, что это не глюк МТ4?... Так у кого из нас код ужастный :-) ?

 
А для чего оператор break здесь?

    if (result) LastTrade=CurTime();
         break;
      }



Он алгоритм не ломает?

 
А потому, что это цикл вложен внутрь другого цикла:
   for (cnt=OrdersTotal()-1;cnt>=0;cnt--)
   {  
      if ((CurTime()-LastTrade)<5) Sleep(5000);


где отрабатывается задержка, если ордер закрылся удачно. Можно конечно и тут Sleep(5000), но мне кажется, что лучше, чтобы сначала закрылись все Buy, а потом уж все Sell, можно и на оборот, но деньги вперед :-)

 
if (attempt==10)


Что такое 10? У Ивана-Царевича было всего 3 попытки:)

Sleep(1000);


Почему 1 сек? А не 1,5? Или не 0,5?

 
Мой совет: приведите код и логику в чистый вид.
Причина обращения: