Ошибка в работе эксперта из-за реквоута

 

Вопрос к разработчикам.

Имеем код:

if (AccountProfit>0)
{
bool fc;
for (int s=OrdersTotal()-1; s>=0; s--) {
if (OrderSelect(s, SELECT_BY_POS, MODE_TRADES)) {
if (OrderSymbol()==Symbol()) {
int type = OrderType();
fc=False;
switch(type)
{
case OP_BUY :if (condition>0)fc=OrderClose(OrderTicket(), OrderLots(), Bid, Slippage,Red);
break;
case OP_SELL :if (condition>0)fc=OrderClose(OrderTicket(), OrderLots(), Ask, Slippage,Red);
break;
}
}
}
}
}

Смысл: если открыто несколько позиций и суммарный профит больше нуля - закрываем все позиции(закрываемся в безубытке).
Теперь лог:

2006.08.18 17:56:49 '48653': close order #2337066 buy 0.20 AUDNZD at 1.1852 sl: 0.0000 tp: 0.0000 at price 1.1888
2006.08.18 17:56:50 '48653': request was accepted by server
2006.08.18 17:56:50 '48653': request in process
2006.08.18 17:56:53 '48653': requote 1.1882 / 1.1892 for order #2337066 buy 0.20 AUDNZD closing at 1.1888
2006.08.18 17:57:10 '48653': close order #2337066 buy 0.20 AUDNZD at 1.1852 sl: 0.0000 tp: 0.0000 at price 1.1888
2006.08.18 17:57:10 '48653': request was accepted by server
2006.08.18 17:57:10 '48653': requote 1.1888 / 1.1898 for order #2337066 buy 0.20 AUDNZD closing at 1.1888
2006.08.18 17:57:10 '48653': close order #2332011 buy 0.20 AUDNZD at 1.1874 sl: 0.0000 tp: 0.0000 at price 1.1888
2006.08.18 17:57:11 '48653': request was accepted by server
2006.08.18 17:57:11 '48653': request in process
2006.08.18 17:57:15 '48653': order #2332011 buy 0.20 AUDNZD at 1.1874 sl: 0. 0000 tp: 0.0000 closed at price 1.1888
2006.08.18 17:57:16 '48653': close order #2330439 buy 0.20 AUDNZD at 1.1895 sl: 0.0000 tp: 0.0000 at price 1.1888
2006.08.18 17:57:16 '48653': request was accepted by server
2006.08.18 17:57:16 '48653': request in process
2006.08.18 17:57:19 '48653': order #2330439 buy 0.20 AUDNZD at 1.1895 sl: 0. 0000 tp: 0.0000 closed at price 1.1888
2006.08.18 17:57:20 '48653': close order #2322502 buy 0.20 AUDNZD at 1.1929 sl: 0.0000 tp: 0.0000 at price 1.1888
2006.08.18 17:57:20 '48653': request was accepted by server
2006.08.18 17:57:20 '48653': request in process
2006.08.18 17:57:23 '48653': order #2322502 buy 0.20 AUDNZD at 1.1929 sl: 0. 0000 tp: 0.0000 closed at price 1.1888

Как видно из лога, ордер #2337066 после двух попыток закрытия экспертом и получения реквоута больше экспертом не трогался, начали закрываться другие ордера, затем цена развернулась и вместо безубытка и закрытия всех позиций имеем одну открытую убыточную позицию.

Собственно вопросы:

Почему не закрылся ордер #2337066 ?
Как бороться с реквоутом в подобной ситуации ?

 
А почему Вы самостоятельно не обрабатываете "ошибки" торговых операций?
if(OrderClose(....)==false)
  {
   errcode=GetLastError();
   if(errcode==ERR_REQUOTE) .... 
  }
Загляните в раздел статей и документации - там масса информации по теме.
 
Тут кажись дело не в реквоте, а в подсчете прибыли. После того как подсчитали надо флаг устанавливать о необходимости закрытия всех ордеров, и обнулять его после успешного закрытия всех ордеров. А то на одном тике не получилось все закрыть, а прибыль после этого не удовлетворяет условиям закрытия.
 
Renat писал (а):
А почему Вы самостоятельно не обрабатываете "ошибки" торговых операций?





int type   = OrderType();
        fc=False;
        switch(type)
        {
         case OP_BUY :if (condition>0)fc=OrderClose(OrderTicket(), OrderLots(),Bid, Slippage,Red);
         if(fc==false)
                     {
                      int errcode=GetLastError();
                      if(errcode==135 || errcode==138)
                      {
                      RefreshRates();
                      if (condition>0)fc=OrderClose(OrderTicket(), OrderLots(),Bid, Slippage,Red);
                      }
                     }
 
         else break;
         case OP_SELL :if (condition>0)fc=OrderClose(OrderTicket(), OrderLots(),Ask, Slippage,Red);
         if(fc==false)
                     {
                      errcode=GetLastError();
                      if(errcode==135 || errcode==138) 
                      {
                      RefreshRates();
                      if (condition>0)fc=OrderClose(OrderTicket(), OrderLots(),Ask, Slippage,Red);
                      }
                     }
         else break;
 
        }
Ренат, спасибо за наводку :)
Я все правильно понял ?
 
РекфрешРейтсом советник не испортишь. Смело втыкаем его перед каждой торговой операцией, глядишь, придется реже обрабатывать исключения. :)
 
Berserk:
Ренат, спасибо за наводку :)
Я все правильно понял ?

Да, правильно. Но я проглядел стандартную ошибку - Вы не обновляли рыночное окружение через RefreshRates() после каждой торговой операции и поэтому ловили гарантированные реквоты. Rosh правильно сказал.