Discusión sobre el artículo "Crear Criterios Personalizados de Optimización de Expert Advisors" - página 3

 

Tras muchos experimentos, he llegado a conclusiones similares. No sé por qué me llevó tanto tiempo encontrar este artículo y el debate.

Empecé con un problema en el que mis estrategias de ruptura y de tendencia tendían a ajustarse a unas pocas operaciones super rentables. Tanto beneficio de estos pocos que el optimizador sólo "se preocupaba" por estos pocos oficios y utiliza paradas de ancho y lejos de tomar ganancias y asegurarse de que su señal de captura y ordeñadas estos pocos oficios al máximo. esto ocurrió incluso en 20 años de muestras con 100 de oficios. Incluso cuando se optimiza con una dd a la relación de beneficios, todavía fue después de las carreras con estos oficios a toda costa porque las carreras eran el 90% de su beneficio. Quería limitar este comportamiento de alguna manera sin cortar la cabeza de la ruptura / tendencia paseo strat. He encontrado que la optimización de la dd relativa por ciento (NO dd relación a los beneficios, sólo dd relativa por ciento y nada más) da buenos resultados en el futuro, siempre y cuando las operaciones mínimas y factor de beneficio mínimo (alrededor de 1,3) se cumplen.


//............... 

sinput double mint; //Operaciones mínimas con fines de optimización. Impondrá una penalización a las ejecuciones con menos operaciones. 

sinput double minpf; //Factor de beneficio mínimo con fines de optimización. Impondrá una penalización a las ejecuciones con menos pf.

//...............

double OnTester()

{ 

	 double dd=TesterStatistics(STAT_BALANCE_DDREL_PERCENT);//equidad en lugar de equilibrio también funcionó bien de cara al futuro

	 double pf=TesterStatistics(STAT_PROFIT_FACTOR);

	 int    tt=TesterStatistics(STAT_TRADES); 

	 double custom=(100-dd);

	 if (mint>t) custom=custom*(tt/mint); // impone una penalización si no se cumple el mínimo de operaciones

	 if (minpf>minpf) custom=custom*((pf-1)/(minpf-1)) // esta línea también hace que las carreras perdedoras sean negativas, además de imponer una penalización menor pf.

	 return(custom); 

}

 

 

Parece erróneo no tener en cuenta el beneficio, pero al tener un criterio de pf mínimo, la mayoría de las carreras bastante rentables aparecen en la parte superior. Recortar los dd de las carreras rentables suele aumentar los beneficios. En cualquier caso, mediante la selección de las operaciones más rentables y haciendo los retoques finales cuidadosamente a mano (como cerca del final de este excelente artículo https://www.mql5.com/es/articles/156), puedo permitir que el optimizador para hacer una gran parte del trabajo inicial, evitando una gran cantidad de ajuste de curvas. He experimentado y tenido resultados mixtos con código como el siguiente. (Los experimentos deben incluir el cambio de riesgo y el equilibrio de partida también una vez que comience a poner pesos adicionales en la parte superior de una puntuación basada en porcentaje)

//.............

sinput double pfw /Ponderación del factor de beneficio 

//.............

        double custom=(100-dd)+(pf-1)*pfw;
//...........
Guide to Testing and Optimizing of Expert Advisors in MQL5
Guide to Testing and Optimizing of Expert Advisors in MQL5
  • 2010.10.12
  • Samuel
  • www.mql5.com
This article explains the step by step process of identifying and resolving code errors as well as the steps in testing and optimizing of the Expert Advisor input parameters. You will learn how to use Strategy Tester of MetaTrader 5 client terminal to find the best symbol and set of input parameters for your Expert Advisor.
 

¿Puede alguien decirme si este artículo será aplicable para MT4? Parece que ya ha adoptado muchas propiedades de MT5.

En general, mi tarea es obtener sólo los valores de LR Correlation y LR Standard Error en el probador MT4, ya que se puede ver fácilmente en el probador MT5.

Sólo quiero leer estos valores en la función deinit() al final de la ejecución de la prueba y escribirlos en un archivo junto con el valor del parámetro optimizado.

Tal vez alguien ya ha hecho estas cosas y compartir conmigo el resultado listo (la función necesaria para el cálculo de LR Correlación y LR Standard Error valores) para que yo no tenga que reinventar la rueda?

 
solandr:

¿Puede alguien decirme si este artículo será aplicable para MT4? Parece que ya ha adoptado muchas propiedades de MT5.

En general, mi tarea es obtener sólo los valores de LR Correlation y LR Standard Error en el probador MT4, ya que se puede ver fácilmente en el probador MT5.

Sólo quiero leer estos valores en la función deinit() al final de la ejecución de la prueba y escribirlos en un archivo junto con el valor del parámetro optimizado.

¿Quizás alguien ya ha hecho esto y puede compartir conmigo el resultado (la función necesaria para calcular los valores de Correlación LR y Error Estándar LR) para que no tenga que reinventar la rueda?

En AlgLib (MQL4\Scripts\Alglib\UseAlglib.mq4) hay disponible un ejemplo para calcular la Correlación LR y el Error Estándar LR en las operaciones del historial.
 
Automated-Trading:
En AlgLib (MQL4\Scripts\Alglib\UseAlglib.mq4) encontrará un ejemplo de cálculo de la correlación LR y el error estándar LR para operaciones en el historial.
Gracias. Voy a mirar en él.
 
solandr:
Gracias. Lo investigaré.

Ya lo tengo. La correlación parece estar calculada.

Lo único que tuve que pensar es el hecho de que este punto no funciona en el probador MT4 Build 670:

//--- obtener el saldo inicial
      if(order_type==6) // OP_BALANCE=6
        {
         if(NormalizeDouble(OrderProfit()+OrderSwap(),2)>=0.0)
            if(balance==0.0)
               balance=OrderProfit();
        }

Simplemente no hay órdenes con tipo 6 en el tester.

Es decir, cuando se ejecuta en el probador de MT4 y se utiliza el código de UseAlglib.mq4, incluido en el archivo zip descargado, a través de una llamada de la función deinit().

el saldo sigue siendo igual a 0. Y entonces se imprime el error"Operaciones con saldo cero".

Sólo tuve que insertar el valor necesario del saldo inicial en el probador de MT4 en el propio código y entonces todo se contó perfectamente.

Quizás los desarrolladores puedan tener en cuenta este punto en futuras versiones de la librería.

 

He probado Kelly Criterion (Estrategia), utilizando el siguiente código:


double OnTester(void)
  {
   //https://www.investopedia.com/articles/trading/04/091504.asp
   double w=((TesterStatistics(STAT_PROFIT_TRADES)+TesterStatistics(STAT_LOSS_TRADES))>0)?TesterStatistics(STAT_PROFIT_TRADES)/(TesterStatistics(STAT_PROFIT_TRADES)+TesterStatistics(STAT_LOSS_TRADES)):0; // probabilidad de ganar
   double r=((TesterStatistics(STAT_GROSS_LOSS)!=0)&&(TesterStatistics(STAT_LOSS_TRADES)!=0)&&(TesterStatistics(STAT_PROFIT_TRADES)!=0))?(TesterStatistics(STAT_GROSS_PROFIT)/TesterStatistics(STAT_PROFIT_TRADES))/(-TesterStatistics(STAT_GROSS_LOSS)/TesterStatistics(STAT_LOSS_TRADES)):0; // Ratio de victorias/derrotas;
   double Kelly=(r!=0)?w-((1-w)/r):0; // Criterio Kelly
   return(Kelly);
  }


No estoy seguro de si Metatrader Probador de Estrategias computa 0 (cero) operaciones de beneficio como operaciones de beneficio. ¿Alguien sabe?

 
Ingvar Engelbrecht:

Bueno, aquí estoy de nuevo, el lobo solitario de este universo :-)

He estado probando la rectitud Custom Criteria tratando de obtener la pendiente de la línea recta calculada en la ecuación. Tal y como está te puede dar una puntuación muy alta en un beneficio muy débil. Sólo añadiendo el beneficio final

En un intento de añadir la pendiente real en la ecuación he cambiado el código lilke se ve a continuación.

No es una solución perfecta, pero está más cerca de lo que quiero ver. Utilizando el resultado junto con el balance o el beneficio funciona bien para mí con este código


Sé que ha pasado mucho tiempo desde que publicó esto, pero en caso de que usted todavía está jugando con esto o alguien más está buscando la misma aplicación de criterios de rectitud.

He encontrado una solución pública de trabajo aquí https://community.darwinex.com/t/equity-curve-straigthness-optimization-with-metatrader/3976

Equity Curve Straigthness Optimization with Metatrader
Equity Curve Straigthness Optimization with Metatrader
  • 2018.05.16
  • KlondikeFX
  • community.darwinex.com
An underrated feature of Metatrader’s Backtester is its ability to define a custom fitness function for the genetic optimization process. Meaning that you no longer are limited to rather simple metrics like final balance or profit factor but can evaluate the quality of each test run with your own individual calculations. To give a quick...
 

El tutorial relativo tiene demasiada información, como específicamente sobre la programación de un EA, que se encuentra en otro tutorial, y no aplicable a punter promedio, que, va a comprar su EA y tiene capacidad de programación mínima.

Me parece, que por defecto, los únicos criterios útiles para MT5 en algo genético es el "equilibrio máximo", entonces tiene que repetir que un par de veces, y pescar a través de los resultados hasta encontrar drawdown bajo, como para su uso en múltiples pares.

Que criterios necesito :- Max balance con <20 Drawdown, MaxBalance con <10 Drawdown

 
Gran lectura, lobo solitario por aquí 😁.
 
Gracias por el gran artículo, Dmitriy.

A todos los "lobos solitarios" que andáis por ahí: vais por buen camino, creando criterios de prueba rigurosos y automatizando los mismos. Por supuesto, hay varias maneras diferentes de ver el mismo reto, y la lectura de los comentarios aquí, el consenso parece estar en un compromiso entre el equilibrio, la reducción, RRR y alguna medida de los beneficios (factor de beneficio, Kelly Criterion, etc).
Llegué a este artículo tratando de hacer lo mismo, y con ganas de la Estrategia Tester para hacerlo por mí, me alegro de que no estoy solo :)