Paso de la versión MQL4

El lenguaje MQL5 es un lenguaje desarrollado de su antecesor MQL4, en el cual está escrita una gran cantidad de indicadores, scripts y Asesores Expertos. A pesar de que el lenguaje nuevo es compatible al máximo con la versión anterior, existen unas diferencias entre ellos. Y al pasar los programas hay que saber estas diferencias.

En este apartado está reunida la información cuyo objetivo es facilitar a los programadores que conocen bien Mql4 la adaptación de sus códigos al nuevo lenguaje MQL5.

Ante todo cabe señalar que:

  • No hay funciones start(), init() y deinit();
  • Cantidad de buffers de indicador no está limitada;
  • dll se carga una vez cargado un Asesor Experto (o cualquier otro programa mql5);
  • Comprobación reducida de condiciones lógicas;
  • Al salir fuera de los límites de un array la ejecución en curso se detiene (de una forma crítica - con mensaje del error);
  • Prioridad de operaciones igual que en C++;
  • Funciona la conversión implícita de tipos (incluso de cadena a un número);
  • Variables locales no se inicializan automáticamente (salvo las cadenas);
  • Arrays locales comunes se borran automáticamente.

Funciones especiales init, start y deinit

En el lenguaje MQL4 había sólo tres funciones predefinidas que podían estar presentes en el código de un indicador, Asesor Experto o script (sin tener en cuenta los archivos incluidos *.mqh y archivos de bibliotecas). En MQL5 no hay estas funciones, pero hay sus análogos. En la tabla de abajo se muestra una correspondencia aproximada de estas funciones.

MQL4

MQL5

init

OnInit

start

OnStart

deinit

OnDeinit

Las funciones OnInit y OnDeinit desempeñan el mismo papel que las funciones init y deinit en MQL4, es decir, están predestinadas para colocar el código que debe ejecutarse con la inicialización y deinicialización de los programas mql5. Se puede simplemente renombrar estas funciones de una manera correspondiente, o bien dejarlas tal como están pero hay que añadir la llamada a éstas en los sitios correspondientes.

Ejemplo:

void OnInit()
  {
//--- llamamos a la función al inicializar
   init();
  }
void OnDeinit(const int reason)
  {
//--- llamamos a la función al deinicializar
   deinit();
//---
  }

 

La función start se cambia por OnStart sólo en los scripts, para un Asesor Experto o un indicador hace falta renombrarla con OnTick y OnCalculate respectivamente. El código que tiene que ser ejecutado durante el funcionamiento de un programa mql5, hay que colocarlo precisamente en estas tres funciones:

programa mql5

función principal

script

OnStart

indicador

OnCalculate

Asesor Experto

OnTick

Si el código del indicador o script no contiene la función principal o el nombre de ésta se diferencia del requerido, la llamada a esta función no se realiza. Es decir, si en el código principal de un script no hay función OnStart, este código va a ser compilado como un Asesor Experto.

Si en el código de un indicador falta la función OnCalculate, la compilación de este indicador no es posible.

Variables predefinidas

En MQL5 no hay variables predefinidas como Ask, Bid, Bars. Las variables Digits y Point se han cambiado un poco tal como se muestra en la tabla.

MQL4

MQL5

Digits

_Digits

Point

_Point

 

_LastError

 

_Period

 

_Symbol

 

_StopFlag

 

_UninitReason

Acceso a series temporales

En MQL5 no hay series temporales predefinidas Open[], High[], Low[], Close[], Volume[] y Time[]. Ahora se puede establecer independientemente la profundidad necesaria de series temporales a través de las correspondientes funciones para acceder a las series temporales.

Asesores Expertos

En MQL5 los Asesores Expertos no requieren la presencia obligatoria de la función-manejador del evento de llegada de un nuevo tick OnTick, como ha sido en MQL4 (en MQL4 la función start se invoca para ser ejecutada cuando llega un nuevo tick), porque ahora en MQL5 los Asesores Expertos pueden contener las funciones-manejadores predefinidas de varios tipos de eventos:

  • OnTick — recepción de un nuevo tick;
  • OnTimer — evento de temporizador;
  • OnTrade - evento comercial;
  • OnChartEvent — evento de introducción por el teclado o ratón, evento de movimiento de un objeto gráfico, evento del fin de edición del texto en la casilla de introducción del objeto LabelEdit;
  • OnBookEvent — evento del cambio del estado de profundidad de mercado (Depth of Market).

Indicadores personalizados

En MQL4 la cantidad de los buffers de indicador está limitada y no puede superar 8. En MQL5 tal limitación no existe pero hay que recordar que cada búfer de indicadores requiere un cierto volumen de memoria operativa para su ubicación en el terminal, por eso a pesar de todo no hace falta abusar de esta posibilidad.

Además, en MQL4 había sólo 6 tipos de representar gráficamente un indicador personalizado, en MQL5 ahora hay 18 estilos de dibujo. Y aunque los nombres de los tipos de dibujar no se hayan cambiado, la ideología de representación gráfica de los indicadores se ha cambiado considerablemente.

La dirección de la indexación en los buffers de indicadores también se diferencia. Por defecto, en MQL5 todos los búfers se comportan como los arrays comunes, es decir, un elemento con el índice 0 es el más antiguo de la historia, con el aumento del índice nos movemos de los datos más antiguos a los recientes.

La única función para trabajar con indicadores personalizados que se ha conservado de MQL4 es la SetIndexBuffer. Pero su llamada también se ha cambiado, ahora tenemos que especificar tipo de datos que van a guardarse en el array vinculado con el búfer de indicadores.

A parte de eso, las propiedades de los indicadores personalizados se han cambiado y se han extendido. Han sido agregadas nuevas funciones de acceso a series temporales, por eso hay que reconsiderar completamente todo el algoritmo de cálculo.

Objetos gráficos

El número de objetos gráficos en MQL5 se ha incrementado de una manera significativa, sin embargo, ha aparecido una restricción, es que no se puede usar las funciones de trabajo con objetos gráficos en los indicadores personalizados.

Además, el posicionamiento de objetos gráficos en el tiempo ahora es posible con una precisión de hasta un segundo en un gráfico de cualquier período, ahora no se realiza el redondeo de puntos de anclaje de objetos gráficos con precisión de tiempo de apertura del bar en el actual gráfico de precios.

Para los objetos Arrow, Text y Label ha aparecido la posibilidad de indicar el modo de anclaje, y para los objetos Label, Button, Chart, Bitmap Label y Edit se puede determinar la esquina del gráfico a la que está anclado el objeto.