# MetaQuotes Language MQL4/MQL5

MQL4 (MetaQuotes Language 4) y MQL5 (MetaQuotes Language 5) son lenguajes de programación integrados, diseñados para el desarrollo de robots comerciales, indicadores técnicos de mercado, scripts y bibliotecas funcionales dentro del software de MetaTrader.
El principal objetivo de MQL4 y MQL5 es la automatización de transacciones y la facilitación del análisis operativo. MQL4 y MQL5 comprenden una extensa biblioteca de código fuente codebase usada en el desarrollo de robots comerciales.

## Historia

El 1 de julio de 2005 MetaQuotes Software lanzó MetaTrader 4, una plataforma para comerciar en los mercados financieros. MQL4 es un lenguaje de programación orientada a objetos, escrito específicamente para trabajar en esta plataforma. Inicialmente, su sintaxis se basaba en el lenguaje C. La otra plataforma, MetaTrader 5, fue lanzada en 2010 junto con MQL5, un nuevo lenguaje creado para la misma.
El lanzamiento de MetaTrader 4 600 build en 2014 constituyó una actualización colosal para el lenguaje. Que la llevó al nivel del más moderno MQL5. El entorno de desarrollo MetaEditor quedó unificado para ambos lenguajes.
El MQL4 mejorado cuenta con nuevos objetos gráficos y nuevas funciones tomados de MQL5 y utilizados para el análisis de gráficos. El sistema de protección ha sido completamente modificado para los archivos ejecutables EX4. La biblioteca estándar MQL5 se transfirió casi en su totalidad, con la única excepción del subsistema comercial, que requirió una adaptación. Se añadieron nuevos tipos de datos y el sistema de micro sustitución fue expandido (compilación condicional #ifdef, #ifndef, #else, #endif), permitiendo el uso del código de otros lenguajes basados en С/C++. Las estructuras, las clases y el objeto punteros fueron igualmente añadidos (cabe señalar que los punteros de objeto en MQL4/MQL5 no son similares en todos los sentidos a los de С++). El mql4 actualizado cuenta con el modo de compilación estricta, lo que previene contra una gran cantidad de posibles errores de programación. En MQL5, este es el modo por defecto y no puede ser desactivado.
Ambos lenguajes soportan casi todos los estándares de la programación orientada a objetos, excepto la herencia múltiple: el encapsulamiento y la extensibilidad de tipos, la herencia, el polimorfismo, la sobrecarga, las funciones virtuales.

## Compilador

Para desarrollar programas en MQL4 y MQL5, se creó el MetaEditor - un compilador incorporado en el entorno de desarrollo -. Está integrado en los terminales comerciales MetaTrader 4/MetaTrader 5. El MetaEditor permite editar de forma adecuada el código fuente del programa, generar proyectos automáticamente con una plantilla, perfilar el código de forma remota y desarrollar aplicaciones conjuntas con otras personas.

## Diferencias entre MQL4 y MQL5

Una de las diferencias fundamentales es la configuración del sistema comercial. Mql4 se utiliza para el desarrollo de programas comerciales basados en el sistema de orden y MQL5 se utiliza para implementar un sistema posicional. En el terminal comercial MetaTrader 5 hay delimitaciones estrictas entre los conceptos de posición, orden y transacción. Una orden es una solicitud para ejecutar una operación comercial, que puede resultar en una transacción comercial. Una posición supone el conjunto de ofertas sobre un determinado instrumento financiero.
MQL5 comprende una lista ampliada de las funciones comerciales para el trabajo con órdenes abiertas, una lista de las posiciones abiertas, la historia de pedidos y la historia de transacciones. En MQL4, diferentes funciones tales como OrderSend, OrderClose, OrderCloseBy, OrderModify, OrderDelete fueron incorporadas inicialmente para realizar cada operación comercial. Estas funciones se pueden utilizar para abrir/cerrar y eliminar órdenes pendientes.
En MQL5 todas las operaciones comerciales se llevan a cabo mediante el envío de solicitudes de negociación utilizando sólo una función - OrderSend. Como parámetro, a la función se pasa una solicitud ya sea para colocar una orden pendiente, para abrir según el mercado, o para cancelar una orden previamente colocada. La introducción de la nueva función OrderSendAsync en MQL5 habilitó las operaciones comerciales asíncronicas.
Una novedad importante en MQL5 es la profundidad del Mercado y el nuevo tipo de evento para gestionar la información de la Profundidad de Mercado.

## Capacidades

MQL4/MQL5 pretende abordar directamente las necesidades y exigencias de los operadores. Fue desarrollado para la escritura de programas comerciales y solo se utiliza para ese fin. Las funciones para realizar operaciones comerciales OrderSend, OrderClose, OrderCloseBy, OrderModify, OrderDelete se incorporaron inicialmente en el lenguaje y se utilizan para cambiar el estado de una cuenta comercial.
Hay cuatro tipos de programas que se pueden escribir en mql4 / MQL5.
* Asesores expertos. Sistemas automáticos que comercian según parámetros especificados y que funcionan conforme a un algoritmo codificado. El acontecimiento de un evento especificado previamente, como recibir un nuevo tick, una alerta sobre una nueva operación comercial o incluso la presión de un botón o el click en un ratón, dispara el asesor experto para realizar una acción programada.
* Indicadores personalizados. Escritos por los usuarios, se utilizan junto con los indicadores realizados e integrados en los terminales. Su función es puramente analítica. Los indicadores no comercian o llevan a cabo operaciones que ralenticen el flujo de interfaz, tales como el envío de correos electrónicos o la ejecución de un retraso aleatorio. La tarea principal de los indicadores es monitorear una situación, reflexionar sobre la misma, interpretarla y luego enviarla al tráder para su análisis.
* Scripts. Un script es un programa destinado a la ejecución única de una acción. El evento de inicio es el único tipo de eventos procesado por el script.
* Bibliotecas de Funciones Personalizadas. Además, existe la oportunidad de crear archivos de inclusión (#include). Los archivos de inclusión permiten incluir las funciones y clases utilizadas con mayor frecuencia sin pegar directamente su código fuente en el programa. El uso de las funciones y clases simplifica la creación, depuración y compilación, porque al utilizar bibliotecas dinámicas, las funciones se cargan solo cuando se las llama directamente.

## La sintaxis de MQL4 y MQL5 y sus diferencias con С++

La sintaxis de los lenguajes es similar a la de C++, aunque hay excepciones. MQL4 y MQL5 no cuentan con puntero aritmético. El operador goto también está ausente en los lenguajes MQL, así como la posibilidad de declarar la enumeración anónima y la herencia múltiple.
* Formato de texto. Cualquier número de símbolos espaciales tales como espacios, tabulaciones o cadenas vacías se puede utilizar para hacer el código más legible y fácil para trabajar. Hay excepciones, sin embargo. Un símbolo de salto de línea no debe ser utilizado inmediatamente después de un hash y los símbolos de espacio no pueden ser utilizados en el interior de constantes, identificadores y palabras clave.
* Comentarios. Como sucede con C/C++, los comentarios de MQL4/MQL5 pueden ser de línea única o múltiple. Un comentario de una sola línea se inicia con los símbolos // y termina con el carácter de nueva línea. Los comentarios multilínea empiezan con los símbolos /* y terminan con */. Estos no pueden ser anidados.
* Identificadores. Los identificadores se utilizan como nombres para variables y funciones. La longitud de un identificador no puede exceder los 63 caracteres. Los siguientes caracteres se pueden utilizar al escribir un identificador: los números 0-9, las letras latinas mayúsculas y minúsculas Z, reconocidas como diferentes caracteres y el guion bajo (_). Un número no puede ser utilizado como el primer carácter.

## Tipos de datos

Main Los tipos de datos usados en MQL4/MQL5 son:
* entero (char, short, int, long, uchar, ushort, uint, ulong);
* Booleano o lógico (bool) ;
* literal (ushort);
* cadena (string);
* punto flotante (double, float);
* color (color);
* fecha y hora (datetime) ;
* enumeración (enum).
Las estructuras y clases son un tipo de datos complejo (abstracto) que puede ser operado en MQL4/MQL5. Las clases difieren de las estructuras en las siguientes características:
* la clase de palabra clave en la declaración;
* todos los miembros de la clase tienen acceso privado por defecto, mientras que miembros de la estructura tienen acceso público;
* los objetos de clase siempre tienen una tabla de funciones virtuales, mientras que las estructuras no pueden tenerla;
* el nuevo operador solo puede aplicarse a objetos de clase. No se puede aplicar a estructuras;
* la herencia: una clase hereda de una clase única y una estructura deriva solo de una estructura.

## Operaciones y expresiones

Todas las operaciones comunes - aritmética, bool, binaria, etcétera, están presentes en MQL4/MQL5. La precedencia de las operaciones corresponde a la adoptada en C ++.

## Críticas

La mayor desventaja de los lenguajes de la familia MQL es la imposibilidad de crear aplicaciones independientes, ya que cada lenguaje está vinculado a su plataforma correspondiente (MetaTrader 4/MetaTrader 5), y los programas EX4/EX5 solo funcionan en ellas.