English Русский 中文 Deutsch 日本語 Português
preview
Experimentos con redes neuronales (Parte 3): Uso práctico

Experimentos con redes neuronales (Parte 3): Uso práctico

MetaTrader 5Asesores Expertos | 18 abril 2023, 17:39
496 0
Roman Poshtar
Roman Poshtar

Introducción

Hola a todos, queridos usuarios de la comunidad MQL5. En los anteriores artículos Experimentos con redes neuronales (Parte 1): Recordando la geometría y Experimentos con redes neuronales (Parte 2): Optimización inteligente de una red neuronal,compartimos algunas observaciones y experimentos con redes neuronales. Principalmente, realizamos la optimización de los asesores expertos resultantes y explicamos su funcionamiento. Sin embargo, apenas hemos tocado la aplicación práctica de los resultados obtenidos. El objetivo principal de este artículo será enmendar tan desafortunado malentendido.

Así, hoy aplicaremos los resultados obtenidos en la práctica y también nos familiarizaremos con un nuevo algoritmo que nos permitirá ampliar las capacidades de nuestros asesores expertos, para, por así decirlo, montar la cadena completa y finalmente analizar las pruebas forward. Como siempre, usaremos solo las herramientas de MetaTrader 5 sin utilizar software de terceros. Lo más probable es que este artículo resulte similar a unas instrucciones paso a paso. Por nuestra parte, trataremos de explicar todo de la forma más clara y sencilla posible.


1. Idea de aplicación

Optimizando los dos sistemas anteriores, hemos obtenido ciertos resultados con las mejores lecturas del factor de beneficio o el criterio complejo, además de un conjunto de pesos para nuestros perceptrones y redes neuronales. Tras probar los resultados obtenidos, hemos logrado lecturas bastante tolerables. La idea principal de esta mejora consiste en combinar todos los resultados de optimización en un asesor experto y hacerlos funcionar simultáneamente. Estará de acuerdo con que no resulta muy cómodo mantener 10 gráficos abiertos con diez asesores expertos. Además, esto nos permitirá ver los resultados de forma ampliada (integral), utilizando, por ejemplo, 10-20 parámetros al mismo tiempo.


2. Pareja de divisas Rango de optimización y pruebas forward. Ajustes

Aquí ofreceremos todos los parámetros de optimización y prueba para no repetirnos en el texto:

  • Mercado Fórex;
  • Pareja de divisas EURUSD;
  • Periodo H1;
  • Indicadores: 2 indicadores TEMA con periodos 1 y 24. Hemos tenido que renunciar a MA, ya que el indicador TEMA ha resultado mejor en numerosas pruebas.
  • StopLoss y TakeProfit para las modificaciones correspondientes de 600 y 60;
  • Optimización y modo de prueba "Solo precios de apertura" y "Máximo del criterio complejo". Es muy importante usar el modo "Máximo del criterio complejo", ya que ha mostrado resultados más estables y rentables en comparación con "Rentabilidad Máxima";
  • Rango de optimización 3 años. Del 09.12.2018 al 09.12.2021. 3 años no es ningún criterio. Podrá realizar más o menos pruebas por su cuenta;
  • Rango de prueba forward de 1 año. Del 2021.12.09 al 2022.12.09;
  • En todas las pruebas forward, hemos usado 20 resultados de optimización simultáneamente;
  • Optimización de asesores expertos con perceptrón «Rápida (algoritmo genético)»;
  • Optimización de asesores expertos en la biblioteca DeepNeuralNetwork.mqh "Lenta (iteración completa de parámetros)";
  • Depósito inicial 10000;
  • Apalancamiento 1:500.

3. Asesores en el perceptrón

 Tras numerosas observaciones, resulta que una profundidad de pesos de 200 no es necesaria en los asesores expertos con perceptrón. Será suficiente 20. Por eso, hemos modificado el propio código del perceptrón y los parámetros de optimización. Ahora optimizaremos los pesos desde 0 en incrementos de 1 a 20.

 Asimismo, hemos introducido un nuevo parámetro, "Param", que se encarga de la profundidad de la retirada hacia el lado positivo o negativo del perceptrón. Este parámetro ha influido en el número de transacciones y su precisión. Ahora tenemos menos transacciones, pero su precisión ha aumentado.

 Cada uno de los sistemas usa 2 asesores: el primero para optimización y el segundo para el trabajo directo. Hemos decidido organizar la división de las órdenes usando los comentarios a las mismas, por ser la forma más fácil y cómoda. El número de orden único será su número de serie en la propia muestra. La muestra es un archivo con los resultados de optimización obtenidos. Para limitar el número de procesos simultáneos, hemos usado el parámetro «MaxSeries»

for(int i=0; i<=(ArraySize(EURUSD)/6)-1; i++){
 comm=IntegerToString(i);
 x1=(int)StringToInteger(EURUSD[i][0]);
 x2=(int)StringToInteger(EURUSD[i][1]);
 x3=(int)StringToInteger(EURUSD[i][2]);
 x4=(int)StringToInteger(EURUSD[i][3]);
 
 Param=(int)StringToInteger(EURUSD[i][4]);

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if (CalculateSeries(Magic)<MaxSeries && (perceptron1()<-Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment+" En_"+comm)==0) && (ind_In1[1]>ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenSell(symbolS1.Name(), LotsXSell, TakeProfit, StopLoss, EAComment+" En_"+comm);
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if (CalculateSeries(Magic)<MaxSeries && (perceptron1()>Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment+" En_"+comm)==0) && (ind_In1[1]<ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenBuy(symbolS1.Name(), LotsXBuy, TakeProfit, StopLoss, EAComment+" En_"+comm);
}

}

 Nuevo código del perceptrón:

1 perceptron 4 angle SL TP y 1 perceptron 4 angle

double perceptron1() 
  {
   double w1 = x1 - 10.0;
   double w2 = x2 - 10.0;
   double w3 = x3 - 10.0;
   double w4 = x4 - 10.0;
   
   double a1 = (((ind_In1[1]-ind_In1[6])/Point())/6);
   double a2 = (((ind_In1[1]-ind_In1[11])/Point())/11);
   double a3 = (((ind_In2[1]-ind_In2[6])/Point())/6);
   double a4 = (((ind_In2[1]-ind_In2[11])/Point())/11);   
   
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
  }

1 perceptron 8 angle SL TP y 1 perceptron 8 angle

double perceptron1() 
  {
   double w1 = x1 - 10.0;
   double w2 = x2 - 10.0;
   double w3 = x3 - 10.0;
   double w4 = x4 - 10.0;
   
   double v1 = y1 - 10.0;
   double v2 = y2 - 10.0;
   double v3 = y3 - 10.0;
   double v4 = y4 - 10.0;  
   
   double a1 = (((ind_In1[1]-ind_In1[6])/Point())/6);
   double a2 = (((ind_In1[1]-ind_In1[11])/Point())/11);
   double a3 = (((ind_In2[1]-ind_In2[6])/Point())/6);
   double a4 = (((ind_In2[1]-ind_In2[11])/Point())/11);   
   
   double b1 = (((ind_In1[1]-ind_In1[11])/Point())/11);
   double b2 = (((ind_In2[1]-ind_In1[11])/Point())/11);
   double b3 = (((ind_In1[1]-ind_In2[11])/Point())/11);
   double b4 = (((ind_In2[1]-ind_In2[11])/Point())/11);
   
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4   +   v1 * b1 + v2 * b2 + v3 * b3 + v4 * b4);
  }

2 perceptronа 4 angle SL TP y 2 perceptronа 4 angle

double perceptron1() 
  {
   double w1 = x1 - 10.0;
   double w2 = x2 - 10.0;
   double w3 = x3 - 10.0;
   double w4 = x4 - 10.0;
   
   double a1 = (((ind_In1[1]-ind_In1[6])/Point())/6);
   double a2 = (((ind_In1[1]-ind_In1[11])/Point())/11);
   double a3 = (((ind_In2[1]-ind_In2[6])/Point())/6);
   double a4 = (((ind_In2[1]-ind_In2[11])/Point())/11);   
   
   return (w1 * a1 + w2 * a2 + w3 * a3 + w4 * a4);
  }

double perceptron2() 
  {
   double v1 = y1 - 10.0;
   double v2 = y2 - 10.0;
   double v3 = y3 - 10.0;
   double v4 = y4 - 10.0;  
   
   double b1 = (((ind_In1[1]-ind_In1[11])/Point())/11);
   double b2 = (((ind_In2[1]-ind_In1[11])/Point())/11);
   double b3 = (((ind_In1[1]-ind_In2[11])/Point())/11);
   double b4 = (((ind_In2[1]-ind_In2[11])/Point())/11);
   
   return (v1 * b1 + v2 * b2 + v3 * b3 + v4 * b4);
  }

 Código de activación de la entrada:

1 perceptron 4 angle SL TP y 1 perceptron 4 angle

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()<-Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment)==0) && (ind_In1[1]>ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenSell(symbolS1.Name(), LotsXSell, TakeProfit, StopLoss, EAComment);
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()>Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment)==0) && (ind_In1[1]<ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenBuy(symbolS1.Name(), LotsXBuy, TakeProfit, StopLoss, EAComment);
}

1 perceptron 8 angle SL TP y 1 perceptron 8 angle

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()<-Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment)==0) && (ind_In1[1]>ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenSell(symbolS1.Name(), LotsXSell, TakeProfit, StopLoss, EAComment);
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()>Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment)==0) && (ind_In1[1]<ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenBuy(symbolS1.Name(), LotsXBuy, TakeProfit, StopLoss, EAComment);
}

2 perceptronа 4 angle SL TP y 2 perceptronа 4 angle

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()<-Param) && (perceptron2()<-Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment)==0) && (ind_In1[1]>ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenSell(symbolS1.Name(), LotsXSell, TakeProfit, StopLoss, EAComment);
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()>Param) && (perceptron2()>Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment)==0) && (ind_In1[1]<ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenBuy(symbolS1.Name(), LotsXBuy, TakeProfit, StopLoss, EAComment);
}

 Configuración de la optimización:

1 perceptron 4 angle SL TP y 1 perceptron 4 angle

Configuración de la optimización 1

1 perceptron 8 angle SL TP y 1 perceptron 8 angle

Configuración de la optimización

2 perceptronа 4 angle SL TP y 2 perceptronа 4 angle

Configuración de la optimización


3.1 Asesor 1 perceptron 4 angle SL TP

Esta modificación del asesor usa para salir Stop Loss y Take Profit. Estrategia 1 perceptrón y 4 ángulos de inclinación de los indicadores  TEMA. Realizamos la optimización 10 veces. Los esquemas de los ángulos de inclinación y los principios de optimización se pueden encontrar en el primer artículo, no nos repetiremos aquí.

Resultado de la optimización:

Resultado de la optimización


Resultado de la optimización

El resultado del criterio complejo se sitúa en el nivel del 99.99. El factor de beneficio en un alto nivel de 4-8.

 A continuación, exportaremos el resultado a Excel Dejaremos los primeros 100 mejores resultados y borraremos todo lo demás. Luego eliminaremos todas las columnas excepto x1, x2, x3, x4 y Param.  Guardamos el archivo en CSV (separadores - comas). Hemos nombrado el archivo EURUSD para mayor claridad. Podemos cargar este formato en el código del asesor como una matriz de texto.  Debería quedar como se muestra en la imagen de abajo.

Resultado de la optimización

A continuación, insertaremos nuestro archivo en el código a través del menú del MetaEditor.

Resultado de la optimización

Obtendremos un array de texto con resultados de optimización listos para usar.

string EURUSD[][6]=
  {
   {"19","1","3","6","1100"},
   {"20","1","4","6","1000"},
   {"20","0","4","4","1200"},
   {"19","0","6","4","1100"},
   {"19","1","5","4","1100"},
   {"17","0","7","4","1100"},
   {"19","1","3","8","1000"},
   {"20","0","4","3","1300"},
   {"17","0","7","0","1400"}
  };

Luego copilaremos y realizaremos pruebas forward. 

Prueba forward

Los resultados son buenos. Vemos un ascenso constante durante todo el año.


3.2 Asesor 1 perceptron 4 angle

Esta modificación del asesor no utilizará Stop Loss y Take Profit. Se utilizará el cierre por llamada inversa del perceptrón.

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()<-Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment)==0) && (ind_In1[1]>ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenSell(symbolS1.Name(), LotsXSell, 0, 0, EAComment);
}

if ((perceptron1()>0) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment)>0)){
ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL);
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if ((perceptron1()>Param) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment)==0) && (ind_In1[1]<ind_In2[1]) && (SpreadS1<=MaxSpread)){
  OpenBuy(symbolS1.Name(), LotsXBuy, 0, 0, EAComment);
}

if ((perceptron1()<0) && (CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment)>0)){
ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY);
}

Resultado de la optimización:

Resultado de la optimización


Resultado de la optimización

El resultado del criterio complejo es algo menor que en el caso anterior. El factor de beneficio está en el nivel de 2-2.5.

Resultado de la prueba forward:

Resultado de la prueba forward

La línea de balance repite el resultado anterior con reducciones más profundas.


3.3 Asesor 1 perceptron 8 angle SL TP

Esta modificación del asesor usa para salir  Stop Loss y Take Profit. Estrategia 1 perceptrón y 8 ángulos de inclinación de indicadores TEMA.

Para este asesor, deberemos preparar un archivo Excel como se muestra en la siguiente figura. Aquí optimizaremos 9 parámetros x1, x2, x3, x4, y1, y2, y3, y4 y Param.

Resultado de la optimización

Resultado de la optimización:

Resultado de la optimización


Resultado de la optimización

El resultado del criterio complejo es alto. El factor de beneficio se encuentra en el nivel de 2.5-3.

Resultado de la prueba forward:

Resultado de la prueba forward

La línea de balance no es muy estable. Se dan grandes reducciones, pero el resultado es positivo.


3.4 Asesor 1 perceptron 8 angle

No utilizamos Stop Loss ni Take Profit . El cierre se realiza con la señal inversa del perceptrón. Estrategia 1 perceptrón y 8 ángulos de inclinación de los indicadores TEMA.

Resultado de la optimización:

Resultado de la optimización


Resultado de la optimización

El resultado del criterio complejo es alto. El factor de beneficio se encuentra en el nivel de 2.5-3.

Resultado de la prueba forward:

Resultado de la prueba forward

La línea de balance es estable. Podemos ver un buen aumento en el depósito durante todo el año. Las reducciones no son tan profundas.


3.5 Asesor 2 perceptron 8 angle SL TP

Se utilizan StopLoss y TakeProfit. Estrategia 2 perceptrones, 4 ángulos de inclinación en el primero y 4 ángulos de inclinación en el segundo, que son diferentes.

Resultado de la optimización:

Resultado de la optimización


Resultado de la optimización

El resultado del criterio complejo se encuentra en el nivel de 99.99. El factor de beneficio de los resultados es casi el mismo, 4.3.

Resultado de la prueba forward:

Resultado de la prueba forward

Línea de balance en forma de sierra. Beneficio durante todo el año.


3.6 Asesor 2 perceptron 8 angle

Sin StopLoss y TakeProfit. Estrategia 2 perceptrones, 4 ángulos de inclinación en el primero y 4 ángulos de inclinación en el segundo, que son diferentes. Cierre según la señal inversa del perceptrón.

Resultado de la optimización:

Resultado de la optimización


Resultado de la optimización

El resultado del criterio complejo se encuentra en el nivel de 99.8. El factor de beneficio de los resultados se encuentra en el rango de 2.8-3.2.

Resultado de la prueba forward:

Resultado de la prueba forward

Línea de balance en forma de línea de sierra. Beneficio durante todo el año. Hay grandes reducciones al final del año. 


4. Asesores expertos basados en la biblioteca DeepNeuralNetwork.mqh

Hoy, participan en nuestros experimentos 4 asesores expertos basados en la biblioteca DeepNeuralNetwork.mqh Angle 4-4-3 SL TP y Angle 8-4-3 SL TP, en los que se utilizará StopLoss y TakeProfit para el cierre. Además de Angle 4-4-3 y Angle 8-4-3, en los que la señal de cierre procederá de la red neuronal.  En todos  se utilizan como estrategia los ángulos de inclinación. Las cifras presentadas en la segunda parte de nuestros experimentos no se usarán hoy.

Código con StopLoss y TakeProfit:

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if ((CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment+" En_"+comm1)==0) && (yValues[1]>LL) && (SpreadS1<=MaxSpread)){
  if(CalculateSeries(Magic)<MaxSeries){
  OpenSell(symbolS1.Name(), LotsXSell, TP, SL, EAComment+" En_"+comm1);
  }
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if ((CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment+" En_"+comm1)==0) && (yValues[0]>LL) && (SpreadS1<=MaxSpread)){
  if(CalculateSeries(Magic)<MaxSeries){
  OpenBuy(symbolS1.Name(), LotsXBuy, TP, SL, EAComment+" En_"+comm1);
  }
}

Código de cierre desde la red neuronal:

//SELL++++++++++++++++++++++++++++++++++++++++++++++++
if ((CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment+" En_"+comm1)==0) && (yValues[1]>LL) && (SpreadS1<=MaxSpread)){
  ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment+" En_"+comm1);
  if(CalculateSeries(Magic)<MaxSeries){
  OpenSell(symbolS1.Name(), LotsXSell, TP, SL, EAComment+" En_"+comm1);
  }
}

//BUY++++++++++++++++++++++++++++++++++++++++++++++++
if ((CalculatePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment+" En_"+comm1)==0) && (yValues[0]>LL) && (SpreadS1<=MaxSpread)){
  ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment+" En_"+comm1);
  if(CalculateSeries(Magic)<MaxSeries){
  OpenBuy(symbolS1.Name(), LotsXBuy, TP, SL, EAComment+" En_"+comm1);
  }
}

//CLOSE ALL++++++++++++++++++++++++++++++++++++++++++
if (yValues[2]>LL){
  ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_SELL, EAComment+" En_"+comm1);
  ClosePositions(symbolS1.Name(), Magic, POSITION_TYPE_BUY, EAComment+" En_"+comm1);
}

Ahora aplicaremos un esquema más complejo. Tenemos 3 asesores expertos en cada conjunto, el primero es para realizar la optimización, mientras que el segundo se usa para convertir los resultados obtenidos en un array de texto. El tercero sirve para probar y trabajar con el array resultante.

Como recordará, al realizar la optimización, nuestro asesor crea un archivo CSV con un conjunto de pesos optimizados a lo largo de la ruta "C:\Users\your username\AppData\Roaming\MetaQuotes\Terminal\Common\Files". Luego copiaremos el archivo del informe de optimización en formato CSV en esta carpeta,

e instalaremos el asesor experto con el nombre "Angle EA 4-4-3 convert" en el gráfico de la pareja de divisas.

Asesor

Parámetros del asesor para la conversión:

  • Param – parámetro (valor) del criterio complejo por debajo del cual los resultados no se copiarán en el array. Hemos usado 80;
  • OptimizationFileName1 – archivo del informe de optimización en formato CSV;
  • OptimizationFileName2 – archivo creado por el asesor experto durante la optimización en formato CSV. Contendrá los pesos de la red neuronal;
  • OptimizationFileName3 – archivo del array que se insertará en el asesor experto en funcionamiento. Se creará automáticamente.

Podremos ver el proceso en el diario de registro.

Diario de registro

Después insertaremos el archivo obtenido en el código del asesor "Angle EA 4-4-3 trade":

string Result[][37]=
  {
   {"17293","0.8","-0.1","-0.2","1.0","0.9","0.6","0.4","1.0","0.6","-0.4","0.9","-0.5","0.1","-0.5","-0.5","0.9","-0.1","-0.8","0.4","0.0","-0.1","0.1","0.2","-0.4","-0.7","-0.6","-0.9","-0.8","-0.9","-0.7","-0.5","0.4","0.4","0.8","-0.6"},
   {"18030","0.6","0.2","-0.4","0.9","-1.0","-0.9","-0.9","0.4","-0.9","-0.8","0.4","0.9","0.2","-0.8","0.9","-0.1","-0.6","0.3","0.5","-0.4","0.7","0.6","-0.4","-0.1","0.4","-0.8","0.4","0.9","-0.2","0.0","0.4","-0.6","-0.4","-0.7","0.7"},
   {"13128","0.7","-0.3","0.5","-0.5","-0.5","-0.1","0.8","0.0","0.6","0.9","-0.2","0.8","1.0","0.7","-0.7","-0.2","0.5","0.5","-0.6","0.5","-0.9","-0.5","-0.5","0.5","-0.3","0.5","0.8","0.2","-0.5","-0.2","0.1","-0.1","-0.4","-0.7","0.1"},
   {"10688","0.3","0.0","0.2","-0.1","0.6","0.1","0.1","-0.2","-1.0","0.3","0.2","0.5","-0.8","0.7","0.4","-0.5","-0.4","-0.3","-0.3","-0.9","-0.2","0.0","0.1","0.9","0.3","-0.9","-0.2","-0.2","0.1","0.9","0.8","0.1","0.4","0.8","0.6"},
   {"8356","0.8","0.8","0.7","0.2","0.0","-0.4","0.5","-0.8","0.0","0.9","0.2","-0.1","1.0","0.6","0.2","-0.8","-0.1","-0.5","-0.3","0.0","0.7","-0.5","-0.3","0.0","0.9","-1.0","-0.2","-0.6","-0.7","-0.5","-0.8","0.5","-0.3","-0.1","0.8"},
   {"18542","-0.8","0.9","-0.1","0.5","-0.5","0.3","0.8","-0.4","0.7","0.9","0.4","0.0","-0.2","0.0","0.2","0.5","0.9","0.4","1.0","0.7","0.1","0.1","-0.4","0.0","0.9","0.2","0.0","-0.8","0.1","-0.5","0.1","-0.1","0.1","-0.1","0.6"},
   {"18381","0.7","-1.0","-0.8","0.8","-0.8","-0.4","0.9","0.7","1.0","0.7","0.8","0.5","0.1","-0.3","-0.7","-0.9","-0.2","-0.4","0.8","-0.8","0.0","0.8","-0.5","-0.3","0.2","-0.3","-0.1","0.5","-0.1","0.3","0.0","-0.7","-0.2","-0.3","0.8"},
   {"13795","0.2","0.9","0.4","0.4","0.1","-0.6","-0.6","-0.3","0.7","0.9","0.7","0.0","-0.2","-0.9","-0.8","-0.6","-0.1","-0.4","-1.0","0.7","-0.7","-0.3","0.0","-0.3","-1.0","0.8","-0.9","-0.9","0.1","-0.5","-0.3","-0.7","-0.2","-0.7","-0.8"},
   {"4376","0.9","0.7","-0.6","-0.9","1.0","0.8","0.1","-0.8","0.7","-0.8","0.2","0.1","-0.9","0.8","0.9","-0.4","0.8","0.3","0.0","-0.3","-0.4","0.7","-0.2","0.4","-0.8","-0.2","0.9","0.9","0.2","0.0","0.1","0.5","-0.8","-0.1","0.6"},
   {"14503","0.1","-0.4","-0.7","0.1","-0.1","0.5","-0.7","-0.2","-0.9","0.0","0.2","-0.7","0.3","0.7","-0.7","0.1","0.4","0.3","0.3","-0.5","-0.8","-0.8","-0.7","0.2","-0.7","-0.1","-0.8","0.0","-0.4","0.0","0.1","0.5","-0.3","0.5","0.8"},
   {"12887","0.6","-0.1","0.4","0.6","-0.9","-0.3","0.7","0.2","-0.6","-1.0","0.0","-0.6","0.5","0.3","0.8","0.0","-0.5","-1.0","-0.6","0.6","-0.6","-0.9","-0.3","0.6","0.2","-0.5","0.6","0.2","-0.5","0.3","0.3","-0.9","-0.7","-0.8","0.8"},
   {"16285","0.3","0.3","-0.9","-0.7","-0.1","0.7","-0.7","-0.7","-0.2","-0.5","-0.8","-1.0","-0.1","-0.4","-0.6","1.0","0.3","-0.8","-0.6","1.0","-0.1","0.7","-0.1","0.5","-0.6","0.9","-0.5","0.6","0.2","0.5","-0.4","0.3","-0.6","-0.7","0.7"},
   {"13692","0.8","-0.9","0.6","0.3","-0.2","-0.8","-0.4","0.3","-0.6","0.7","0.7","-0.8","0.5","0.1","-0.2","0.7","-0.7","-0.2","0.7","-0.5","0.9","0.7","0.6","0.8","-0.1","-1.0","-0.8","-0.5","-0.1","-0.9","-0.5","0.2","-0.4","0.8","0.2"},
   {"1184","-0.1","0.1","0.6","-0.2","-0.3","0.0","-0.7","0.1","-0.5","0.1","-0.6","0.0","-0.9","-0.8","0.1","0.5","0.3","-1.0","0.1","-0.8","-0.6","0.0","-0.4","-0.1","-0.7","-0.8","0.6","0.5","0.0","0.9","-0.5","0.2","0.7","0.3","0.9"},
   {"9946","0.4","-0.5","0.9","-1.0","-0.4","-0.7","0.9","0.0","-0.2","0.7","0.7","0.1","0.7","0.4","-0.9","0.1","-0.6","-0.5","0.9","0.8","0.2","-0.9","0.0","0.1","0.9","0.7","0.3","0.6","-0.4","0.8","-0.1","0.2","-0.2","-0.4","0.7"},
   {"6104","0.5","-0.9","-0.1","0.7","-0.7","0.0","0.4","0.3","0.8","-0.7","-0.1","0.1","-0.1","-0.5","-0.5","1.0","-0.1","-0.5","0.5","0.7","-0.8","-0.7","-0.7","0.8","-0.2","-0.5","0.2","-0.6","-0.2","-0.1","-0.4","-0.9","-0.6","-0.1","0.9"},
   {"995","0.9","0.6","0.7","0.1","-0.8","0.3","-0.2","0.3","0.9","-0.1","0.2","0.5","0.9","-0.7","-0.7","-0.7","0.2","0.2","0.4","-0.7","-0.4","-0.2","0.0","-0.2","0.0","0.6","-0.3","-0.6","-0.9","0.8","-0.6","-0.2","0.2","0.5","0.9"},
   {"6922","0.5","0.9","0.1","-0.8","-1.0","-0.1","0.9","0.9","-0.2","0.8","0.8","0.5","-0.3","0.8","-0.2","0.9","-0.6","0.0","0.7","-0.9","0.4","0.7","0.6","-0.1","-0.4","0.5","-0.6","-0.2","-0.5","-0.9","-0.7","-0.6","0.5","-0.6","0.7"},
   {"3676","-0.9","-0.8","-0.5","0.8","0.4","-0.8","-0.4","0.6","0.9","0.9","-0.7","0.6","0.8","-0.9","0.3","0.7","-0.7","0.5","0.8","0.9","0.1","0.5","0.8","0.1","0.9","0.9","0.4","0.3","-0.1","0.4","-0.4","0.4","-0.3","-0.6","0.9"},
   {"6245","-0.1","-0.4","-0.6","0.7","0.6","-0.6","-0.2","0.2","0.0","-0.4","0.0","0.9","-0.3","0.5","-0.2","0.7","0.4","1.0","0.7","-0.1","-0.3","-0.9","-0.5","0.9","0.8","-0.1","-0.5","-1.0","0.3","0.9","-0.4","-0.2","-0.4","-0.3","0.9"},
   {"1039","-0.4","-0.3","-0.6","-0.7","-0.6","0.5","-0.2","-0.9","0.7","0.9","-0.2","-0.6","-0.2","-0.3","0.6","0.1","-0.9","-0.8","0.9","0.3","0.6","0.8","-0.8","0.8","0.6","0.1","-0.2","-0.7","0.6","-0.2","-0.6","0.4","-0.1","-0.2","0.1"},
   {"6615","-0.4","-0.1","-0.7","0.5","-0.9","0.4","-0.9","0.4","-0.4","-0.1","0.7","-0.4","0.4","0.4","-0.8","-0.2","-0.6","-0.1","-0.5","-0.7","0.6","0.0","1.0","0.9","-0.3","0.8","0.8","-0.1","-0.2","0.9","-0.2","0.9","-0.8","-0.6","0.5"},
   {"410","-0.3","0.2","-0.2","-0.2","0.2","-0.5","0.8","0.3","-0.9","-0.9","-0.4","0.3","-0.8","-0.8","0.0","0.9","-0.2","0.0","-0.2","-0.4","-0.1","0.1","-0.4","0.7","1.0","0.1","0.5","0.3","0.1","0.7","0.4","0.0","-0.2","-1.0","-0.1"},
   {"15027","-0.3","-0.4","-0.6","0.3","-0.5","-0.6","0.9","0.5","-0.2","0.0","-0.7","0.7","0.1","0.5","-0.4","-0.4","0.4","0.7","-0.1","0.9","-0.1","0.6","0.5","-0.3","0.6","0.8","0.4","0.1","0.9","-0.5","0.7","0.6","-0.8","-0.1","0.0"},
   {"14157","0.6","-0.7","0.7","0.5","0.8","-0.1","0.9","0.8","0.8","0.7","0.6","-0.3","-0.7","-0.5","-0.2","0.2","0.0","-0.8","0.6","0.9","-0.4","0.1","0.1","0.9","0.7","-0.8","-0.6","-0.5","-0.7","0.1","-0.3","0.9","0.5","0.8","-0.7"},
   {"11367","0.2","-1.0","-0.4","-0.4","-0.3","-0.2","0.2","-0.1","-0.4","0.7","-1.0","-0.5","-0.9","-0.7","-0.4","-0.8","-0.4","0.0","0.2","0.7","-0.2","0.4","0.1","0.0","-0.1","-0.9","0.2","-0.5","-0.6","-0.6","-0.7","-0.2","-0.3","-0.1","0.9"},
   {"3892","-0.7","-0.3","0.8","0.2","-0.3","0.4","0.0","0.3","-0.2","0.7","0.6","0.6","0.7","-0.4","-0.7","0.4","-0.3","-0.8","-0.2","0.0","0.9","0.9","0.3","0.0","0.7","0.1","-0.1","0.1","-0.8","-0.4","-0.5","0.9","-0.7","-0.6","0.2"}
  };


4.1 Asesor Angle 4-4-3 SL TP

El asesor usa para la salida  Stop Loss y Take Profit. Estrategia de 4 ángulos de inclinación de los indicadores TEMA.

Resultado de la optimización:

Resultado de la optimización


Resultado de la optimización

Como podemos ver, hay muchos buenos resultados. El factor de beneficio se encuentra dentro de 1.6-5. Hay 27 valores de criterios complejos que superan el 80.

Resultado de la prueba forward:

Resultado de la prueba forward

Desafortunadamente, el asesor ha fallado en la prueba forward. Los resultados son negativos e inestables.


4.2 Asesor Angle 4-4-3

El EA utiliza una red neuronal para la salida. Estrategia de 4 ángulos de inclinación de los indicadores TEMA.

Resultado de la optimización:

Resultado de la optimización


Resultado de la optimización

Como podemos ver, solo se han obtenido 6 buenos resultados para un criterio de complejidad superior al 80. El factor de beneficio se encuentra dentro de 1.6-1.9.

Resultado de la prueba forward:

Resultado de la prueba forward

Con el cierre de la red neuronal, el asesor ha mostrado beneficios durante todo el año. El resultado resulta más estable que usar  Stop Loss y Take Profit.


4.3 Asesor Angle 8-4-3 SL TP

El asesor usa para salir Stop Loss y Take Profit. Estrategia de 8 ángulos de inclinación de los indicadores TEMA.

Resultado de la optimización:

Resultado de la optimización


Resultado de la optimización

El factor de beneficio de los resultados es menor, si lo comparamos con la red neuronal.  4-4-3.  Los resultados del criterio complejo superiores a 80 son 13.

Resultado de la prueba forward:

Resultado de la prueba forward

El resultado esperado resulta similar al anterior usando StopLoss y TakeProfit. No se ha superado la prueba forward.


4.4 Asesor Angle 8-4-3

El asesor utiliza una red neuronal para la salida. Estrategia de 8 ángulos de inclinación de los indicadores TEMA.

Resultado de la optimización:

Resultado de la optimización


Resultado de la optimización

Los resultados del criterio complejo superiores a 80 son solo 3. El factor de beneficio se encuentra en un nivel bajo en comparación con los resultados anteriores.

Resultado de la prueba forward:

Resultado de la prueba forward

El resultado de la prueba forward no es satisfactorio. Supone una suave pérdida de depósito.


Conclusión

Como podemos ver por los resultados de las pruebas forward, ninguno de los asesores expertos basados en perceptrones ha quedado en negativo durante el año, aunque existe una cierta disminución de la rentabilidad después de 6 meses de funcionamiento. De esto deducimos que la optimización será necesaria al menos una vez cada 6 meses.

En cuanto a los asesores expertos basados en la biblioteca DeepNeuralNetwork.mqh, no todo es tan simple. Los resultados no son tan buenos como esperábamos. Quizás la propia estrategia influya y sea necesario trasladar algo más a la red neuronal.

En la mayoría de los casos, la rentabilidad se puede monitorear según el factor de beneficio de la serie optimizada. Esto nos proporciona un campo adicional para la reflexión.

Para el futuro, nos gustaría destacar  2 tareas Comprobar los mejores resultados obtenidos con otras parejas de divisas y otros marcos temporales.

No hay tantas transacciones como nos gustaría, pero nadie nos prohíbe usar otras parejas de divisas y crear un portafolio basado en estos sistemas, lo cual conlleva un uso excesivo de recursos para su optimización. Pero quien no trabaja, no come.

Para cualquier pregunta, puede contactar con el autor en el foro o por mensajes privados. Siempre estaré feliz de ayudarle.



Traducción del ruso hecha por MetaQuotes Ltd.
Artículo original: https://www.mql5.com/ru/articles/11949

Archivos adjuntos |
EA.zip (1056.16 KB)
Cómo construir un EA que opere automáticamente (Parte 12): Automatización (IV) Cómo construir un EA que opere automáticamente (Parte 12): Automatización (IV)
Si crees que los sistemas automatizados son sencillos, eso indica que aún no has entendido del todo lo necesario para crearlos. En este texto, hablaremos de un problema al que se enfrentan muchos Expert Advisors: la ejecución indiscriminada de órdenes, y de una posible solución a este problema.
Cómo construir un EA que opere automáticamente (Parte 11): Automatización (III) Cómo construir un EA que opere automáticamente (Parte 11): Automatización (III)
Un sistema automatizado sin seguridad no tendrá éxito. Sin embargo, la seguridad no se consigue sin entender bien algunas cosas. En este artículo, comprenderemos por qué es tan difícil lograr la máxima seguridad en los sistemas automatizados.
Algoritmos de optimización de la población: Optimización de malas hierbas invasoras (IWO) Algoritmos de optimización de la población: Optimización de malas hierbas invasoras (IWO)
La asombrosa capacidad de las malas hierbas para sobrevivir en una gran variedad de condiciones inspiró la idea de un potente algoritmo de optimización. El IWO es uno de los mejores entre los analizados anteriormente.
Cómo construir un EA que opere automáticamente (Parte 10): Automatización (II) Cómo construir un EA que opere automáticamente (Parte 10): Automatización (II)
La automatización no significa nada si no se puede controlar el horario. Ningún trabajador puede ser eficiente trabajando 24 horas al día. Sin embargo, muchos creen que un sistema automatizado debe trabajar 24 horas al día. Siempre es bueno tener formas de configurar una franja horaria para el Expert Advisor. En este artículo, vamos a discutir cómo agregar correctamente tal franja horaria.