El Tester de Estrategias de MetaTrader 5 permite obtener parámetros estadísticos de un sistema de trading tras cada pase de prueba.
Estos parámetros se pueden obtener utilizando la función TesterStatistics(), que se llama dentro de las funciones OnTester() y OnDeinit().
Con la introducción de funciones para trabajar con resultados de optimización (FrameFirst(), FrameFilter(), FrameNext(), FrameInputs() y FrameAdd()), ahora los traders pueden realizar optimizaciones visuales. Los datos necesarios pueden ser procesados y mostrados en tiempo real durante la optimización de un Asesor Experto o en la solución de problemas matemáticos.
En este artículo, analizaremos en detalle un ejemplo de visualización de los resultados de pruebas de un Asesor Experto durante la optimización, como se describe en el artículo "Visualiza una Estrategia en el Tester de MetaTrader 5".
1. Visualización de la Dinámica del Balance durante la Optimización
1.1. Descargando Archivos
El Asesor Experto Moving Averages_With_Frames.mq5 debe ser copiado en el directorio terminal_data_folder\MQL5\Experts.
Los siguientes archivos son necesarios para el funcionamiento del Asesor Experto:
- FrameGenerator.mqh - Clase CFrameGenerator para mostrar resultados de optimización;
- SpecialChart.mqh - Clase CSpecialChart para dibujar varios gráficos de balance;
- SimpleTable.mqh - Clase CSimpleTable que es una tabla simple con dos columnas;
- ColorProgressBar.mqh - Clase CColorProgressBar que es una barra de progreso con dos colores.
Estos archivos deben ser copiados en el directorio terminal_data_folder\MQL5\Include.
Los programas de la Base de Código pueden descargarse automáticamente a través de la terminal MetaTrader 5 (pestaña CodeBase en la ventana "Toolbox"). Para ello, selecciona "Descargar". Todos los códigos se descargarán y se colocarán en sus carpetas.

Fig. 1. Descargando programas de CodeBase a través de la terminal MetaTrader 5
1.2. Probando el Asesor Experto
El Asesor Experto Moving Averages_With_Frames.mq5 debe ser lanzado en el Tester de Estrategias.
Configuraciones de prueba:

Fig. 2. Configuraciones de prueba de Moving Averages_With_Frames.mq5
Opciones de optimización:

Fig. 3. Parámetros de optimización de Moving Averages_With_Frames.mq5
Durante la optimización, el Asesor Experto muestra la dinámica del balance y los datos estadísticos de cada pase de optimización:

Fig. 4. Optimización de Moving Averages_With_Frames.mq5
Proceso de optimización:
1.3. Principio de Funcionamiento del Asesor Experto
El Asesor Experto Moving Averages_With_Frames.mq5 se ha creado a partir de Moving Averages.mq5, que está incluido en el paquete estándar de la terminal MetaTrader 5 (MQL5\Experts\Examples\Moving Average).
Se ha añadido el siguiente código para la visualización de resultados:
//--- conectando el código para trabajar con resultados de optimización #include <FrameGenerator.mqh> //--- generador de frames CFrameGenerator fg; //+------------------------------------------------------------------+ //| Función Tester | //+------------------------------------------------------------------+ double OnTester() { //--- inserta tu función de cálculo de criterio de optimización aquí double TesterCritetia=MathAbs(TesterStatistics(STAT_SHARPE_RATIO)*TesterStatistics(STAT_PROFIT)); TesterCritetia=TesterStatistics(STAT_PROFIT)>0?TesterCritetia:(-TesterCritetia); //--- invocando después de cada prueba y enviando el criterio de optimización como parámetro fg.OnTester(TesterCritetia); //--- return(TesterCritetia); } //+------------------------------------------------------------------+ //| Función TesterInit | //+------------------------------------------------------------------+ void OnTesterInit() { //--- preparando el gráfico para mostrar varias líneas de balance fg.OnTesterInit(3); // parámetro que establece el número de líneas de balance en el gráfico } //+------------------------------------------------------------------+ //| Función TesterPass | //+------------------------------------------------------------------+ void OnTesterPass() { //--- manejando los resultados de prueba obtenidos y mostrando gráficos fg.OnTesterPass(); } //+------------------------------------------------------------------+ //| Función TesterDeinit | //+------------------------------------------------------------------+ void OnTesterDeinit() { //--- fin de optimización fg.OnTesterDeinit(); } //+------------------------------------------------------------------+ //| Manejo de eventos de gráfico | //+------------------------------------------------------------------+ void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam) { //--- lanza la visualización de frames después de que termine la optimización al hacer clic en el encabezado fg.OnChartEvent(id,lparam,dparam,sparam,100); // 100 es una pausa en ms entre las capturas } //+------------------------------------------------------------------+
Este código puede ser utilizado de manera similar en cualquier Asesor Experto.
La clase CFrameGenerator se utiliza para trabajar con los resultados de optimización. La clase contiene los métodos para manejar los eventos del Tester de Estrategias (OnTester(), OnTesterInit(), OnTesterPass(), OnTesterDeinit()) y el método para eventos de gráfico (OnChartEvent()). Los objetos gráficos utilizados se preparan en el método OnTesterInit() de la clase CFrameGenerator.
El método OnTester() de la clase CFrameGenerator se invoca en un agente de prueba después de cada pase de prueba. Este método proporciona el cálculo de la dinámica de la curva de balance basada en los resultados de trading. El gráfico de la curva de balance es un array unidimensional, cuya longitud depende del número de operaciones realizadas.
Luego, se utiliza la función TesterStatistics() para solicitar datos estadísticos (ganancia neta, factor de ganancia, factor de recuperación, número de operaciones, número de tratos, porcentaje máximo de drawdown de fondos, valor del criterio de optimización personalizado) y se genera un frame (array de datos de pase de prueba, en nuestro caso) que se envía a la terminal (desde el agente de prueba) utilizando la función FrameAdd().
Los frames se reciben y manejan en el método OnTesterPass() de la clase CFrameGenerator. La operación de lectura de frames se realiza mediante la función FrameNext(). La solicitud de los parámetros de entrada del Asesor Experto, para los cuales se ha generado el frame, se realiza utilizando la función FrameInputs().
Después de obtener los datos, se muestran y actualizan utilizando los métodos de las clases CSimpleTable, CColorProgressBar y CSpecialChart.
Cabe destacar que la ejecución de las funciones de manejo de OnTester() se realiza en el agente de prueba después de que se ha terminado otro pase de optimización actual. Esto permite utilizar las capacidades de la Red Distribuida MQL5 para llevar a cabo cálculos matemáticos complejos. Para ello, coloca la parte de cálculo en el manejador del evento OnTester.
El ejemplo de uso de la optimización para acelerar cálculos matemáticos (transformación de wavelet continua de la función de Weierstrass) se muestra en el tema "Gestionando procesos de optimización en tiempo real y transfiriendo grandes datos de los agentes a MetaTrader 5".
2. Ejemplos de Trabajo con las Clases CSimpleTable, CColorProgressBar y CSpecialChart
Los scripts Test_SimpleTable.mq5 y Test_CSpecialChart.mq5 adjuntos contienen ejemplos de trabajo con las clases CSimpleTable, CColorProgressBar y CSpecialChart. Deben ser copiados en el directorio terminal_data_folder\MQL5\Scripts.

Fig. 5. Resultado de la operación del script Test_SimpleTable.mq5

Fig. 6. Resultado de la operación del script Test_CSpecialChart.mq5
Publicaciones relacionadas
- Crea tu Asesor Experto: Señales de Trading con Líneas de Reunión y Estocástico en MQL5
- Crea tu Asesor Experto con MQL5: Señales de Trading Basadas en Estrellas de la Mañana/Atardecer y CCI
- Cómo Crear un Asesor Experto con MQL5: Señales de Trading Basadas en Estrellas y Estocástico
- Señales de Trading con MQL5: Patrones de Estrellas y MFI
- MACD y Línea de Señal: Estrategia para MetaTrader 4