Modos de funcionamiento del terminal y del programa

El entorno MetaTrader 5 ofrece una solución a diversas tareas en la intersección entre trading y programación, lo que requiere varios modos de funcionamiento tanto del propio terminal como de un programa específico.

Utilizando la API de MQL5 puede distinguir entre la actividad en línea regular y el backtesting (simulación en el pasado); entre la depuración del código fuente (con el fin de identificar posibles errores) y el análisis de rendimiento (búsqueda de cuellos de botella en el código), así como entre una copia local del terminal y la de la nube (MetaTrader VPS).

Los modos se describen mediante banderas, cada una de las cuales contiene un valor de tipo booleano: true o false.

Identificador

Descripción

MQL_DEBUG

El programa se ejecuta en modo depuración.

MQL_PROFILER

El programa funciona en modo de perfilaje de código.

MQL_TESTER

El programa funciona en el probador.

MQL_FORWARD

El programa se ejecuta en el proceso de simulación en el futuro (forward testing).

MQL_OPTIMIZATION

El programa se está ejecutando en el proceso de optimización.

MQL_VISUAL_MODE

El programa se ejecuta en modo de prueba visual.

MQL_FRAME_MODE

El Asesor Experto se ejecuta en el gráfico en el modo de recopilación de marcos de resultados de optimización.

TERMINAL_VPS

El terminal funciona en un servidor virtual MetaTrader Virtual Hosting (MetaTrader VPS)

Las banderas MQL_FORWARD, MQL_OPTIMIZATION y MQL_VISUAL_MODE implican la presencia de la bandera MQL_TESTER activada.

Algunas combinaciones de banderas son mutuamente excluyentes, es decir, no pueden activarse al mismo tiempo.

En concreto, la presencia de MQL_FRAME_MODE excluye MQL_TESTER, y viceversa. MQL_OPTIMIZATION excluye MQL_VISUAL_MODE, y MQL_PROFILER excluye MQL_DEBUG.

Estudiaremos todas las banderas relacionadas con las pruebas (MQL_TESTER, MQL_VISUAL_MODE) en las secciones dedicadas a los Asesores Expertos y, en parte, a los indicadores. Todo lo relacionado con la optimización del Asesor Experto (MQL_OPTIMIZATION, MQL_FORWARD, MQL_FRAME_MODE) se abordará en una sección por separado.

Ahora vamos a familiarizarnos con los principios de la lectura de banderas usando el ejemplo de los modos de depuración (MQL_DEBUG) y perfilado (MQL_PROFILER). Al mismo tiempo, recordaremos cómo se activan estos modos desde MetaEditor (para obtener más detalles, véase la documentación, en las secciones Depuración y Perfilaje).

Utilizaremos el script EnvMode.mq5.

void OnStart()
{
   PRTF(MQLInfoInteger(MQL_TESTER));
   PRTF(MQLInfoInteger(MQL_DEBUG));
   PRTF(MQLInfoInteger(MQL_PROFILER));
   PRTF(MQLInfoInteger(MQL_VISUAL_MODE));
   PRTF(MQLInfoInteger(MQL_OPTIMIZATION));
   PRTF(MQLInfoInteger(MQL_FORWARD));
   PRTF(MQLInfoInteger(MQL_FRAME_MODE));
}

Antes de ejecutar el programa, debe comprobar la configuración de depuración/perfilaje. Para ello, en MetaEditor, ejecute el comando Herramientas -> Opciones y compruebe los valores de los campos en la pestaña Depuración/Perfilado. Si la opción Usar opciones especificadas está activada, serán los valores de los campos subyacentes los que afectarán al gráfico del instrumento financiero y al marco temporal en el que se lanzará el programa. Si la opción está desactivada, se utilizará el primer instrumento financiero en Market Watch y el marco temporal H1.

En esta fase, la elección de la opción no es crítica.

Tras los preparativos, ejecute el script mediante el comando Depurar -> Empezar con datos reales (F5). Como el script sólo imprime en el registro las propiedades solicitadas (y no necesitamos puntos de interrupción en él), su ejecución será instantánea. Si es necesaria la depuración paso a paso, podríamos poner un punto de interrupción (F9) en cualquier sentencia del código fuente, y la ejecución del script se congelaría ahí durante el periodo que necesitemos, lo que permite estudiar el contenido de todas las variables en MetaEditor, y también movernos línea a línea (F10) a lo largo del algoritmo.

En el registro de MetaTrader 5 (pestaña Expertos), veremos lo siguiente:

MQLInfoInteger(MQL_TESTER)=0 / ok
MQLInfoInteger(MQL_DEBUG)=1 / ok
MQLInfoInteger(MQL_PROFILER)=0 / ok
MQLInfoInteger(MQL_VISUAL_MODE)=0 / ok
MQLInfoInteger(MQL_OPTIMIZATION)=0 / ok
MQLInfoInteger(MQL_FORWARD)=0 / ok
MQLInfoInteger(MQL_FRAME_MODE)=0 / ok

Se reinician las banderas de todos los modos, excepto MQL_DEBUG.

Ahora vamos a ejecutar el mismo script desde Navegador en MetaTrader 5 (sólo tiene que arrastrarlo con el ratón a cualquier gráfico). Obtendremos un conjunto casi idéntico de banderas, pero esta vez MQL_DEBUG será igual a 0 (porque el programa fue ejecutado de manera regular, y no bajo un depurador).

Tenga en cuenta que el lanzamiento del programa con depuración va precedido de su recompilación en un modo especial cuando la información de servicio que permite la depuración se añade al archivo ejecutable. Dicho archivo binario es más grande y lento de lo habitual. Por lo tanto, una vez finalizada la depuración, antes de utilizarlo en operaciones de trading reales, transferirlo al cliente o cargarlo en el Mercado, el programa debe volver a compilarse con el comando Archivo -> Compilar (F7).
 
El método de compilación no afecta directamente a la propiedad MQL_DEBUG. La versión de depuración del programa, como podemos ver, se puede iniciar en el terminal sin un depurador, y MQL_DEBUG se restablecerá en este caso. Dos macros integradas permiten determinar el método de compilación: _DEBUG y _RELEASE (véase la sección Constantes predefinidas). Son constantes, no funciones, porque esta propiedad está «programada» en el programa en tiempo de compilación y no puede modificarse (a diferencia del entorno de ejecución).

Ahora vamos a ejecutar el comando Depurar -> Comenzar el perfilado con datos reales en MetaEditor. Por supuesto, no tiene sentido perfilar un script tan simple, pero nuestra tarea ahora es asegurarnos de que la bandera apropiada está activada en las propiedades del entorno. Efectivamente, frente a MQL_PROFILER ahora hay 1.

MQLInfoInteger(MQL_TESTER)=0 / ok
MQLInfoInteger(MQL_DEBUG)=0 / ok
MQLInfoInteger(MQL_PROFILER)=1 / ok
...

El lanzamiento del programa con perfilaje también va precedido de su recompilación en otro modo especial, que añade al archivo binario otra información de servicio necesaria para medir la velocidad de ejecución de las instrucciones. Tras analizar el informe del perfilador y solucionar los cuellos de botella, deberá recompilar el programa de la forma habitual.

En principio, la depuración y el perfilaje pueden realizarse tanto en línea como en el probador (MQL_TESTER) sobre datos históricos, pero el probador sólo admite Asesores Expertos e indicadores. Por lo tanto, es imposible ver la bandera MQL_TESTER o MQL_VISUAL_MODE establecida en el ejemplo de script.

Como sabe, MetaTrader 5 le permite probar los programas de trading en modo rápido (sin un gráfico) y en modo visual (en un gráfico separado). Es en el segundo caso cuando se habilitarán las propiedades MQL_VISUAL_MODE. Tiene sentido comprobarlo, en especial para desactivar las manipulaciones con objetos gráficos en ausencia de visualización.

Para depurar en modo visual utilizando el historial, primero debe activar la opción Use visual mode for debugging on history en el cuadro de diálogo de configuración de MetaEditor. Los programas analíticos (indicadores) se prueban siempre en modo visual.

Tenga en cuenta que la depuración en línea no es segura para Asesores Expertos de trading.