Про Советник из учебника Ковалева. - страница 4

 
может так надо сделать? выделено красным
//--------------------------------------------------------------- 6 --
// Закрытие ордеров   
while(true)                                  // Цикл закрытия орд.     
{  
if (OrderSymbol()!=Symb || Magic!=OrderMagicNumber())continue; // Не наш фин. инструм , не наш ордер    
{
  if (Tip==0 && Cls_B==true)                // Открыт ордер Buy..        
   {                                       //и есть критерий закр        
    Alert("Попытка закрыть Buy ",Symb," ",Ticket,". Ожидание ответа..");        
    RefreshRates();                        // Обновление данных         
    Ans=OrderClose(Ticket,Lot,Bid,2);      // Закрытие Buy        
    if (Ans==true)                         // Получилось :)          
    { 
     Alert ("Закрыт ордер Buy ",Symb," ",Ticket);            
     break;                              // Выход из цикла закр           
    }
    if (Fun_Error(GetLastError())==1)      // Обработка ошибок           
     continue;                           // Повторная попытка         
     return;                                // Выход из start()       
   }
  if (Tip==1 && Cls_S==true)                // Открыт ордер Sell..        
   {                                       // и есть критерий закр        
    Alert("Попытка закрыть Sell ",Symb," ",Ticket,". Ожидание ответа..");        
    RefreshRates();                        // Обновление данных        
    Ans=OrderClose(Ticket,Lot,Ask,2);      // Закрытие Sell         
    if (Ans==true)                         // Получилось :)           
    {          
     Alert ("Закрыт ордер Sell ",Symb," ", Ticket);            
     break;                              // Выход из цикла закр          
    }        
    if (Fun_Error(GetLastError())==1)      // Обработка ошибок            
    continue;                           // Повторная попытка         
    return;                                // Выход из start()        
   }     
   break;                                    // Выход из while 
  }  
  }   
//--------------------------------------------------------------- 7 --   
может так?
 

Ваш цикл меня смущает.

Попробуйте сделать перебор ордеров так:

    for(int cnt=0; cnt<OrdersTotal(); cnt++) {
      if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)){
        if(OrderSymbol()==Symb && OrderMagicNumber()==Magic)
         {
         // здесь Ваш код
         }
       }
     }

OrderClose напишите так:

Ans=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid, Digits),slippage,White);  // для Buy

Ans=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask, Digits),slippage,White);  // для Sell

И ещё. Прежде чем запускать цикл, определитесь, надо ли Вам это.

Для этого ещё перед циклом for() поставьте условие входа в цикл, т.е Ваши Cls_B==true и Cls_S==true.

 if(Cls_B || Cls_S)
  {
   // входите в цикл и выполняете свой код
  }
 
Sergey_Rogozin:

Ваш цикл меня смущает.

Попробуйте сделать перебор ордеров так:

 for(int cnt=0; cnt<OrdersTotal(); cnt++) {
      if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES)){
        if(OrderSymbol()==Symb && OrderMagicNumber()==Magic)
         {
         // здесь Ваш код
         }
       }
     }


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

Удачи.

 
VladislavVG:

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

Удачи.

Владислав, Вы меня поставили в тупик.

Мне многократно приходилось видеть в готовых кодах именно этот цикл для выбора ордера, подлежащего закрытию.

Такой же код использую. Работает.

Мне будет весьма полезно узнать от Вас, в чем его неверность.

Относительно подчеркнутого, полностью согласен. Правильнее было бы так:

 int total=OrdersTotal();

 for(int cnt=0; cnt<total; cnt++){
 
Sergey_Rogozin:

Владислав, Вы меня поставили в тупик.

Мне многократно приходилось видеть в готовых кодах именно этот цикл для выбора ордера, подлежащего закрытию.

Такой же код использую. Работает.

Мне будет весьма полезно узнать от Вас, в чем его неверность.

При удалении ордеров некоторые будут пропущены - меняется нумерация ордеров. Правильный цикл в обратную сторону.

for(cnt = OrdersTotal()-1; cnt>=0; cnt--)
{

Посмотрите по форуму .....

Удачи

 
VladislavVG:

При удалении ордеров некоторые будут пропущены - меняется нумерация ордеров. Правильный цикл в обратную сторону. Посмотрите по форуму .....

Удачи

То есть cnt-- ?

Да, такое видел очень часто, но не придавал этому значение. Спасибо.

 
Спасибо,все поправил, буду пробовать на деме...
Причина обращения: