Eliminar resultados inútiles backtesting

 
Buenas, 
Les comento el problema que estoy teniendo. Cuando realizó una optimización de un robot en MT4, a veces algunos de los resultados que me presenta en el informe son de pasadas con 1, 2,3 o 4 operaciones. Estas pasadas me son inútiles para procesar posteriormente este informe por pruebas como K-means ya que las desvirtúan. Se podría indicar a mt4 q solo tuviese en cuenta pasadas con más de 50 operaciones? Es un ejemplo.
Gracias
 
Miguel Jimenez:
Gracias

Use OnTester().

https://docs.mql4.com/basis/function/events#ontester

Event Handling Functions - Functions - Language Basics - MQL4 Reference
Event Handling Functions - Functions - Language Basics - MQL4 Reference
  • docs.mql4.com
Event Handling Functions - Functions - Language Basics - MQL4 Reference
 
Gracias por la contestación pero la verdad es que me ayuda poco. Yo lo que quiero es eliminar aquellos resultados válidos por qué tienen un valor on testero bueno pero con pocas transacciones.
 
Miguel Jimenez #:

Esa función hace exactamente eso y puede filtrar hasta donde le dé la imaginación.

Un ejemplo:

//+------------------------------------------------------------------+
//| OnTester                                                         |
/+-------------------------------------------------------------------+
double OnTester()
  {
  double  rec_factor = 0;
  if(TesterStatistics(STAT_TRADES) < 30)
      rec_factor = 0;
   return rec_factor;
  }
//+------------------------------------------------------------------+

Además también puede hacer, por otro lado, que al no hacer X trades fuerce el cierre/eliminación del EA ( ExpertRemove() ), por lo que el resultado no se computa.

Como ve hay varias formas de hacerlo.

 
Miguel Angel Vico Alba #:

Esa función hace exactamente eso y puede filtrar hasta donde le dé la imaginación.

Un ejemplo:

Además también puede hacer, por otro lado, que al no hacer X trades fuerce el cierre/eliminación del EA ( ExpertRemove() ), por lo que el resultado no se computa.

Como ve hay varias formas de hacerlo.

Muchas gracias Miguel,  ahora lo voy viendo más claro.

Sin embargo, piense que está ante un neófito total. Esta función cómo /dónde la tendría que incluir para que al lanzar el probador de estrategias funcionase?

Bueno, he estado investigando un poco, he abierto mi robot en metaEditor, he buscado la parte de OnTester y he añadido el código que me da usted, me ha quedado así:

//+------------------------------------------------------------------+
//| Tester function                                                  |
//+------------------------------------------------------------------+
double OnTester()
{  
   double ret=0.0;
   
   if(TesterStatistics(STAT_TRADES) < 50)
      rec_factor = 0;
   return rec_factor;
   
   if(IsOptimization()){ 
        if(custom == criterio_br){
           double  profit = TesterStatistics(STAT_PROFIT);
           double  max_dd = TesterStatistics(STAT_BALANCE_DD);
           if(max_dd != 0.0)
              ret = profit/max_dd;
           else
             ret=-1;
        }else if(custom == criterio_sqn){
            int hstTotal=OrdersHistoryTotal();
            double tradesProfits[];
            ArrayResize(tradesProfits, hstTotal);
            double totalProfit = 0.0;
            for(int i=0;i<hstTotal;i++)
            {                
                OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
                tradesProfits[i]=OrderProfit();
                totalProfit += tradesProfits[i];
            }            

            if(hstTotal != 0)
                double average = totalProfit/hstTotal;

            double stdDev = standardDeviation(tradesProfits, average);
            if(stdDev != 0.0)               
                ret = (average / stdDev) * MathSqrt(hstTotal);
            else
               ret = -1;
         }else if(custom == criterio_kratio){
            double acumPips=0.0;
            double acumPipsArr[];
            ArrayResize(acumPipsArr,OrdersHistoryTotal());
            for(int j = 0; j<OrdersHistoryTotal();j++){
               OrderSelect(j, SELECT_BY_POS, MODE_HISTORY);
               
               if ( OrderType() == OP_BUY ) {               
                  acumPips += ( OrderClosePrice() - OrderOpenPrice() ) / (Point*MyPoint);
               }else if ( OrderType() == OP_SELL ) {
                  acumPips += ( OrderOpenPrice() - OrderClosePrice() ) / (Point*MyPoint);
               }
               
               acumPipsArr[j]=acumPips;
               
            }
            
            ret = getKRatio(acumPipsArr);

        }   
    }
   return (ret);
}
//+------------------------------------------------------------------+
Sin embargo, lo guardo con otro nombre, le doy al botón de compilar y cuando lo pongo en MT4 no me funciona.... he podido hacer algo mal?
 
Miguel Jimenez #:

Debe incluirlo al final del EA y usar la optimización 'Criterio máximo del usuario' en el probador.

 
Miguel Angel Vico Alba #:

Debe incluirlo al final del EA y usar la optimización 'Criterio máximo del usuario' en el probador.

Si lo pongo al final me da un error, seguro que lo estoy haciendo mal... le dejo el codigo

//| Tester function                                                  |
//+------------------------------------------------------------------+
double OnTester()
{  
   double ret=0.0;
   
   if(IsOptimization()){ 
        if(custom == criterio_br){
           double  profit = TesterStatistics(STAT_PROFIT);
           double  max_dd = TesterStatistics(STAT_BALANCE_DD);
           if(max_dd != 0.0)
              ret = profit/max_dd;
           else
             ret=-1;
        }else if(custom == criterio_sqn){
            int hstTotal=OrdersHistoryTotal();
            double tradesProfits[];
            ArrayResize(tradesProfits, hstTotal);
            double totalProfit = 0.0;
            for(int i=0;i<hstTotal;i++)
            {                
                OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
                tradesProfits[i]=OrderProfit();
                totalProfit += tradesProfits[i];
            }            

            if(hstTotal != 0)
                double average = totalProfit/hstTotal;

            double stdDev = standardDeviation(tradesProfits, average);
            if(stdDev != 0.0)               
                ret = (average / stdDev) * MathSqrt(hstTotal);
            else
               ret = -1;
         }else if(custom == criterio_kratio){
            double acumPips=0.0;
            double acumPipsArr[];
            ArrayResize(acumPipsArr,OrdersHistoryTotal());
            for(int j = 0; j<OrdersHistoryTotal();j++){
               OrderSelect(j, SELECT_BY_POS, MODE_HISTORY);
               
               if ( OrderType() == OP_BUY ) {               
                  acumPips += ( OrderClosePrice() - OrderOpenPrice() ) / (Point*MyPoint);
               }else if ( OrderType() == OP_SELL ) {
                  acumPips += ( OrderOpenPrice() - OrderClosePrice() ) / (Point*MyPoint);
               }
               
               acumPipsArr[j]=acumPips;
               
            }
            
            ret = getKRatio(acumPipsArr);

        }   
    }
   return (ret);
}
double OnTester()
  {
  double  rec_factor = 0;
  if(TesterStatistics(STAT_TRADES) < 30)
      rec_factor = 0;
   return rec_factor;
  }
//+------------------------------------------------------------------+
 
Miguel Angel Vico Alba #:

Debe incluirlo al final del EA y usar la optimización 'Criterio máximo del usuario' en el probador.


Parece que ya no da errores pero no me da ningún resultado la optimización. No se donde está el criterio máximo del usuario. Me puede orientar?
 
Miguel Jimenez #:

La función ya la tiene creada y la está duplicando. Lo lamento, pero sin un mínimo de conocimiento de programación podríamos estar dando palos de ciego por días.

Le aconsejo que busque alguna guía sobre C++ antes de seguir adelante, al menos para como digo tener unos conocimientos básicos sobre lo que tiene delante.

Construir la casa por el tejado nunca acaba bien.

 

Con el código de esta manera, parece que funciona, estoy haciendo pruebas.

             }
               
               acumPipsArr[j]=acumPips;
               
            }
            
            ret = getKRatio(acumPipsArr);

        }   
    }
   return (ret);
   
   double  rec_factor = 0;
  if(TesterStatistics(STAT_TRADES) < 30)
      rec_factor = 0;
   return rec_factor;
}

//+------------------------------------------------------------------+
 

Bueno pues el indicador no da ya errores tal y como lo he puesto pero al realizar la optimización siguen apareciendo en el informe de optimización pases con menos de 30 operaciones.

Alguna idea?

Razón de la queja: