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

Para adicionar comentários, por favor Faça o login ou registrar
Fernando Paiva
75
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 ?


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
Ruy Christian Hoffmann
718
Ruy Christian Hoffmann  
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...
Rogerio Giannetti Torres
3161
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.

Para adicionar comentários, por favor Faça o login ou registrar