Cierre programático del terminal y establecimiento de un código de retorno

La API de MQL5 contiene varias funciones no sólo para leer, sino también para modificar el entorno del programa. Uno de los más radicales es TerminalClose. Mediante esta función, un programa MQL puede cerrar el terminal (¡sin confirmación del usuario!).

bool TerminalClose(int retcode)

La función tiene un parámetro retcode que es el código devuelto por el proceso terminal64.exe al sistema operativo Windows. Estos códigos pueden analizarse en archivos por lotes (*.bat y *.cmd), así como en «shell scripts» (Windows Script Host (WSH), que admite VBScript y JScript, o Windows PowerShell (WPS), con archivos .ps*) y otras herramientas de automatización (por ejemplo, el programador integrado de Windows, el subsistema de soporte de Linux en Windows con archivos *.sh, etc.).

La función no detiene inmediatamente el terminal, sino que envía una orden de terminación al terminal.

Si el resultado de la llamada es true, significa que el comando ha sido «aceptado para su consideración» con éxito, y el terminal intentará cerrarse lo más rápido posible, pero correctamente (generando una notificación y deteniendo otros programas MQL en ejecución). En el código de llamada, por supuesto, también se deben hacer todos los preparativos para la terminación inmediata del trabajo (en concreto, se deben cerrar todos los archivos abiertos previamente), y después de la llamada a la función, se debe devolver el control al terminal.

Otra función asociada al código de retorno del proceso es SetReturnError. Permite preasignar este código sin enviar un comando de cierre inmediato.

void SetReturnError(int retcode)

La función establece el código que el proceso de terminal devolverá al sistema Windows después de cerrarse.

Tenga en cuenta que no es necesario cerrar el terminal a la fuerza mediante la función TerminalClose. El cierre regular del terminal por parte del usuario también se producirá con el código especificado. Además, este código entrará en el sistema si el terminal se cierra debido a un error crítico inesperado.

Si la función SetReturnError ha sido llamada repetidamente y/o desde diferentes programas MQL, el terminal devolverá el último código establecido.

Vamos a probar estas funciones utilizando el script EnvClose.mq5.

#property script_show_inputs
   
input int ReturnCode = 0;
input bool CloseTerminalNow = false;
   
void OnStart()
{
   if(CloseTerminalNow)
   {
      TerminalClose(ReturnCode);
   }
   else
   {
      SetReturnError(ReturnCode);
   }
}

Para probarlo en acción, también necesitamos el archivo envrun.bat (ubicado en la carpeta MQL5/Files/MQL5Book/).

terminal64.exe
@echo Exit code: %ERRORLEVEL%

De hecho, sólo lanza el terminal, y tras su finalización muestra el código resultante en la consola. El archivo debe colocarse en la carpeta del terminal (o la instancia actual de MetaTrader 5 de entre varias instaladas en el sistema debe registrarse en la variable de sistema PATH).

Por ejemplo, si iniciamos el terminal utilizando el archivo bat, y ejecutamos el script EnvClose.mq5, por ejemplo, con los parámetros ReturnCode=100 y CloseTerminalNow=true, veremos algo así en la consola:

Microsoft Windows [Version 10.0.19570.1000]
(c) 2020 Microsoft Corporation. All rights reserved.
C:\Program Files\MT5East>envrun
C:\Program Files\MT5East>terminal64.exe
Exit code: 100
C:\Program Files\MT5East>

Como recordatorio, MetaTrader 5 admite varias opciones cuando se ejecuta desde la línea de comandos (ver detalles en la sección de documentación Ejecución de la plataforma de trading). Así, es posible organizar, por ejemplo, pruebas por lotes de varios Asesores Expertos o configuraciones, así como el cambio secuencial entre miles de cuentas supervisadas, lo que sería poco realista de lograr con el funcionamiento paralelo constante de tantas instancias en un ordenador.