Ejecución de programas

Cada script, servicio y experto trabaja en su propio flujo de ejecución independiente. Todos los indicadores que se calculan para un símbolo trabajan en un flujo de ejecución, incluso si han sido iniciados en diferentes gráficos. De esta manera, todos los indicadores de un símbolo comparten entre ellos los recursos de un flujo de ejecución.

Todas las demás acciones relacionadas con este símbolo (procesamiento de los ticks y sincronización del historial) también se ejecutan sucesivamente en el mismo flujo junto con los indicadores. Eso quiere decir que si en un indicador se realiza una acción infinita, todos los demás eventos para este símbolo nunca se ejecutan.

Cuando se arranca un Asesor Experto, es necesario asegurar que disponga de un entorno de trading puesto al día, que pueda acceder al historial para este símbolo y período, así como realizar la sincronización entre el terminal y el servidor. Para estos procedimientos el terminal concede al EA un retraso de arranque de no más de 5 segundos, una vez expirados los cuales, el EA será iniciado con los datos que se ha podido preparar. Por eso en caso de no haber conexión con el servidor, esto puede provocar el retraso de arranque del EA.

La tabla de abajo contiene un breve sumario para los programas escritos en MQL5:

Programa

Ejecución

Nota

Servicio

En un flujo propio; el número de servicios será igual que el número de flujos de ejecución para los mismos

Un ciclo infinito no puede parar el trabajo de otros programas

Script

En un flujo separado el número de flujos para los scripts coincide con el número de los scripts

Un script de ciclo cerrado no puede alterar el funcionamiento de otros programas

Asesor Experto

En un flujo separado el número de flujos para los EAs coincide con el número de los EAs

Un Asesor Experto de ciclo cerrado no puede alterar el funcionamiento de otros programas

Indicador

Un flujo de ejecución para todos los indicadores en un símbolo. El número de flujos de ejecución para los indicadores coincide con el número de los símbolos con estos indicadores

Un ciclo infinito en un indicador parará el trabajo de todos los demás indicadores en este símbolo

Inmediatamente después de que un programa haya sido adjuntado a un gráfico, este programa se carga en la memoria del terminal de cliente y se realiza la inicialización de variables globales. Si alguna variable global del tipo de clase dispone del constructor, éste va a ser invocado durante el proceso de inicialización de variables globales.

Después de todo eso el programa se encuentra en el modo de espera de un evento del terminal de cliente. Cada programa mql5 debe tener por lo menos una función-manejador de eventos, en caso contrario, el programa cargado no será ejecutado. Las funciones-manejadores de eventos tienen los nombres predefinidos, conjuntos de parámetros y los tipos de retorno predefinidos.

Tipo

Nombre de la función

Parámetros

Aplicación

Comentario

int

OnInit

no hay

expertos e indicadores

Manejador de evento Init. Se admite el tipo de valor devuelto void.

void

OnDeinit

const int reason

expertos e indicadores

Manejador de evento Deinit.

void

OnStart

no hay

scripts y servicios

Manejador de evento Start.

int

OnCalculate

const int rates_total,

const int prev_calculated,

const datetime &Time[],

const double &Open[],

const double &High[],

const double &Low[],

const double &Close[],

const long &TickVolume[],

const long &Volume[],

const int &Spread[]

indicadores

Manejador de evento Calculate para todos los datos de precio.

int

OnCalculate

const int rates_total,

const int prev_calculated,

const int begin,

const double &price[]

indicadores

Manejador de evento Calculate en un array de datos.

No se permite el uso de dos manejadores Calculate en un indicador a la vez. En este caso sólo un manejador de evento Calculate va a funcionar en un array de datos.

void

OnTick

no hay

expertos

Manejador de evento NewTick. Mientras se realiza el procesamiento del evento de entrada de un nuevo tick, otros eventos de este tipo no pueden entran.

void

OnTimer

no hay

expertos e indicadores

Manejador de evento Timer.

void

OnTrade

no hay

expertos

Manejador de evento Trade.

double

OnTester

no hay

 

Manejador de evento Tester

void

OnChartEvent

const int id,

const long &lparam,

const double &dparam,

const string &sparam

expertos e indicadores

Manejador de evento ChartEvent.

void

OnBookEvent

const string &symbol_name

expertos e indicadores

Manejador de evento BookEvent.

El terminal de cliente envía los eventos que surgen a los correspondientes gráficos abiertos. Además, los eventos también pueden ser generados por los gráficos (eventos del gráfico) o por los programas mql5 (eventos de usuario). Usted puede activar y desactivar la generación de los eventos de creación y eliminación de los objetos gráficos ajustando las propiedades del gráfico CHART_EVENT_OBJECT_CREATE y CHART_EVENT_OBJECT_DELETE. Cada programa mql5 y cada gráfico tiene su propia cola de eventos en la que se ponen todos los eventos recién llegados.

El programa recibe los eventos sólo del gráfico en el que está iniciado. Todos los eventos se procesan uno tras otro, en orden de su llegada. Si en la cola ya hay un evento NewTick, o este evento se encuentra en el proceso de tramitación, entonces el nuevo evento NewTick no se coloca en la cola del programa mql5. Del mismo modo, si la cola del programa mql5 ya contiene un evento ChartEvent, o este evento se está procesando, el nuevo evento de este tipo no se coloca en la cola. El procesamiento del evento del temporizador se realiza según el mismo esquema. Es decir, si el evento Timer se encuentra en la cola o se está procesando, entonces el nuevo evento del temporizador no se pone en la cola.

Las colas de eventos tienen un tamaño limitado pero es suficiente, por eso la situación del desbordamiento de la cola es poco probable para un programa escrito de forma correcta. En caso del desbordamiento de la cola los nuevos eventos se descartan sin ponerse a la cola.

No se recomienda en ningún caso usar ciclos infinitos para el procesamiento de eventos. La única excepción a esta regla pueden ser solo los scripts y servicios que procesan un solo evento Start.

Las bibliotecas no manejan ningunos eventos.

 

Prohibición para el uso de funciones en los indicadores y EAs

Los indicadores, scripts y EAs son programas ejecutables en MQL5 y están destinados para diferentes tipos de tareas. Por esta razón existe una restricción de uso de ciertas funciones dependiendo del tipo del programa. En los indicadores están prohibidas las funciones siguientes:

 

A su vez, en los EAs y scripts están prohibidas todas las funciones destinadas para los indicadores:

La biblioteca no es un programa independiente y se ejecuta en el contexto del programa MQL5 que la ha llamado: un script, indicador o EA. En consecuencia, las restricciones especificadas conciernen a la biblioteca llamada.

 

Prohibición del uso de funciones en los servicios

Los servicios no aceptan ningún evento, ya que no están vinculados a un gráfico.  En los servicios están prohibidas las siguientes funciones:

ExpertRemove();

EventSetMillisecondTimer();

EventSetTimer();

EventKillTimer();

SetIndexBuffer();

IndicatorSetDouble();

IndicatorSetInteger();

IndicatorSetString();

PlotIndexSetDouble();

PlotIndexSetInteger();

PlotIndexSetString();

PlotIndexGetInteger();

 

Carga y descarga de indicadores

Los indicadores se cargan en siguientes ocasiones:

  • indicador se adjunta al gráfico;
  • Inicio del terminal (si el indicador estaba adjuntado al gráfico antes del cierre anterior de terminal);
  • carga de plantilla (si el indicador adjunto al gráfico está especificado en la plantilla);
  • cambio de perfil (si el indicador está adjuntado a uno de los gráficos del perfil);
  • cambio del símbolo o/y período del gráfico al que está adjuntado el indicador;
  • cambio de la cuenta a la que estaba conectado el terminal;
  • después de recompilación del indicador finalizada con éxito, si este indicador ha sido adjuntado al gráfico.
  • cambio de parámetros de entrada del indicador.

 

Los indicadores se descargan en siguientes ocasiones:

  • si el indicador se desjunta del gráfico;
  • cierre del terminal (si el indicador estaba adjuntado al gráfico);
  • carga de plantilla, si el indicador está adjuntado al gráfico;
  • cierre del gráfico al que ha sido adjuntado el indicador;
  • cambio de perfil, si el indicador está adjuntado a uno de los gráficos del perfil que se cambia;
  • cambio del símbolo o/y período del gráfico al que está adjuntado el indicador;
  • cambio de la cuenta a la que estaba conectado el terminal;
  • cambio de parámetros de entrada del indicador.

 

Carga y descarga de Asesores Expertos

Los Asesores Expertos se cargan en siguientes ocasiones:

  • Asesor Experto se adjunta al gráfico;
  • Inicio del terminal (si el Asesor Experto ha sido adjuntado al gráfico antes del cierre anterior de terminal);
  • carga de plantilla (si el Asesor Experto adjunto al gráfico está especificado en la plantilla);
  • después de recompilación del Asesor Experto finalizada con éxito, si este Asesor Experto ha sido adjuntado al gráfico;
  • cambio de perfil (si el Asesor Experto está adjuntado a uno de los gráficos del perfil);
  • conexión a una cuenta, incluso si el número de la cuenta es el mismo (si el Asesor Experto ha sido adjuntado al gráfico antes de la autorización del terminal en el servidor).

La descarga del Asesor Experto adjunto al gráfico se realiza en las siguientes ocasiones:

  • si el Asesor Experto se desjunta del gráfico;
  • cuando el Asesor Experto se adjunta al gráfico - si ya había otro Asesor Experto en el mismo gráfico, éste se descarga ;
  • el cierre del terminal (si el  Asesor Experto estaba adjuntado al gráfico);
  • carga de plantilla, si el Asesor Experto está adjuntado al gráfico;
  • cierre del gráfico al que ha sido adjuntado el  Asesor Experto;
  • cambio de perfil, si el Asesor Experto está adjuntado a uno de los gráficos del perfil que se cambia;
  • cambio de la cuenta a la que estaba conectado el terminal (si el Asesor Experto ha sido adjuntado al gráfico antes de la autorización del terminal en el servidor);

Si el símbolo o período del gráfico al que el Experto está adjuntado, se cambia, entonces la carga y descarga del Asesor Experto no se realiza. En este caso, sucesivamente se invocan los manejadores OnDeinit() en el símbolo/período antiguo y OnInit() en el símbolo/período nuevo (si hay), los valores de variables globales y variables estáticas no se ponen a cero. Todos los eventos que han llegado para el Asesor Experto antes de completarse la inicialización (función OnInit()) se saltan.

 

Carga y descarga de scripts

Los scripts se cargan una vez adjuntados al gráfico, y se descargan inmediatamente al terminar su trabajo.  Las funciones OnInit() y OnDeinit() no se invocan para los scripts.

Cuando el programa se descarga (se elimina del gráfico), ocurre deinicialización de variables globales y eliminación de la cola de mensajes. En este caso la deinicialización significa desasignación de variables del tipo string, liberación de objetos de arrays dinámicos y llamada a los destructores, en caso de que hayan.

 

Carga y descarga de servicios

Los servicios se cargan justo después del inicio del terminal, si en el momento en que se ha detenido el terminal, estos estaban iniciados. Los servicios se descargan inmediatamente después de su funcionamiento.

Los servicios tienen un único manejador OnStart(), en él usted podrá organizar un ciclo constante de obtención y procesamiento de datos, por ejemplo, para crear y actualizar los símbolos personalizados con la ayuda de las funciones de red.

A diferencia de los asesores, indicadores y scripts, los servicios no están vinculados a un gráfico concreto, por eso, para iniciar el servicio se ha pensado un mecanismo aparte.  La creación de un nuevo ejemplar del servicio se realiza desde el Navegador, con la ayuda del comando "Añadir servicio". Para iniciar, detener y eliminar un ejemplar del servicio, utilice el menú del mismo. Para gestionar todos los ejemplares, utilice el menú del propio servicio.

 

Para mejor entendimiento de funcionamiento de los Asesores Expertos se recomienda  hacer la compilación del código del Asesor Experto propuesto en el ejemplo y realizar las acciones de carga/descarga de Expertos, cambio de plantilla, símbolo, período, etc.

Ejemplo:

//+------------------------------------------------------------------+
//|                                                   TestExpert.mq5 |
//|                        Copyright 2009, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "2009, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
 
class CTestClass
  {
public:  
   CTestClass() { Print("CTestClass constructor"); }
   ~CTestClass() { Print("CTestClass destructor"); }
  };
CTestClass global;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Print("Initialisation");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   Print("Deinitialisation with reason ",reason);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
 
  }
//+------------------------------------------------------------------+

Los scripts se cargan una vez adjuntados al gráfico, y se descargan al terminar su trabajo.

Véase también

Eventos del terminal de cliente, Funciones de procesamiento de eventos