Martingale para lucro e perda

 

Senhores.

Estou tentando desenvolver um EA simplório se comparado aos demais encontrados na web, e nele desejo inserir uma função martingale especifica.

Fiz uma busca no mql5 mas não encontrei nada proximo ao que desejo.

Sabemos que o uso de martingale não é a melhor das soluções, mas ainda assim quero ter essa opção no meu EA.

Criei duas variaveis externas do tipo bool para o usuario optar ou nao por usar o critério de somar quando lucro, multiplicar quando perca ou os dois ao mesmo tempo.  

A função só nao está dando certo caso o usuario opte por deixar as duas opçoes habilitadas. Caso contrario, os lotes ficam corretos.

Quanto aos limitadores dessas operações eu resolverei futuramente.

Sigamos, a ideia, é simples,ex.:

1. operação #1,  lote inicial 0.01,  se lucro,  proxima operação #2 (soma lote 0.01 + 0.01 [fator de aumento] =lote será 0.02) e assim sucessivamente até vir o loss.

1.1 na sequencia, como deu loss, suponhamos que lote estaria em 0.05, o EA multiplica o lote atual [0.05 * fator multiplicador] e assim sucessivamente até operação ser vitoriosa o que retornará a logica inicial.

Gostaria que me apontassem onde estou errando ou indicassem uma leitura de referencia especifica ao erro de logica o qual cometi.

Abaixo deixo o codigo.

Lembrando que o resultado dessa função gale_reverse será passada a uma variavel local  dentro da função responsável por abrir as ordens. 


double gale_reverse( double lote_inicial, double fator_incremento, double fator_aumento, int Magicma_n ){

   double tamanho_lote = 0 ;     // 0.01
   int    maior_ticket = 0 ;     
   double lote = 0 ; 
   double maior_lote= 0 ;
   double profit= 0 ;
   
       for ( int i= 0 ; i< OrdersHistoryTotal(); i++) 
       {  
       
             if ( OrderSelect (i,SELECT_BY_POS,MODE_HISTORY)== false )  
             break ;
         
               if ( (OrderSymbol()== Symbol ()) && (OrderMagicNumber()== Magicma_n))  
               {
                     if (OrderTicket() > maior_ticket) 
                     {
                       maior_ticket = OrderTicket();
                       maior_lote = NormalizeDouble ( OrderLots(), 2 );  
                       profit = OrderProfit();
                     }
              }
       }  
 
      
      if ( OrderSelect (maior_ticket,SELECT_BY_TICKET,MODE_HISTORY)== false )
      return (lote_inicial);
   
     
       if (maior_lote == 0 ) 
       tamanho_lote = lote_inicial;  
//-------------
      
          
         if( (gale_perca==false) && (gale_lucro==false)){   
            if((profit>0) || (profit<0) )
            tamanho_lote=lote_inicial;
         }  
         
            if( (gale_perca==false) && (gale_lucro==true)){ 
               if(profit>0)
               tamanho_lote = maior_lote + fator_aumento; //
        
                  else  
                     if(profit<0) tamanho_lote = lote_inicial;
          
           
             } 
         
               if( (gale_perca==true) && (gale_lucro==false)){ 
                   if(profit<0)
                   tamanho_lote=maior_lote * fator_incremento; //
                      else 
                        if(profit>0) tamanho_lote = lote_inicial;
               
               }
                       //------------------------------------------------------------------//
                if( (gale_perca==true) && (gale_lucro==true)){ 
                    
                    if( (profit<0) && (lote_inicial==loteentrada)){ 
                     
                        
                         tamanho_lote=maior_lote*fator_incremento; //
                            if(profit>0) 
                         
                              tamanho_lote = lote_inicial;
                        
                       }
                    } 
                 
         //-------------------------------------------------------------------        
                    if (profit>0){ 
                    tamanho_lote=0;
                
                
                       tamanho_lote=tamanho_lote+fator_aumento;//
                       
                           if(lote_inicial!=loteentrada){
                           
                             tamanho_lote=maior_lote+fator_aumento; 
                            if(profit<0) tamanho_lote=maior_lote*fator_incremento; //
                                if(profit>0) tamanho_lote = lote_inicial;
                           }   
                    }
                  
             lote = NormalizeDouble (tamanho_lote, 2 );
             return (lote);
 
}