OnInit

Se llama en los indicadores y expertos al suceder el evento Init. La función se ha diseñado para inicializar un programa MQL5 en marcha. Existen dos variantes de la función.

La versión con retorno del resultado

int  OnInit(void);

Valor retornado

Valor del tipo int, cero designa la inicialización exitosa.

Si se retorna el valor INIT_FAILED, el asesor será descargado del gráfico forzosamente.

Si se retorna el valor INIT_FAILED, el indicador no será descargado del gráfico. En este caso, además, el asesor que quedará en el gráfico no funcionará: el manejador de eventos en el indicador no será llamado.

Es prioritario el uso de la llamada de OnInit() con retorno del resultado de ejecución, ya que este método permite no solo ejecutar la inicialización del programa, sino también retornar el código de error en el caso de que el programa finalice antes de tiempo.

La versión sin retorno de resultado se ha dejado solo por compatibilidad con los códigos antiguos. No se recomienda su uso

void  OnInit(void);

Observación

El evento Init se genera justo después de cargar el experto o indicador, para los scripts este evento no se genera. La función OnInit() se usa para inicializar un programa MQL5. Si OnInit() tiene un valor retornable del tipo int, entonces un código de retorno distinto a cero significará la desinicialización fallida y generará el evento Deinit con el código del motivo de la desinicialización REASON_INITFAILED.

La función OnInit() del tipo void siempre denota la inicialización exitosa y no se recomienda su uso.

Al optimizar los parámetros de entrada del experto, se recomienda utilizar como código de retorno los valores de la enumeración ENUM_INIT_RETCODE. Estos valores han sido pensados para organizar la gestión del transcurso de la optimización, incluyendo la elección de los agentes de simulación más adecuados. Justo al inicializar el experto, antes de iniciar la propia simulación, podemos solicitar información sobre la configuración y los recursos del agente (número de núcleos, volumen de memoria libre, etc.) con la ayuda de la función TerminalInfoInteger(). Basándonos en la información obtenida, podemos o bien permitir usar este agente de simulación, o bien rechazarlo a la hora de optimizar este experto.

Identificador

Descripción

INIT_SUCCEEDED

La inicialización ha tenido éxito, la simulación del experto puede continuar.

Este código significa los mismo que el valor cero, la inicialización del experto en el simulador ha tenido lugar con éxito.

INIT_FAILED

Inicialización fallida, no tiene sentido continuar la simulación, debido a errores sin solucionar. Por ejemplo, no se ha logrado crear el indicador necesario para que funcione el experto.

El retorno de este valor significa lo mismo que el retorno de un valor distinto a cero, es decir, la inicialización del experto en el simulador ha pasado con éxito.

INIT_PARAMETERS_INCORRECT

Ha sido pensado para que el programador designe correctamente el conjunto de parámetros de entrada; en el recuadro general de optimización, la línea de resultado con este código de retorno se iluminará en color rojo.

La simulación para este conjunto de parámetros del experto no se ejecutará, el agente está libre para obtener un nuevo resultado.

Al obtener este resultado, el simulador de estrategias con toda garantía no transmitirá este valor a otros agentes para su nueva ejecución.

INIT_AGENT_NOT_SUITABLE

No han aparecido errores en el funcionamiento del programa, pero, por algún motivo, este agente no conviene para realizar la simulación. Por ejemplo, no hay memoria operativa suficiente, no hay soporte de OpenCL, etc.

Después de retornar este código, el agente no recibirá más tareas hasta el final de esta optimización.

El uso de OnInit() con retorno de INIT_FAILED/INIT_PARAMETERS_INCORRECT en el simulador tiene una serie de peculiaridades que debemos considerar al optimizar los asesores:

  • el conjunto de parámetros para el que OnInit() ha retornado INIT_PARAMETERS_INCORRECT se considera inadecuado para la simulación y no se usará para obtener la próxima populación durante la optimización genética. Si estos conjuntos descartados de parámetros son demasiados, este hecho podría provocar que la búsqueda de los parámetros óptimos del asesor arroje resultados incorrectos. El algoritmo de búsqueda presupone que la función de criterio de optimización es suave y no tiene brechas en el conjunto de los parámetros de entrada.
  • si OnInit() ha retornado INIT_FAILED, esto significa que la simulación no se puede comenzar, y el asesor es descargado de la memoria del agente. Para ejecutar la siguiente pasada en el nuevo conjunto de parámetros se realizará una nueva carga del asesor. Esto hará que necesitemos mucho más tiempo para iniciar la simulación de la siguiente pasada de optimización, en comparación con la llamada de TesterStop().

Ejemplo de la función OnInit() para el experto

//--- input parameters
input int      ma_period=20; // periodo de la media móvil
 
//--- manejador del indicador usado en el asesor
int indicator_handle;   
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- comprobamos si el valor ma_period es correcto
   if(ma_period<=0)
     {
      PrintFormat("Valor no permitido para el parámetro de entrada ma_period: %d",ma_period);
      return (INIT_PARAMETERS_INCORRECT);
     }
//--- al optimizar
   if(MQLInfoInteger(MQL_OPTIMIZATION))
     {
      //--- comprobamos el volumen de memoria operativa disponible para el agente
      int available_memory_mb=TerminalInfoInteger(TERMINAL_MEMORY_TOTAL);
      if(available_memory_mb<2000)
        {
         PrintFormat("Volumen de memoria insuficiente para el agente de simulación: %d MB",
                     available_memory_mb);
         return (INIT_AGENT_NOT_SUITABLE);
        }
     }
//--- comprobamos la presencia del indicador
   indicator_handle=iCustom(_Symbol,_Period,"My_Indicator",ma_period);
   if(indicator_handle==INVALID_HANDLE)
     {
      PrintFormat("No se ha logrado crear el manejador del indicador My_Indicator. Код ошибки %d",
                  GetLastError());
      return (INIT_FAILED);
     }
//--- la inicialización del experto ha tenido éxito
   return(INIT_SUCCEEDED);
  }

Ver también

OnDeinit, TesterHideIndicators, Funciones para el procesamiento de eventos, Ejecución de programas, Eventos del terminal de cliente, Inicialización de variables, Creación y eliminación de objetos