Guía de Simulación y Optimización de Asesores Expertos en MQL5

Samuel Olowoyo | 23 diciembre, 2013

Introducción

En este artículo echaremos un vistazo a los principales pasos necesarios para poner a prueba y optimizar un Asesor Experto para que sea capaz acercarse al máximo los objetivos de la creación de un Asesor Experto.


1. Identificar y Corregir Errores de Código

Empezaremos este artículo mirando a algunos errores frecuentes que normalmente se encuentran en el proceso de escritura de un código de Asesor Experto. Para la mayoría de los principiantes es difícil identificar y corregir errores de código al escribir sus códigos o al modificar un código escrito por otro creador. En esta sección veremos lo fácil que es usar el editor de MQL5 para identificar y corregir algunos de estos errores.

Acaba de terminar de escribir el código, y parece que todo debería funcionar bien porque está casi seguro de que el código está libre de errores. O es un código que escribió un tercero, y usted solo tiene que hacer algunos cambios. Y... ¡Sorpresa! Al pulsar el botón Compilar (o F7), se le presentaron una serie de errores en el código, como se muestra en la pestaña de Error de la ventana de la ToolBox (Caja de Herramientas) del MetaEditor.

Errores de compilación en un código de Expert Advisor

Figura 1. Errores de compilación en un código de Asesor Experto

¡Wow! 38 errores y 1 advertencia: es posible que su código no tenga tantos errores como se muestra aquí, pero queremos revisar los tipos de errores que surgen frecuentemente al compilar nuestro código, y cómo podemos resolverlos. Expliquemos el diagrama de arriba.

Ahora, procedamos a solucionar los errores uno a uno. Volvamos a la primera línea en la pestaña de errores para empezar desde el principio.

Identificar y solucionar errores-1

Figura 2. Identificar y solucionar errores

El primer problema se describe como: "truncation of constant value" ("truncación de valor costante"), y se descubrió en la línea 16, columna 20. Para localizar la linea exacta en nuestro código, vaya al menú Edit (Edición) del MetaEditor y seleccione Go to Line (Ir a Línea), o pulse CTRL G en su teclado.

Figura 3. Localizar el número de línea del error de código

Figura 3. Localizar el número de línea del error de código

Aparecerá un cuadro de diálogo.

Figura 4. Diálogo para localizar el número de línea del error

Figura 4. Diálogo para localizar el número de línea del error

La cifra de números mostrada en el cuadro de diálogo es el número total de líneas en el código. En este caso, (1-354) indica que nuestro código contiene 354 líneas de código.

Escriba el número de línea que desea revisar en el cuadro de diálogo y haga click en el botón OK. Ello le llevará directamente al número de línea en el código. Verá el cursor parpadeando en esa línea en particular.

Figura 5. El cursor muestra el número de línea del error

Figura 5. El cursor muestra el número de línea del error

El problema aquí es que hemos declarado un Lote como una variable entera (int), pero la hemos inicializado como un valor doble (0.1). Para corregir este error, debemos cambiar el int a double, guardar el archivo y hacer click de nuevo en el botón COMPILE para ver si el error se ha corregido.

Figura 6. Compilar y guardar el código tras hacer la corrección

Figura 6. Compilar y guardar el código tras hacer la corrección 

Al compilar de nuevo, se resolvió el primer error, pero todavía tenemos otros problemas, como se muestra abajo:

Más errores por resolver en el código

Figura 7. Tras la compilación, se muestran más errores

Ahora, seguiremos el mismo procedimiento que antes e iremos a la línea 31. Sin embargo, esta vez haremos click con el botón derecho en el error en la pestaña de Errores y seleccionaremos "Ir a línea".

Otra forma de localizar la línea del error de código

Figura 8. Otra forma de localizar la línea del error de código 

O, simplemente, seleccione el error y pulse la tecla "Enter" de su teclado. Esto le llevará inmediatamente a la línea del código número 31.

Verá el cursor del ratón parpadeando, así como un pequeño botón redondo rojo (icono de error) en esa línea de código particular, la línea 31.

Localizar la línea del error de código

Figura 9a. Localizar la línea del error de código

No obstante, si es un mensaje de advertencia como el primero en la línea 16 que ya corregimos antes, mostrará un botón triangular amarillo (icono de advertencia):

Señal de advertencia

Figura 9b. Localizar la línea del error de código

Es evidente que no tenemos ningún problema en la línea 31, pero la descripción del error dice: "'STP' - unexpected token" ("'STP' - elemento inesperado"). 

Deberemos revisar la línea de código anterior (es decir, la línea 30) para ver cuál es el problema. Si nos fijamos atentamente, el punto y coma faltan después de "double ccminb = -95.0000" en la línea 30, y es por eso que tenemos ese error en la línea 31. Corregiremos este error simplemente añadiendo manualmente el punto y coma después de -95.0000 y compilaremos el código de nuevo.

Ahora, los errores de la línea 31 han desaparecido. La siguiente es la línea 100, tal y como se muestra abajo:

Todavía quedan más errores en el código

Figura 10. Todavía quedan más errores en el código

Hey, Olowsam, ¿de verdad debemos compilar cada vez que hacemos una corrección? ¿Por qué no corregimos todas las líneas de una vez y después de todo eso compilamos el código en lugar de repetir esto con cada corrección?

¿Le ha venido a la cabeza esta pregunta?

Puede que tenga razón en cierto modo, pero yo no le recomendaría que hiciera eso. Los problemas siempre se resuelven uno a uno, paso a paso. Intentar agrupar todos los problemas y solucionarlos todos a la vez puede causarle unos cuantos dolores de cabeza. Pronto entenderá por qué... Tenga un poco de paciencia.

Volviendo a nuestro problema, ahora revisaremos la línea 100 para ver el siguiente error. El error dice: "'if' - expressions are not allowed on a global scope" ("'if' - expresiones no permitidas a nivel global"). Y estoy seguro de que la expresión en la línea 100 no tiene un alcance global, pero entonces, ¿por qué nos sale este error? Vayamos a la línea 100.

Figura 11.  Localizar el error en el código

Figura 11.  Localizar el error en el código

No podemos encontrar problema alguno en la línea 100, y puesto que acabamos de terminar una corrección en la línea 31, estamos seguros de que el problema se encuentra ahora entre las líneas 32 y 99. De modo que vayamos hacia arriba, a la línea 99 (tenemos un comentario, de modo que no puede ser el error). Si vamos más arriba, hacia las declaraciones (MqlTick, MqlTradeRequest y MqlTradeResult), vemos que están correctamente declaradas y puntuadas.

A continuación, echemos un vistazo al código de la expresión if antes de estas líneas de código de declaraciones y veamos si la expresión es correcta.  Si nos fijamos bien, descubrimos que la expresión tiene un paréntesis de cierre, pero no de apertura.

Figura 12. Mirar por encima de la línea del error de código para identificar el error

Figura 12. Mirar por encima de la línea del error de código para identificar el error

Añada el paréntesis de apertura y compile el código de nuevo.

//--- Do we have enough bars to work with
   int Mybars=Bars(_Symbol,_Period);
   if(Mybars<60) // if total bars is less than 60 bars
    {
      Alert("We have less than 60 bars, EA will now exit!!");
      return;
     }

Una vez que compilamos el código, los errores en las líneas 100, 107, 121, 126, 129, etc., desaparecen completamente, y aparecen errores nuevos. ¿Entiende ahora por qué es mejor hacer las cosas paso a paso? 

Se muestran más errores en el código

Figura 13. Todavía quedan más errores en el código

Ahora iremos a la línea 56, donde hay dos errores: "'cciVal1' - parameter conversion is not allowed" ("'cciVal1' - parámetro de conversión no permitido") y "'cciVal1' - array is required" ("'cciVal1' - array requerido").

Examinando la línea 56, se supone que cciVal1 se había declarado como array. ¿Es posible que no lo hayamos declarado como array, pero ahora lo estamos intentando usar como array? Revisemos la sección de declaraciones para confirmar esto y ver qué debemos hacer a continuación.

//--- Other parameters
int maHandle;               // handle for our Moving Average indicator
int cciHandle1,cciHandle2;  // handle for our CCI indicator
double maVal[];             // Dynamic array to hold the values of Moving Average for each bars
double cciVal1,cciVal2[];   // Dynamic array to hold the values of CCI for each bars
double p1_close,p2_close;   // Variable to store the close value of Bar 1 and Bar 2 respectively

De aquí podemos deducir que hemos declarado cciVal1 como un double en lugar de como un array dinámico por error, porque omitimos los corchetes ([]). Añadamos los corchetes (al igual que hicimos en cciVal2[]) y compilemos el código.

//--- Other parameters
int maHandle;               // handle for our Moving Average indicator
int cciHandle1,cciHandle2;  // handle for our CCI indicator
double maVal[];             // Dynamic array to hold the values of Moving Average for each bars
double cciVal1[],cciVal2[]; // Dynamic array to hold the values of CCI for each bars
double p1_close,p2_close;   // Variable to store the close value of Bar 1 and Bar 2 respectively

Los errores en el código se redujeron considerablemente

Figura 14. Los errores en el código se redujeron considerablemente

¿Cómo? Han desaparecido muchos errores. Solo hemos corregido el error señalado en la línea 56, y otros muchos errores se solucionaron automáticamente. Esto es porque el error de la línea 56 era el responsable de esos otros errores. Por esta razón es bueno solucionar los errores de su código en un proceso paso a paso.

Ahora continuaremos con el siguiente error, señalado en la línea 103"'GetLastError' - undeclared identifier" ("'GetLastError' - identificador no declarado").  Vamos a ver, se supone que GetLastError es una función... Vamos a la línea 103 para ver cuál es el problema.

//--- Get the last price quote using the MQL5 MqlTick Structure
   if(!SymbolInfoTick(_Symbol,latest_price))
     {
      Alert("Error getting the latest price quote - error:",GetLastError,"!!");    // line 103
      return     }

En realidad, el problema se encuentra en la línea 103. GetLastError es una función, y toda función necesita un par de paréntesis para introducir caracteres. Escribamos un par de paréntesis vacíos, y después compilemos el código. El par de paréntesis vacíos indica que la función no tiene argumentos ni parámetros.

//--- Get the last price quote using the MQL5 MqlTick Structure
   if(!SymbolInfoTick(_Symbol,latest_price))
     {
      Alert("Error getting the latest price quote - error:",GetLastError(),"!!");  // line 103
      return     }

A continuación, vamos a la línea 159"'=' - l-value required" ("'=' - l-valor requerido") y  una advertencia:  "expression is not Boolean" ("expresión no Booleana"). Vayamos a la línea 159 y veamos qué quiere decir esto. 

 else if(PositionGetInteger(POSITION_TYPE) = POSITION_TYPE_SELL) // line 159
       { 
            Sell_opened = true; // It is a Sell

Se puede observar que hemos asignado el valor de POSITION_TYPE_SELL a  PositionGetInteger(POSITION_TYPE) en la declaración, y esto no es lo que pretendíamos hacer. Queríamos hacer una comparación. Ahora, cambiaremos la expresión para usar un operador equitativo en lugar de un operador de asignación. (es decir,‘==’ en lugar de ‘=’). Haga la corrección y compile el código.

else if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL) // line 159
       { 
            Sell_opened = true; // It is a Sell 

¡Bien! Ahora solo nos queda uno. Vayamos a la línea 292 para ver por qué dice "'PositionsTotal' - undeclared identifier" ("'PositionsTotal' - identificador no declarado"). Un momento, ¿recuerda que ya hemos visto un error como este antes? ‘GetlastError’ en la línea 103. Probablemente también nos olvidamos de añadir los de paréntesis para PositionsTotal, puesto que es una función. Vayamos a la línea 292 para confirmarlo.

bool CheckTrade(string otyp)
{
   bool marker = false;
   for (int i=1; i<=PositionsTotal;i++)  // line 292
   {

Tal y como sospechábamos, el error se dio porque nos olvidamos de añadir los de paréntesis para la función PositionsTotal. De modo que añada los paréntesis (PositionsTotal()) y compile el código. También me permito añadir que es posible encontrarnos con este error si usamos una variable que no hemos declarado en ningún momento en el código.

Figura 15. Todos los errores de compilación se han solucionado completamente

Figura 15. Todos los errores de compilación se han solucionado completamente

¡Genial! Hemos conseguido corregir todos los errores de compilación. Ahora es el momento de eliminar errores de programación (bugs) de nuestro código y ver si hay problemas de ejecución. Aquí no entraremos en detalles sobre cómo hacer un proceso de depuración en nuestro código, puesto que ya se ha explicado en este artículo.

Al comenzar con la sesión de depuración (debugging), nos encontramos con otro error:

Figura 16. Error de ejecución observado durante el debugging del código

Figura 16. Error de ejecución observado durante el debugging del código

Haga click en el botón OK y llegará a la línea del código que genera el error.

Identificar la línea de código que genera el error de ejecución

Figura 17. Identificar la línea de código que genera el error de ejecución

El error se ha generado en la línea 172 de este código, como puede ver en la figura mostrada arriba. Puesto que el problema es un error de "Array out of range" ("Array fuera de alcance"), significa que el valor que pretendíamos obtener del array está fuera del alcance de los valores del array disponibles. De modo que iremos a la línea donde copiamos los buffers del indicador en arrays para ver cuál es el problema.

//--- Copy the new values of our indicators to buffers (arrays) using the handle
   if(CopyBuffer(maHandle,0,0,3,maVal)<0)
     {
      Alert("Error copying MA indicator Buffers - error:",GetLastError(),"!!");
      return;
     }
   if(CopyBuffer(cciHandle1,0,0,3,cciVal1)<0 || CopyBuffer(cciHandle2,0,0,3,cciVal2)<0)
     {
      Alert("Error copying CCI indicator buffer - error:",GetLastError());
      return;
     }

Podemos observar en las funciones CopyBuffer que solo hemos copiado tres valores (Barra 0, 1, y 2), lo que significa que solo podemos acceder a valores de array de maVal[0],  maVal[1],  y maVal[2], y también cciVal1[0] , cciVal1[1]  y cciVal1[2], etc. Pero en nuestro código, en la línea 172, estábamos intentando obtener el valor de array para cciVal1[3]. Por eso se generó el error. Detenga el proceso de depuración para poder arreglar este error:

Figura 18. Detener el proceso de debugging para corregir el error en el código

Figura 18. Detener el proceso de debugging para corregir el error en el código

Para arreglar esto, debemos aumentar el número de datos copiados de los buffers del indicador a 5 para poder obtener valores de array de cciVal1[0], cciVal1[1], cciVal1[2], cciVal1[3], y cciVal1[4] si es necesario.

//--- Copy the new values of our indicators to buffers (arrays) using the handle
   if(CopyBuffer(maHandle,0,0,5,maVal)<0)
     {
      Alert("Error copying MA indicator Buffers - error:",GetLastError(),"!!");
      return;
     }
   if(CopyBuffer(cciHandle1,0,0,5,cciVal1)<0 || CopyBuffer(cciHandle2,0,0,5,cciVal2)<0)
     {
      Alert("Error copying CCI indicator buffer - error:",GetLastError());
      return;
     }

Corrija el código como se muestra arriba, y comience con la depuración de nuevo. Esta vez, no hay errores durante la ejecución de acciones de trading por el Asesor Experto.

Figura 19. Se corrigieron todos los errores, y el Expert Advisor realiza operaciones de trading durante el proceso de debugging

Figura 19. Se corrigieron todos los errores, y el Asesor Experto realiza operaciones de trading durante el proceso de debugging

 

2. Simulación del Asesor Experto

Una vez que estamos seguros de que nuestro código está libre de errores, es el momento de poner a prueba el Asesor Experto para poder obtener la configuración que nos dará los mejores resultados. Para realizar la simulación, usaremos el Probador de Estrategias, un programa incluido en el terminal de  MetaTrader. Para ejecutar el Probador de Estrategias, vaya al menú View (Ver) en el terminal y seleccione Strategy Tester (Probador de Estrategias).

Figura 20. Ejecutar el Probador de Estrategias

Figura 20. Ejecutar el Probador de Estrategias

2.1. Simulación Preliminar de nuestro Asesor Experto

En este momento, queremos poner a prueba nuestro Asesor Experto usando los símbolos disponibles en la Ventana de Mercado (Market Window). Con este resultado, podremos aventurar para qué pares de divisas podremos optimizar mejor nuestro Asesor Experto. Asegúrese de que la Ventana de Mercado contiene la mayoría de las divisas que tiene como objetivo para su Asesor Experto.

Seleccione el Asesor Experto en la pestaña Settings (Configuración) del Probador de Estrategias, seleccione el tiempo/intervalo que tiene en mente (y, por supuesto, también puede hacer pruebas para diferentes intervalos), y después seleccione 'All Symbols Selected in MARKET Watch' ('Todos los símbolos seleccionados en Observación del mercado') en el campo de optimización. Directamente enfrente se encuentra el parámetro de resultados de optimización; seleccione Balance + max Profit Factor.

Figura 34. Simulación Preliminar del Expert Advisor con todos los símbolos en la ventana de Observación del mercado

Figura 21. Simulación Preliminar del Asesor Experto con todos los símbolos en la ventana de Observación del mercado 

1. Seleccione el modo de generación de tick –(Every Tick - Todos los Ticks)

2. Seleccione el Tipo de Optimización –(Todos los símbolos seleccionados en "Observación del mercado")

3. Seleccione el tipo de Resultado esperado de la optimización

Puede obtener los detalles de los diferentes tipos de optimización de la documentación de ayuda del terminal. No estamos realizando una simulación de "forward testing", de modo que deje la opción Forward como No.

Para esta simulación, se usarán los principales valores/parámetros (destacados en verde) en la pestaña Inputs (Entradas).

Figura 35. Parámetros de entrada de simulación preliminar

Figura 22. Parámetros de entrada de simulación preliminar

Una vez que ha terminado, vaya al a pestaña de Configuración y haga click en el botón Start (Inicio). Al completar la simulación, verá un mensaje en la pestaña Journal (Diario) similar al siguiente:

Figura 36. Simulación preliminar completada

Figura 23. Simulación preliminar completada

Una vez que la simulación ha acabado, vaya a la pestaña de Optimization Results (Resultados de Optimización) para ver los resultados.

Figura 37. Resultados de la simulación de optimización preliminar

Figura 24. Resultados de la simulación de optimización preliminar

Nosotros estamos interesados en el símbolo que da el resultado más alto basado en nuestra configuración – (Balance + max Profit Factor). Para obtener esto, organicemos el resultado haciendo click en el título Result (Resultado) para que el símbolo con el resultado más alto se sitúe en primer lugar.

Figura 38. Análisis de los resultados de la optimización preliminar

Figura 25. Análisis de los resultados de la optimización preliminar

Para este resultado, podemos ver que nuestro Asesor Experto puede ser rentable para los siguientes símbolos (EURUSD, EURJPY, AUDUSD) en el intervalo que hemos seleccionado.  Puede realizar otra simulación para otro intervalo de, por ejemplo, 30 minutos, y ver qué resultados obtiene. Esto se debería considerar una tarea y, por favor, comparta el resultado para que todos podamos aprender de ella.

Con el resultado de nuestra simulación preliminar, ahora decidiremos para qué símbolo(s) e intervalo(s) optimizaremos nuestro Asesor Experto.

En este ejemplo, optimizaremos nuestro Asesor Experto para EURUSD y el intervalo 1 Hora. ¿Qué nos motiva a tomar esta decisión?

El factor de Beneficio es la proporción entre el beneficio total y las pérdidas totales para esa simulación. Cuanto más alto sea el factor de Beneficio, más rentable será su estrategia de trading.

Esto se refiere a la reducción relativa de los beneficios, o de la mayor pérdida (en porcentaje) del máximo valor de beneficios. Cuando más baja sea la Reducción (en porcentaje), mejor será la estrategia.

Esta es la proporción entre el beneficio y la reducción máxima. Refleja el riesgo de la estrategia de trading.

Tras decidirnos en el símbolo e intervalo a usar, es el momento de optimizar nuestro Asesor Experto.

2.2. Optimización del Asesor Experto

La optimización es simplemente un proceso de puesta a punto del rendimiento de nuestro EA con varios factores (parámetros) que determina la efectividad o rentabilidad de nuestra estrategia codificada en el EA. Es un procedimiento similar a la simulación, pero en lugar de realizarse solo una simulación del EA, la prueba se repite varias veces dependiendo de los parámetros seleccionados en la pestaña de Entrada.

Para empezar, iremos a la pestaña de configuración y activaremos la optimización, y después seleccionaremos el tipo de resultados que deseamos de la optimización.

Figura 39. Configuración de la optimización para el Expert Advisor

Figure 26. Configuración de la optimización para el Asesor Experto

1. Seleccione el modo de generación de tick –(Todos los Ticks)

2. Seleccione el tipo de optimización –(Fast Genetic Based Algorithm - Algoritmo rápido basado en genética)

3. Seleccione el tipo de resultado esperado de la optimización (aquí seleccionamos Balance + max Profit Factor)

Puede obtener los detalles de los diferentes tipos de optimización de la documentación de ayuda del terminal. No estamos realizando una simulación en "forward testing", de modo que deje la opción Forward como No. Tras configurar las propiedades de la optimización, establezcamos los parámetros a usar para la optimización en la pestaña Entradas.

Figura 40. Parámetros de entrada de optimización

Figure 27. Parámetros de entrada de optimización

Puesto que estamos optimizando, solo nos concentraremos en las áreas destacadas en amarillo. En primer lugar, cualquier parámetro que no deseemos usar en la optimización se debe deseleccionar. En otras palabras, solo seleccionaremos los parámetros que queremos usar en la optimización del EA. Aquí, yo he seleccionado cinco parámetros, pero usted puede decidir seleccionar solo uno o dos, dependiendo de los parámetros en los que se base la efectividad de su estrategia. Por ejemplo, puede seleccionar solo la Media Móvil y los períodos CCI para que los resultados de la optimización le hagan saber los mejores valores para cada uno de los indicadores que dan a su EA el mejor rendimiento. Esta es la esencia de la optimización.

Asimismo, el número de parámetros seleccionados determinará el número total de pruebas que pasará su EA. Pronto verá a qué me estoy refiriendo.

Configurando los Valores

Start - Inicio:

Este es el valor inicial a usar para la variable seleccionada para la optimización. Utilicemos la variable Stop Loss para explicar cómo configurar los valores. Para el Stop Loss, hemos pedido al Probador que empiece con un valor de 30. Este será el valor mínimo que se usará para el Stop Loss durante la optimización.

Step - Paso:

Este es el valor incremental para el Stop Loss. Si configuramos un incremento de 2, significa que, si en la primera prueba usa 30 para el Stop Loss, usará uno de los siguientes: 32, 36, 34 etc. No significa que usará 30, y después 32, 34 etc. No, selecciona los valores al azar, pero siempre serán múltiplos de dos (2) entre los valores de Inicio y Stop.

Stop:

Este es el valor máximo que se utilizará para la optimización. Aquí, especificamos 38. Esto significa que los valores que se usarán para la prueba estarán entre 30 y 38, pero serán valores múltiplos de 2. No usará 40 o cualquier otro valor superior.

El número total de pruebas que se llevarán a cabo dependerá de la configuración de estas secciones. En nuestro ejemplo, el probador combinará un total de 5 posibilidades solo para el Stop Loss, como se muestra en la columna Pasos en la pestaña Inputs. Combinará un total de 8 posibilidades para el Take Profit, etc. Para cuando haya considerado el resto de las variables, obtendrá cientos o miles de posibilidades (pruebas/aprobados). Si no desea esperar durante horas para optimizar un solo EA, asegúrese de que no incluye o simula demasiadas variables; a lo mejor, solo dos o tres de las que su EA realmente dependa (especialmente, los períodos del indicador, si los usa en su propio código). Asimismo, debe asegurarse de que su valor de paso no dará como resultado demasiadas posibilidades (pruebas). Por ejemplo, si usamos 1 como el valor de paso, entonces incrementaremos el número de intentos solo para el Stop Loss a 10. Bien, como hemos dicho antes, el tiempo total requerido para completar una optimización depende del número total de agentes disponibles que ha configurado en su sistema.

Creo que la explicación es suficiente.

Una vez que hemos acabado de configurar las entradas, volvemos a la pestaña de Configuración y hacemos click en el botón Inicio.

Cuando la optimización se haya completado, podremos ver los detalles en la pestaña del diario.

Figura 43. Optimización completada, como se muestra en la pestaña "Diario"

Figure 28. Optimización completada, como se muestra en la pestaña "Diario"

Para ver los resultados cuando cada prueba se completa o tiene éxito, debemos ir a la pestaña de Resultados de Optimización. Siempre es bueno organizar la información según los Resultados para identificar fácilmente la configuración que nos da los mejores resultados basándonos en nuestra configuración de optimización. Haciendo click en Resultado dentro de la pestaña de Resultados de Optimización, organizaremos los resultados en orden ascendente o descendente.

Figura 44. Informe de optimización

Figura 29. Informe de optimización

Vaya a la pestaña de Optimization Graph (Gráfico de Optimización) para ver el aspecto del gráfico.

Figura 45. Gráfico de optimización

Figura 30. Gráfico de optimización

¿No entiende lo que ve? No se preocupe; los puntos que ve son una representación del número de pruebas que su EA aprobó en contraste con el resultado de la optimización basado en el tipo de resultados de optimización que usted seleccionó. En nuestro caso, seleccionaremos Balance + max Profit Factor.

2.3. Interpretar el resultado

Para interpretar el resultado de la optimización con éxito, vaya a la pestaña de Resultados de Optimización. Descubrirá que no puede ver algunos campos como Profit Factor (factor de beneficio), Expected Payoff (pago esperado), Drawdown % (porcentaje de reducción), etc. Para verlos, haga click con el botón derecho del ratón en cualquier parte de la pestaña Resultados de Optimización y seleccione la información adicional que desea ver, tal y como se muestra abajo:

Figura 46. Seleccionar Porcentaje de Reducción en resultados de optimización

Figure 31. Seleccionar Porcentaje de Reducción en resultados de optimización

 Figura 47. Seleccionar Factor de Beneficio en resultados de optimización

Figura 32. Seleccionar Factor de Beneficio en resultados de optimización

Tras añadir esta información adicional, analizaremos el resultado de la optimización para decidir la mejor configuración para nuestro Asesor Experto.

Análisis de informe de optimización

Figura 33. Analizar el resultado de la optimización

En la figura de arriba, las secciones destacadas con las etiquetas A y B indican los mejores resultados para nuestro Asesor Experto.  Ahora, la decisión es únicamente suya: todo depende de lo que usted desee conseguir. No obstante, aquí estamos interesados no solo en la configuración que aporte la mayor rentabilidad, sino también que tenga un Porcentaje de Reducción más bajo.

Como puede ver, la sección A (destacada en amarillo) tiene el mejor resultado (Balance + max Profit Factor) de 22381.71 con un beneficio de 924.10, mientras que la sección B (destacada en verde) tiene el segundo mejor resultado de 22159.25 pero con un beneficio mayor de 936.55. La sección A tiene un Porcentaje de Reducción más bajo, de 1.78, mientras que B tiene una reducción más alta, de 1.95.

El Probador de Estrategias guarda los resultados de la optimización en la carpeta "<Client terminal data folder>\Tester\cache". En su caso, todos los datos de la optimización se guardarán en el archivo cci_ma_ea.EURUSD.H1.0.xml.

El nombre del archivo tiene la siguiente forma: ExpertName.SYMBOL.PERIOD.GenerationMode.xml, en la que:

Los archivos XML se pueden abrir con MS Excel.

2.4. Elegir el mejor resultado

Finalmente, para obtener el mejor resultado, debemos mirar el gráfico de optimización de nuevo. Vuelva al gráfico de optimización. Haga click con el botón derecho del ratón en cualquier parte del gráfico y seleccione Gráfico 1D.

Seleccionar el gráfico 1-D del gráfico de optimización

Figura 34. Seleccionar el gráfico monodimensional (1 D) para análisis de resultados

Con esto podemos ver fácilmente los valores de cada uno de los parámetros de entrada que dan los mejores resultados.  Ahora puede comenzar a elegir cada parámetro para poder ver el mejor valor. Haga click con el botón derecho del ratón en el gráfico y seleccione X-Axis (eje X), y después seleccione el parámetro que desea revisar. Tendrá el siguiente aspecto (para Stop loss)

Figura 50. Obtener el mejor valor de StopLoss del resultado de la optimización

Figura 35. Obtener el mejor valor de StopLoss del resultado de la optimización

En realidad, al ver el resultado de la optimización, está claro que el mejor StopLoss es 34, el mejor TakeProfit es 78, y el mejor CCI_Period1 es 62. Para obtener los mejores valores para el MAPeriod u el CCI_Period2, seleccione cada uno de ellos como se ve arriba.

Figura 51. Obtener el mejor valor de período de Media Móvil del resultado de la optimización

Figura 36. Obtener el mejor valor de período de Media Móvil del resultado de la optimización

Este gráfico muestra un valor de 26 como el MA_Period con el mejor resultado.

Figura 52. Obtener el mejor valor CCI_Period1 del resultado de la optimización

Figura 37. Obtener el mejor valor CCI_Period1 del resultado de la optimización

Este gráfico muestra un valor de 62 como el CCI_Period1 con el mejor resultado.

Figura 53. Obtener el mejor valor CCI_Period2 del resultado de la optimización

Figura 38. Obtener el mejor valor CCI_Period2 del resultado de la optimización

Este gráfico muestra valores de 28 or 30 como el CCI_Period2 con los mejores resultados.

Tras obtener los mejores valores para cada parámetro, es el momento de la simulación final de nuestro Asesor Experto.

2.5. La simulación final

La simulación final implica poner en común los mejores parámetros para la simulación del Asesor Experto. En este caso, usaremos los mejores valores descubiertos en la sección INPUT del Probador de Estrategias, tal y como se muestra abajo.

Valores de entrada para la simulación final

Figura 39. Los parámetros de entrada finales para la simulación

En la pestaña CONFIGURACIÓN del Probador de Estrategias, desactivaremos la optimización, tal y como se muestra abajo.

La configuración para la simulación final

Figura 40. La configuración de simulación final

Ahora haremos click en el botón INICIO para comenzar con la simulación. Una vez que la simulación se haya completado, tendremos los resultados en la pestaña RESULTADOS, tal y como se muestra abajo.

Figura 56. Los resultados de la simulación final

Figura 41. Los resultados de la simulación final

E igualmente, tendremos el gráfico de la simulación en la pestaña GRAPH (GRÁFICO).

Figura 57 El gráfico de resultados final

Figura 42. El gráfico de resultados final

Conclusión

En este artículo hemos tratado las formas de identificar y corregir errores de código, y hemos tratado también la cuestión de cómo poner a prueba y optimizar el Asesor Experto para obtener el mejor símbolo de la observación del mercado.

Creo que revisar el código para descubrir errores usando el editor y optimizar y hacer una simulación en el Asesor Experto usando el Probador de Estrategias hace posible escribir un Asesor Experto mejor y más rentable.