- Diseño de programas MQL de varios tipos
- Hilos
- Visión general de las funciones de gestión de eventos
- Funciones de inicio y parada de programas de varios tipos
- Eventos de referencia de indicadores y Asesores Expertos: OnInit y OnDeinit
- Función principal de scripts y servicios: OnStart
- Eliminación programática de Asesores Expertos y scripts: ExpertRemove
Eliminación programática de Asesores Expertos y scripts: ExpertRemove
Si es necesario, el desarrollador puede organizar la parada y descarga de programas MQL de dos tipos: Asesores expertos y scripts. Para ello se utiliza la función ExpertRemove.
void ExpertRemove()
La función no tiene parámetros y no devuelve ningún valor. Envía una petición al entorno de ejecución del programa MQL para borrar el programa actual. De hecho, esto lleva a fijar la bandera _StopFlag y detiene la recepción (y el procesamiento) de todos los eventos posteriores. Después de eso, el programa dispone de tres segundos para completar correctamente su trabajo: liberar recursos, romper bucles en algoritmos, etc. Si el programa no lo hace, se descargará forzosamente, con la pérdida de datos intermedios.
Esta función no funciona en indicadores y servicios (el programa sigue ejecutándose).
Para cada llamada a la función, el registro contendrá la entrada «ExpertRemove() function called».
Esta función se utiliza principalmente en los Asesores Expertos que no pueden interrumpirse de ninguna otra forma. En el caso de los scripts suele ser más fácil romper el bucle (si lo hay) con la sentencia break. Pero si los bucles están anidados, o el algoritmo utiliza muchas llamadas de unas funciones a otras, es más fácil tener en cuenta la bandera de parada en diferentes niveles en las condiciones para continuar los cálculos, y en caso de una situación errónea, establecer esta bandera utilizando ExpertRemove. Si no utiliza esta bandera integrada, en todo caso, tendría que introducir una variable global con el mismo propósito.
El script ScriptRemove.mq5 proporciona el ejemplo de uso ExpertRemove.
La clase ProblemSource emula un problema potencial en el funcionamiento del algoritmo, lo que lleva a la necesidad de descargar el script. ExpertRemove se llama aleatoriamente en su constructor.
class ProblemSource
|
Más adelante se crean objetos de esta clase a nivel global y dentro de la función auxiliar.
ProblemSource global; // object may throw an error
|
Ahora utilizamos SubFunction en la operación OnStart, dentro del bucle con la condición IsStopped.
void OnStart()
|
He aquí un ejemplo de registro (cada ejecución será diferente debido a la aleatoriedad):
1
|
Tenga en cuenta que, si se produce un error al crear el objeto global, el bucle nunca se ejecutará.
Dado que los Asesores Expertos pueden funcionar en el probador, la función ExpertRemove también puede utilizarse en el probador. Su efecto depende del lugar de la llamada a la función. Si esto se hace dentro del manejador OnInit, la función cancelará la prueba, es decir, una ejecución del probador en el conjunto actual de los parámetros del Asesor Experto. Dicha terminación se trata como un error de inicialización. Si se llama a ExpertRemove en cualquier otro lugar del algoritmo, la prueba del Asesor Experto se interrumpirá antes de tiempo, pero se procesará de forma regular, con las llamadas OnDeinit y OnTester. En este caso se obtendrán las estadísticas de trading acumuladas y el valor del criterio de optimización, teniendo en cuenta que el tiempo de servidor emulado TimeCurrent no alcanza la fecha de finalización en la configuración del probador.