Fechar todas as ordens no caso de atingir o stop loss ?

 

Estou tentando criar uma rotina para que todas as ordens fechem no caso de atingir o stop loss. Testando no backtest funciona normalmente, mas operando real/demo não fecha. 

Minha estratégia para isso, é buscar no histórico a ultima ordem e verificar se ela fechou com o comentário de [sl], se fechou então fecha todas as ordens abertas, mas não está fechando.

Como resolver isso ?


void closeAllOrdersLimit(ulong magicNumber){
    CTrade _trade;
    
    ulong _ticket = 0;
    string _comment = "";    
    string _compara = "sl";
    datetime _first = 0;
    
   MqlDateTime today;
   
   TimeCurrent(today);   
   string _todayIs = string(today.year) + "." + string(today.mon) + "." + string(today.day) + " 00:00:01";   
   
   if(HistorySelect(StringToTime(_todayIs), TimeCurrent())){
          
               for(int i = HistoryDealsTotal(); i >= 0; i--){
                     _ticket = HistoryDealGetTicket(i);    
                     int _entry = HistoryDealGetInteger(_ticket, DEAL_ENTRY);     
                     string _simbolo = HistoryDealGetString(_ticket, DEAL_SYMBOL);
                     ulong _magicNumber = HistoryDealGetInteger(_ticket, DEAL_MAGIC);
                     double _profit = HistoryDealGetDouble(_ticket, DEAL_PROFIT);
                     
                     if(_magicNumber == magicNumber && _simbolo == _Symbol){
                        if(_entry == DEAL_ENTRY_OUT){ 
                              datetime _dtOrder = (datetime)HistoryDealGetInteger(_ticket, DEAL_TIME); 
                              _comment = HistoryDealGetString(_ticket, DEAL_COMMENT);
                              Alert("Stop Loss: ", _comment);
                              
                              if(TimeCurrent() > _dtOrder){
                                 _comment = "";
                              }                              
                              break;                         
                        }//entry         
                     }//magicNumber
                     
                     
                }//for
          
          }
          
          
          
          //verifica se o comentario da ordem finalizada eh (sl) para stop loss
          //se for finaliza todas as ordens pendentes 
          if(StringLen(_comment) > 0){
                string _SL = StringSubstr(_comment, 0, 2);
                if(_SL == _compara){
                     Print("São iguais, fecha todas as posicoes");
                     
                     //fecha todas as ordens
                     for(int x = OrdersTotal() -1; x >= 0; x--){
                        ulong _tick = OrderGetTicket(x);
                        string _simb = OrderGetString(ORDER_SYMBOL);
                        ulong _mgic = OrderGetInteger(ORDER_MAGIC);
                        
                        if(_mgic == magicNumber && _simb == _Symbol){
                           if(!_trade.OrderDelete(_tick)){
                              Print("Delete Orders Pending Error: ", GetLastError());
                           }
                        }                  
                     }
                     
                     //fecha todas posicoes
                     for(int j = PositionsTotal() - 1; j >= 0; j--){
                        ulong _tic = PositionGetTicket(j);
                        string _sImb = PositionGetString(POSITION_SYMBOL);
                        ulong _mN = PositionGetInteger(POSITION_MAGIC);
                        
                        if(_mN == magicNumber && _sImb == _Symbol){
                           if(!_trade.PositionClose(_tic)){
                              Print("Close Positions Pending Error: ", GetLastError());
                           }
                        }
                     }//for
                }
          
          
          }//stringlen
          
    
    
    
    
    //}
   
   
  
   
   
    
      
}//closeAllOrdersLimit
 
Fernando Paiva:

Estou tentando criar uma rotina para que todas as ordens fechem no caso de atingir o stop loss. Testando no backtest funciona normalmente, mas operando real/demo não fecha. 

Minha estratégia para isso, é buscar no histórico a ultima ordem e verificar se ela fechou com o comentário de [sl], se fechou então fecha todas as ordens abertas, mas não está fechando.

Como resolver isso ?


Olá Fernando,

Eu não li seu código, mas a rotina para fechar todas as Ordens estou colocando abaixo. Então é só encontrar em seu código o momento que você quer que feche todas e inserir a chamada da rotina abaixo PendingOrderDelete();

void PendingOrderDelete()
{
   int o_total=OrdersTotal();
   for(int j=o_total-1; j>=0; j--)
   {
      ulong o_ticket = OrderGetTicket(j);
      if(o_ticket != 0)
      {
         // delete the pending order
         negocio.OrderDelete(o_ticket);
         Print("Ordens não realizadas foram excluídas.");
      }
   }
}
Porque a Hospedagem Virtual no MetaTrader 4 e no MetaTrader 5 são Melhores que os VPS Usuais
Porque a Hospedagem Virtual no MetaTrader 4 e no MetaTrader 5 são Melhores que os VPS Usuais
  • www.mql5.com
Alugar um servidor virtual diretamente dos terminais MetaTrader 4 e MetaTrader 5 é a melhor maneira de garantir um trabalho ininterrupto de seus robôs de negociação e das assinaturas de Sinais. Essencialmente, ele é análogo a um VPS, no entanto, ele é melhor e mais adequado para atender às necessidades e desafios que um trader se depara. O...
 

Olá Fernando,

Dentro do OnTick() o TimeCurrent() é a hora do última cotação recebida pelo ativo , então a condição   IF(TimeCurrent()  <= DTOrder ) vai dar verdadeira e esporadicamente vai dar falsa, pois se uma COTAÇÃO for recebida pelo TERMINAL quando o OnTick() estiver sendo processado o TimeCurrent() será > que dtOrder.  Seu backteste funcionou porque no backteste os TICKS são gerados pelo gerador de ticks e não existe COTAÇÃO , então o  TimeCurrent() será sempre  <= DTOrder da última posição.

Agora vem o pior,  boa sorte mas muito boa sorte mesmo!, quando for deletar o GRID de ORDENS PENDENTES principalmente se for muito grande.... Vez por outra você pode ganhar um 10013 ou 10024. Mas como você em seguida fecha as posições você já sabe as consequências.

Dicas:  Comece a DELETAR pelo índice = 0  ou seja a mais antiga ou a que está mais perto do preço de execução.

 
Rogerio Giannetti Torres #:

Olá Fernando,

Dentro do OnTick() o TimeCurrent() é a hora do última cotação recebida pelo ativo , então a condição   IF(TimeCurrent()  <= DTOrder ) vai dar verdadeira e esporadicamente vai dar falsa, pois se uma COTAÇÃO for recebida pelo TERMINAL quando o OnTick() estiver sendo processado o TimeCurrent() será > que dtOrder.  Seu backteste funcionou porque no backteste os TICKS são gerados pelo gerador de ticks e não existe COTAÇÃO , então o  TimeCurrent() será sempre  <= DTOrder da última posição.

Agora vem o pior,  boa sorte mas muito boa sorte mesmo!, quando for deletar o GRID de ORDENS PENDENTES principalmente se for muito grande.... Vez por outra você pode ganhar um 10013 ou 10024. Mas como você em seguida fecha as posições você já sabe as consequências.

Dicas:  Comece a DELETAR pelo índice = 0  ou seja a mais antiga ou a que está mais perto do preço de execução.

Ola Rogerio.

A titulo de curiosidade, o que seria "ganhar um 10013 ou 10024"..? 

 
josue moraes #:

Ola Rogerio.

A titulo de curiosidade, o que seria "ganhar um 10013 ou 10024"..? 

10013 invalid request

10024 too many requets

Sao errors possiveis de serem retornados.

Razão: