En este guía básica vamos a explicar como programar y crear Expert Advisors (sistemas automatizados de trading), indicadores modificados y scripts en el lenguaje de programación MQL4 de la plataforma de trading Metatrader 4. Vamos a empezar con lo básico y poco a poco continuaremos con cosas más avanzadas.

Pero antes de comenzar vamos a explicar una serie de conceptos básicos.

Sistemas automatizados de trading

Si está interesado en el trading, seguramente ya se ha encontrado con el término «sistema automatizado de trading», “robot de trading” o “expert advisor”.

Gracias a estos sistemas, ahora los operadores tienen opciones de inversión mucho más amplias.

En primer lugar, un sistema automatizado de trading puede funcionar continuamente día y noche y no cansarse nunca.

Del mismo modo, puede seguir y operar en docenas de mercados al mismo tiempo, no tiene emociones y solo hace lo que se le permite hacer. Nunca falla, no hace nada más allá de su programación y no pierde ninguna operación cuando se presentan las condiciones predeterminadas para la apertura de nuevas posiciones.

Es posible que estas propiedades no siempre sean una ventaja, pero como está leyendo estas líneas, es posible que ya se haya decidido por incursionar en el trading automatizado.

Un sistema de trading automatizado es un algoritmo escrito en un lenguaje de programación particular cuya tarea es abrir, cerrar y gestionar posiciones en el mercado bajo condiciones prescritas o, dependiendo del caso, realizar otras tareas.

No son más que decenas, cientos o incluso miles de líneas de texto en código que la plataforma de trading traduce a su idioma y sobre la base del cual hace lo que dice el código.

La buena noticia es que si tenemos una plataforma para ello, normalmente también podemos crear y probar dichos sistemas sin más instalaciones ni costos adicionales.

Por lo general, todo lo que se necesita es el conocimiento del lenguaje de programación. Cada plataforma de negociación suele tener su propio lenguaje personalizado.

En esta guía, cubriremos el lenguaje de programación de la plataforma de trading MetaTrader 4, la terminal de trading más popular entre los operadores menores de Forex y CFD.

Este lenguaje se llama MetaQuotes Language, MQL para abreviar.

¿Tienen interés en operar con un buen broker de Metatrader 4? Skilling es un broker de Forex y CFD de Europa que está debidamente regulado y ofrece buenas condiciones para operar en la plataforma MQL4 y usar Expert Advisors. Más información en: Ir al sitio web de Skilling

¿Qué es el lenguaje MetaQuotes y para qué se utiliza?

El lenguaje de programación MQL fue desarrollado por la empresa MetaQuotes, que también es el operador de la popular plataforma de operaciones MetaTrader utilizada para operar con Forex y derivados de CFD.

El módulo para la creación y edición de sistemas automatizados de trading, pero también de los indicadores y otros programas diseñados para ejecutarse en MetaTrader, viene directamente con la plataforma y se llama MetaEditor.

Por lo tanto, si ha descargado e instalado MetaTrader, automáticamente también tiene MetaEditor. Esto ocurre para las dos últimas versiones de la plataforma, Metatrader 4 y Metatrader 5.

Puede ejecutar MetaEditor desde la plataforma en el menú Herramientas – Editor MetaQuotes Language o directamente desde su icono en la barra de herramientas superior:

Acceder a Metaquotes de MQL4

Botón para acceder a Metaquotes de MQL4 en la barra de herramientas. Plataforma Metatrader 4 del broker RoboForex

Los componentes individuales del MetaEditor se explicarán más adelante.

Términos básicos

Desde el punto de vista de la programación, el lenguaje MQL se deriva de C++. El conocimiento de C++ es, por lo tanto, una ventaja, sin embargo, ciertamente no es un problema aprender a programar en MQL sin ninguna experiencia previa en programación.

Ahora explicaremos algunos conceptos básicos importantes que se encontrarán en el futuro y que son esenciales para la comprensión de MQL4.

  • Ejecución= implementación del algoritmo (programa) por la Terminal MetaTrader. Al realizar la ejecución, la plataforma “lee” el código del programa y ejecuta las acciones en la Terminal MetaTrader.
  • Control = la parte del programa que se está ejecutando. En otras palabras, la parte del código que la Terminal está leyendo y ejecutando actualmente.
  • Tick = nuevo precio de entrada. La mayoría de los programas de MQL se ejecutan específicamente con cada nuevo tick.
  • Comentario = la parte del programa que no está allí para ejecutarse. En el código, esta es la parte de la línea que comienza con dos barras diagonales consecutivas.

Para mayor claridad, estas partes están coloreadas en gris en el código y se omiten durante la ejecución. Si queremos comentar en varias líneas, podemos marcar el comienzo del comentario como /* y el final como */.

Puede que no lo parezca, pero describir partes del código es de vital importancia para que el código sea claro para que lo entiendan no solo los demás, sino también el propio autor.

Comentarios en MQL4

  • Terminal = la interfaz de usuario clásica de MetaTrader en la que corremos los programas y que es capaz de ejecutar los códigos escritos en el lenguaje MQL.
  • Compilación= compilación es la última fase de la creación del programa.

Durante esta acción, el compilador en el MetaEditor verifica el código en busca de errores y luego prepara el programa para operar en la Terminal.

Si hay errores en el código, el compilador los enumera y el programador se ve obligado a corregirlos.

Lenguaje MQL en Metatrader 4 y Metatrader 5

Ahora hablaremos un poco sobre las diferencias entre las plataformas Metatrader 4 y Metatrader 5 y su relación con el lenguaje MQL.

MetaTrader 4 y MetaTrader 5 como tales son diferentes en muchos aspectos, sin embargo, los lenguajes de programación relevantes solo difieren en algunas partes.

Originalmente, cada versión tenía su propio MetaEditor y su idioma personalizados (los lenguajes de programación contaban con la misma base, pero MQL5 se desarrolló más).

Por lo tanto, MQL4 y MQL5, que eran mutuamente incompatibles, solían coexistir. Pero la popularidad del MT5, una plataforma más nueva y con una serie de mejoras, a expensas de MT4 no aumentó y esto incluso se mantuvo con las respectivas versiones de MQL. Es decir, la popularidad de MT4 y su lenguaje MQL4 no disminuyeron para favorecer a MT5 y MQL5.

Sin embargo, los programadores querían desarrollar los programas que solo eran posibles en MQL5, también en MT4.

Los creadores de los lenguajes, por lo tanto, dieron paso a la llamada «gran unificación» que llegó junto con MetaTrader build 600.

MQL4 se sometió a importantes actualizaciones hacia MQL5, así como su correspondiente MetaEditor, que ahora es exactamente el mismo en ambas versiones.

Los programas están escritos en MQL5, sin embargo, solo funcionarán en MQL4 bajo ciertas condiciones, ya que muchos elementos de MT4 fueron retenidos por compatibilidad con programas más antiguos.

Por lo tanto, debemos aclarar aquí que este tutorial solo trata con el lenguaje MQL4 que, sin embargo, ya es muy similar a MQL5.

La guía estará escrita en términos bastante simples para que realmente todos puedan aprender los conceptos básicos de MQL.

MetaEditor

A continuación, vamos a a explicar: ¿Cómo entro al MetaEditor? ¿Cuáles son sus partes y qué pueden hacer? ¿Puedo personalizar los diferentes paneles y barras de herramientas? ¿Puedo cerrar algunas de las ventanas por completo?

Como se mencionó en la primera parte, se puede acceder al MetaEditor usando el menú Herramientas – MetaQuotes Language Editor, o el ícono apropiado en la barra de herramientas superior de la Terminal.

Como ya indicamos anteriormente, MetaEditor es exactamente igual tanto en la versión 4 como en la versión 5 de MetaTrader.

MetaEditor es muy sencillo, práctico y eficaz. No contiene ninguna funcionalidad adicional. El entorno de trabajo de MetaEditor se puede dividir en cinco partes.

Barra de herramientas superior

Barra de herramientas de Metaeditor

Estas barras de herramientas contienen el menú del programa tradicional y el menú relacionado con el programa activo (activo en el editor principal).

El menú completo está oculto en los menús desplegables File, Edit, etc., mientras que las herramientas más utilizadas aparecen en forma de iconos.

En el lado izquierdo, hay por defecto un bloque de herramientas para trabajar con archivos, dos iconos para activar/desactivar el módulo Navigator y la Toolbox, mientras que otros iconos se aplican al programa activo con el que está trabajando.

El diseño del icono se puede personalizar de acuerdo con sus preferencias después de hacer clic con el botón derecho en uno de los iconos y elegir Customize.

Lo que hace un icono en particular aparecerá como información sobre las herramientas al pasar el cursor sobre uno de los íconos o al mismo tiempo en la barra de estado en la parte inferior de MetaEditor.

En el extremo derecho, hay una herramienta muy importante: el campo de búsqueda.

Debajo del icono de rueda dentada, puede elegir si desea que la expresión especificada se busque solo en el documento actual y/o en todos los archivos y/o en toda la comunidad MQL.

Si ha marcado la opción para buscar en la comunidad MQL, se abrirá la página web correspondiente después de la búsqueda.

El resto de los resultados de la búsqueda se pueden encontrar en la caja de herramientas de la pestaña Search.

Sin duda, la búsqueda le resultará útil para resolver diversas tareas de programación, especialmente al principio. La comunidad MQL opera en inglés y ruso.

Navegador

El Navegador se utiliza para navegar a través de la estructura de archivos, que después de la «gran unificación» de las versiones de MQL se trasladó a un destino un poco más complejo.

Generalmente para Windows, es C:\Users \“usuario”\AppData\Roaming\MetaQuotes\Terminal\“instance_code”\ MQL4\.

Aquí debería poder encontrar todos los archivos fuente de los programas en MQL para la instalación de MetaTrader en particular.

Estos archivos se pueden ver y editar directamente en el editor. El módulo se puede activar y desactivar usando el icono o menú correspondiente en la barra de herramientas principal.

Editor de programas

Editor de programas de MQL4

Esta es, por supuesto, la ventana más grande. El propio editor no ofrece demasiado. Es, de hecho, solo un editor de texto en el que se escribe y edita el programa activo.

A la izquierda, hay un contador de líneas bastante útil. Al hacer clic en un número de línea en particular, puede marcarlo para ubicarlo fácilmente en un momento posterior.

Si tiene varios programas abiertos, puede acceder a uno u otro programa usando las pestañas en la parte superior del editor.

Caja de herramientas (Toolbox)

La caja de herramientas o Toolbox, ofrece varias herramientas útiles, entre las que puede cambiar en la parte inferior de la ventana.

La pestaña Errores se utiliza para la visión general y descripción de los errores en el programa durante su compilación. Los informes de errores se tratarán con más detalle más adelante en esta guía.

La pestaña Search muestra los resultados de la búsqueda en el documento o en archivos.

En la pestaña Articles se muestran los últimos artículos en el sitio web de la comunidad MQL. Al hacer doble clic, el artículo correspondiente se abrirá en el sitio mql5.com

En la pestaña Code Base, hay una lista de nuevos programas disponibles que los miembros de la comunidad MQL han compartido en sus páginas. Una vez más, al hacer clic en cualquiera de los elementos, se abrirá el navegador con la página correspondiente.

La sección Search se utiliza como registro del programa.

Barra de estado

La barra de estado solo ocupa una línea en la parte inferior del MetaEditor, pero proporciona información muy valiosa.

En su parte izquierda, muestra lo que hace un ícono o elemento de menú cuando pasamos el cursor sobre el ícono o elemento de menú.

En la parte derecha, muestra en qué partes del programa se encuentra actualmente su cursor, es decir, en qué fila y columna.

Además, el extremo derecho también muestra la abreviatura del tipo de escritura. INS para pegado clásico, OVR para sobrescritura.

Puede cambiar entre estos modos usando la tecla Insertar como en los editores de texto comunes.

Ahora que conocemos las características básicas de MetaEditor, podemos empezar a crear nuestro primer programa en MQL4.

A continuación, describiremos el asistente de archivos de programa y los tipos básicos de programas que podemos desarrollar en MQL.

Tipos de programas que podemos crear en MQL4

En esta sección vamos a explicar lo siguiente: ¿Cómo podemos empezar a crear programas en MetaEditor? ¿Cuáles son los tipos de programas y sus características específicas? ¿Qué programa debo elegir?

En la última sección, describimos los elementos individuales del MetaEditor, por lo que ahora estamos listos para embarcarnos en la creación del primer programa. Comenzamos la creación de un nuevo programa haciendo clic en el icono New ubicado en la parte izquierda de la barra de herramientas superior, o haciendo clic en el mismo botón en el menú desplegable File.

Primero, tenemos que seleccionar el tipo de programa que queremos crear.

La opción predeterminada preseleccionada es Expert Advisor, otras opciones incluyen Custom Indicator o Script.

Según el tipo de programa seleccionado, MetaEditor nos prepara el código del programa, pero esta no es una opción irreversible, más adelante podemos cambiar el código como queramos, incluso con el tipo de programa.

Podemos omitir los tres últimos tipos, ya que no los necesitaremos en esta serie. Estos son códigos adicionales para programas más complejos.

Ahora que vamos a comenzar seleccionando el tipo de programa, es el momento de explicar las diferencias básicas entre Expert Advisor, Custom Indicator y Script.

Después de eso, finalizaremos con la creación del programa.

Tipos de programas de MQL4

Script

El script es el tipo de programa más simple que se utiliza para la ejecución única de una tarea. Cuando se inicia, solo se ejecuta una vez y se apaga.

Todo el código se ejecuta como parte de la función especial OnStart (), otras funciones no tienen ningún propósito en el script.

Con respecto a las funciones especiales, hablaremos más de ellas más adelante.

Ejemplos de scripts pueden ser programas que realizan una reproducción única de un elemento gráfico en un gráfico de precios, programas que abren o cierran posiciones con características específicas, etc.

Por lo tanto, el script en sí no puede contener funciones de trading diseñadas para la apertura, cierre o modificación de posiciones.

Sin embargo, lo más importante es que todo el código solo se ejecuta una vez.

Tan pronto como el código se ejecuta hasta el final, el programa finaliza.

Sistema Automatizado de Trading (Expert Advisor)

Un programa de este tipo se usa principalmente para crear sistemas automatizados de trading, pero también se puede usar para crear otros programas de soporte que se ejecutan repetidamente, por ejemplo, los de información.

A diferencia de los scripts, el código se ejecuta de forma regular, generalmente con cada tick entrante, es decir, con cada nuevo precio entrante (con la única excepción de ticks que se produjeron en un momento en el que la ejecución anterior del programa no se había finalizado).

La parte principal del programa suele ser parte de la función especial OnTick (), y normalmente también existen las funciones OnInit () y OnDeinit () que contienen fragmento de código que se ejecuta al iniciar o apagar una estrategia.

Es posible agregar aún más funciones especiales al programa de las que hablaremos en detalle más adelante.

Sin embargo, es posible que no los necesite, especialmente si recién está comenzando con MQL.

Por supuesto, un sistema automatizado de trading también puede incluir funciones de negociación.

Cuando se activa, la estrategia se ejecuta hasta que se desactiva.

Indicador personalizado

Se utiliza un programa del tipo indicador para crear indicadores técnicos personalizados.

La función especial principal de este tipo de programas es la función OnCalculate () que también se ejecuta con cada precio entrante.

Aquí, también, las funciones OnInit () y OnDeinit () se utilizan comúnmente, junto con algunas de las otras funciones especiales. A diferencia de la estrategia, este tipo de programas no puede contener funciones de trading.

Aunque puedan estar allí, serán ignorados.

Una vez que sepamos qué tipo de programa queremos crear, podemos pasar a las siguientes opciones.

En la siguiente ventana, necesitaremos indicar el nombre del programa. Este es el único campo obligatorio. También podemos agregar autoría y enlace a una página web.

Los parámetros (variables) ya conocidos que estarán activos en el programa se pueden agregar al campo más grande.

Incluso aquí, es cierto que todos los valores (no) especificados, aparte del nombre, pueden editarse, eliminarse o agregarse en el código sin ningún problema.

Si elegimos el script al principio, el asistente para la creación de un nuevo programa terminará en esta etapa. Si nuestro plan es crear otro tipo de programa, el asistente nos pedirá que proporcionemos más información sobre las funciones especiales.

Si recién está comenzando con MQL, estas funciones no necesitan distraerlo y puede dejarlas de lado con total tranquilidad. Sin embargo, resultan útiles para los programas más complejos.

Si está creando un indicador personalizado, al final del asistente, puede especificar las líneas planificadas del indicador con su estilo, color y nombre.

También es posible definir si estarán en una ventana separada o directamente en el gráfico y, en su caso, si tendrán un mínimo y un máximo. Una vez más, esto no es nada que no pueda cambiarse directamente en el código del programa.

Después de terminar con el asistente, el código prediseñado aparece en el editor de código. Su sintaxis se basa en lo que fue indicado en el asistente.

Para que empiece a conocer ciertas partes del código que son idénticas en todos los programas y comience a organizar el código de su propio programa, nos centraremos en la estructura de los programas en MQL4 a continuación.

Estructura de los programas en MQL4

En esta sección del tutorial, vamos a explicar en detalle lo siguiente: ¿Cuáles son las partes de un programa? ¿Varían estas partes según el tipo de programa? ¿Por qué es importante dividir los códigos en partes lógicas? ¿Cómo se mueve el control del programa entre las partes del programa?

Cada programa se puede dividir en varias partes lógicas.

Su número y uso dependen del tipo y propósito del programa.

El siguiente diagrama ofrece un esquema básico de las partes contenidas en la mayoría de los programas de MQL4.

Debajo del diagrama, hay una explicación del progreso de la ejecución del programa según lo realiza la computadora.

Posteriormente, se discuten las partes principales individuales del programa y cuales son sus funciones.

Al principio, esta información puede parecer demasiado teórica, pero con el tiempo el programador aprende por si mismo que el conocimiento de lo que se está ejecutando es muy importante.

Estructura del programa. Fuente: https://book.mql4.com/programm/structure

El progreso de la ejecución del programa

El progreso habitual de la ejecución del programa entre las partes individuales está marcado en el diagrama con una línea amarilla.

Como se muestra en la imagen anterior, el programa primero lee el Header (encabezado) y luego ejecuta la función OnInit () si está presente.

Luego, pasa a la función especial principal que difiere según el tipo de programa, como vimos anteriormente.

Si el programa es un script, la función especial OnStart () se ejecuta solo una vez.

En otros casos, la función especial principal se ejecuta una y otra vez hasta que se da una instrucción para salir del programa.

Esto puede provenir de cualquier parte del código o del usuario del programa.

Una vez que eso sucede, la función OnDeinit () es a su vez ejecutada, si está presente, y luego el programa finaliza.

Las líneas amarillas más pequeñas indican la posibilidad de convocar la ejecución de funciones personalizadas desde las funciones principales.

Analizaremos en detalle las funciones de usuario más de cerca en un momento posterior. Son partes del código que deben ejecutar una tarea específica.

En el programa, se encuentran fuera de las otras funciones, generalmente debajo del código completo.

Como se muestra en el diagrama anterior, estas funciones pueden iniciarse para su ejecución desde todas las funciones especiales, no solo desde la función principal sino también desde otras funciones personalizadas.

El número de funciones personalizadas en el programa no está restringido.

Las flechas azules indican las comunicaciones de las funciones individuales con la terminal. Esto se puede hacer, por ejemplo, para obtener el precio actual del instrumento, los volúmenes y otra información importante.

En algunos casos, el programa puede incluso ejecutar comunicaciones fuera de la terminal, lo que en el diagrama se indica mediante flechas negras.

Esto implica, por ejemplo, la ejecución de órdenes donde el programa se comunica con el servidor del broker o el trabajo con archivos donde se intercambia información directamente con el sistema operativo.

Header (cabecera del programa)

El Header generalmente proporciona primero información básica sobre el programa, como la versión, autoría, descripción, etc. Esta es la información que se muestra al iniciar el programa en Metatrader.

Para que esta información se muestre al usuario, el código siempre debe comenzar con el modificador #property y el nombre del tipo de información específico (por ejemplo, copyright, descripción, versión, etc.).

Además, también se definen las variables globales en el Header. Estas variables estarán disponibles para todas las funciones del programa.

Por supuesto, hablaremos de las variables con más detalle más adelante ya que es un tema importante.

Si el nombre de la variable está precedido por el modificador “input”, estamos definiendo una variable cuyo valor puede ser ingresado por el propio usuario del programa (en el caso de un script, es necesario ingresar el modificador #property show_inputs para mostrar la ventana con los parámetros).

En el Header, también es posible, por ejemplo, importar funciones de otras bibliotecas de archivos y otras actividades.

Función especial OnInit ()

Esta función contiene el código que se ejecutará primero. Es, por tanto, una suma de acciones a realizar antes de iniciar la parte principal del programa.

Puede usarse para la preparación de gráficos, la definición de líneas de indicadores, preparación de cálculos, etc. Con un indicador la función casi siempre está presente, de lo contrario, no es necesariamente necesaria y podemos dejarla en blanco o borrarla por completo. En ese caso, el control cambia del Header directamente a la función especial principal.

Aunque MetaEditor siempre la genera y la coloca después del Header, en la práctica es completamente arbitrario el lugar donde se ubica el programa.

El control siempre se dirige a esta función primero, si está presente en el código.

Función especial principal

Cada programa debe incluir una función especial que contendrá la parte principal del programa para su ejecución.

Esa es la parte que define la misión principal de nuestro programa. Las funciones especiales principales específicas varían según el tipo de programa.

En el caso de un script, la función especial principal tiene el nombre OnStart (), en el caso de un Expert Advisor es OnTick (), y finalmente, en el caso de un indicador, es OnCalculate ().

Se pueden agregar varias funciones especiales adicionales a los programas.

Más adelante hay una sección completa que trata sobre las funciones especiales adicionales y que veremos después de completar las secciones dedicadas a los conceptos básicos, ya que inicialmente no resultan necesarias para aplicar estos conceptos básicos.

El nombre de la función especial sugiere qué tipo de eventos se realizará. Por ejemplo, OnInit () se ejecuta al inicializar, OnTick () al recibir un nuevo tick entrante, etc.

Esta parte del programa generalmente contiene la mayor parte del código y la ejecución de esta parte también emplea el control durante más tiempo.

En el caso de una estrategia o un indicador, esta sección se repite una y otra vez, hasta que finaliza el programa.

Funciones definidas por el usuario

La mayoría de los programas más complejos en MQL4 contendrán funciones definidas por el usuario en aras de una disposición más clara. Estas son todas las funciones no predefinidas que el programador define él mismo en el código.

Se analizarán con más detalle más adelante. Además, no importa en qué parte del código se colocan. Normalmente, se colocan al final del código para mayor orden.

Se ejecutan en el momento en que se inician desde otras partes del código que se está ejecutando actualmente.

El principio de iniciación y construcción de funciones definidas por el usuario se mostrará más adelante, sin embargo, ciertamente no hará ningún daño echar un vistazo a cómo pueden verse ahora.

Funciones definidas por el usuario. Fuente: https://book.mql4.com/programm/structure

Funciones especiales OnDeinit ()

Como sugiere el nombre de esta función especial, es responsable de la ejecución de un código tras la desinicialización, es decir, al final del programa.

Por lo tanto, es un conjunto de acciones que se realizan una vez que el usuario o la terminal dan la orden de finalizar el programa. Puede utilizarse, por ejemplo, para eliminar características gráficas del programa, despedirse del usuario, etc.

Una vez más, la posición en el código no importa.

Una vez finalizada la ejecución de la función, el programa finaliza. Si falta la función, el programa finalizará directamente con la señal para salir, como en el caso de OnInit ().

Más adelante en este tutorial, finalmente veremos las características y funciones específicas del lenguaje MQL4. A continuación, comenzaremos con la división de datos en tipos individuales.

Tipos de datos en MQL4

En esta sección nos vamos a enfocar en las siguientes cuestiones: ¿Por qué es importante distinguir los datos según su tipo? ¿Qué tipos de datos existen y para qué sirven? ¿Cómo trabaja una computadora con los datos?

Cada programa tiene que procesar ciertos datos. Sin embargo, no todos los datos son mutuamente inteligibles.

Normalmente se usan números y textos, muchas veces también colores o enumeraciones, y también se ejecutan diversas operaciones con dichos datos: operaciones aritméticas, como suma, multiplicación, etc., operaciones de asignación (asignación de valores a variables), operaciones de comparación y otras.

Sin embargo, solo podemos realizar estas operaciones con datos del mismo tipo. En otras palabras, no podemos mezclar manzanas con naranjas.

No se puede agregar un texto a un número y un color no se puede comparar de ninguna manera con una fecha.

Por tanto, es necesario diferenciar estrictamente con qué tipo de datos estamos trabajando. Para comunicar a la computadora qué tipo de datos  estamos utilizando para una variable o función específica, se usan los denominados identificadores de tipo de datos en el código.

Estos identificadores se insertan delante de una variable o función al declararla.

La introducción o declaración de variables y funciones se puede encontrar más adelante.

Los datos en el código de un programa se pueden dividir en los tipos que se enumeran en la siguiente tabla. En este caso, se enumeran solo los tipos básicos suficientes para la creación de programas comunes.

También existen tipos derivados de datos que, sin embargo, en su mayoría tienen la única función de ahorrar memoria de su computadora o, por el contrario, permitirle insertar valores extremos. La información sobre tipos derivados de datos está disponible en inglés en http://docs.mql4.com/basis/types.

Identificadores de tipo de datoTipos de dato
intEntero
boolLógico
stringDatos de texto
doubleNúmeros reales
colorColor
DateTimeFecha y hora
enumEnumeración

También es interesante que de todos estos tipos de datos, el programa utiliza principalmente tres tipos, es decir, enteros, decimales y cadenas de datos de texto. La diferencia con otros tipos está solo en el tamaño de memoria que la computadora asigna a cada valor y en la forma en que los datos se presentan al usuario.

A continuación vamos a describir con mayor detalle los principales tipos de datos usados en MQL4:

Enteros (int)

Este tipo de datos es útil para variables y funciones que por su naturaleza solo pueden ser números enteros. Puede ser el número de posiciones, el número de candelas del gráfico, la diferencia entre los precios en pips, etc. El valor de las variables de este tipo se limita al número 2 147 483 647 tanto en el espectro positivo como negativo. Si necesitamos un número mayor, es necesario usar un tipo de datos derivado, como int o long.

En la siguiente línea se muestra un ejemplo de la introducción de una variable entera y la asignación de un valor específico.

int Numero = 15;

Valor lógico (bool)

El valor lógico, o valor booleano, es un tipo de datos representado por uno de los valores True (verdadero) o False (falso). En el código, puede escribirse como true y false o como 1 y 0. Esto significa que la computadora entiende este tipo como un número entero.

bool Error = true;

bool Error = 1;

Números decimales (double)

Se usa este tipo de datos cuando el valor no es intrínsecamente un número entero, sino que también puede tener lugares decimales (hasta 15). Ejemplos de la introducción de una variable decimal y la asignación de valores se muestran a continuación:

double decimal = 15,52884689;

double Average_profit = Beneficio/Trading_days;

Cadena de datos de texto (string)

Se utiliza el tipo de datos de cadena para los datos en los que queremos insertar texto o una serie de cualquier carácter. El principio y el final de la cadena siempre deben ir entre comillas.

string Adv = “Obtenga hasta 40 000 USD por operar con CFDs”;

Colores (color)

Si se indica que una variable o función es un dato de tipo color, la computadora tomará el valor que ingresemos en ella como un código de color específico de acuerdo con la paleta de colores interna. Tenemos tres opciones para indicarle a la computadora qué color queremos. La opción más sencilla es escribirlo en palabras. Sin embargo, el nombre del color debe ser uno de los colores web que el lenguaje MQL puede distinguir. Puede encontrar una tabla con los nombres de los colores en http://docs.mql4.com/constants/objectconstants/webcolors.

color Rojo = Red;

Otra opción es una notación de números enteros. En Internet, generalmente se usa en forma del llamado código hexadecimal. El código hexadecimal de colores se puede obtener de cualquier editor simple de texto o gráficos. El código se basa en valores RGB, por lo tanto, en la proporción de colores rojo, verde y azul en la fórmula 0xRRGGBB.

color Blanco = 0xFFFFFF;

También podemos usar el mismo valor convertido a números decimales.

color verde = 32768;

Hay más opciones para ingresar los códigos de color, sin embargo, pueden considerarse menos prácticas. Es por eso que solo indicaremos la página web correspondiente para obtener más información: http://book.mql4.com/basics/types#13.

Fecha y hora (DateTime)

Este tipo de datos se utiliza, por supuesto, para escribir fechas y, si es necesario, también para la hora. Una entrada de datos específica de este tipo siempre comenzará con el identificador  seguido del código de fecha y hora. También se aceptan los formatos rrrr.mm.dd y dd.mm.rrrr a los que estamos acostumbrados en nuestras latitudes. Los segundos, minutos y horas son facultativos. Sin embargo, si falta el día, mes o año, el compilador nos notificará el error.

DateTime NewYear1 = D’2020.31.12 23:59:59′;

DateTime NewYear2 = D’31.12.2020′;

Incluso en este caso, la fecha se convierte en un número entero, a los efectos de los cálculos de la unidad de procesamiento, se toma como el número de segundos que han pasado desde 01. 01. 1970 00:00:00. Por ejemplo, la fecha y hora 29.08.2019 2015 15:44 puede, por lo tanto, escribirse también de esta manera:

DateTime Now = 1440863081;

Lo más probable es que nunca utilice este formato para los datos de fecha, pero puede suceder que al esperar la fecha, aparezca un número enorme y sin sentido como este debido a algún tipo de error. Ahora, sabrá la causa.

En la práctica, rara vez se ingresa una fecha de manera explícita en las variables. Normalmente, las variables que llevan tiempo en ellas se derivan de alguna manera, por ejemplo, del tiempo actual, para lo cual tenemos las funciones TimeCurrent () y TimeLocal (). Aquí, también, la conversión mencionada anteriormente a un código entero será útil, ya que, por ejemplo, la hora actual + dos días simplemente se calcularán de la siguiente manera:

DateTime TheDayAfterTomorrow = TimeLocal () + 2 * 24 * 60 * 60;

En otras palabras, pasado mañana = tiempo actual + 2 (días) * 24 (horas) * 60 (minutos) * 60 (segundos). Ahora ya sabe por qué es así, lo que facilitará considerablemente su trabajo con los datos.

Enumeración (enum)

La enumeración es uno de los tipos de datos que solo surgió en MQL4 después de la “gran unificación”. Este tipo de datos se utiliza para crear grupos de datos del mismo tipo. Podemos asignar valores a los datos, pero no es obligatorio, ya que se asignarán automáticamente. La enumeración debe declararse entre corchetes. En esta guía básica, lo más probable es que no necesitemos enumeraciones. Podremos leer sobre ellos en artículos más allá del alcance de esta serie.

Ya en este episodio, nos hemos encontrado con el importante concepto de “variable”. Es precisamente sobre las variables que hablaremos a continuación.

Las variables en MQL4

En esta sección nos vamos a enfocar en responder las siguientes preguntas: ¿Qué es una variable y qué hace en el programa? ¿Cómo creo una variable? ¿Cómo le asigno un valor? ¿En qué tipos se pueden dividir las variables?

Trabajar con variables es absolutamente inevitable en cualquier programa. Una variable actúa como un símbolo que cuenta con un valor que le asignamos. El valor de la variable se almacena en la memoria de la computadora hasta que otra operación lo cambie nuevamente.

Usando variables, el programa puede almacenar y presentar información en varias formas. Sin embargo, también utilizará variables auxiliares que solo operarán dentro del código, por lo que su uso no será evidente para el usuario desde el exterior. Es posible que se sienta algo confuso por estas definiciones, pero pronto las encontrará claras a partir de ejemplos prácticos.

Las variables se pueden dividir en función de varios criterios, pero primero aprenderemos cómo «producir» una variable tal que la computadora la entienda y le asigne un valor.

Declaración de variables

La introducción de variables en el programa se llama declaración. Esto se hace de manera muy fácil. Para introducir una variable, solo hay que conocer el nombre y el tipo de datos que deseamos introducir.

Explicamos los tipos de datos en el episodio anterior. La introducción de una variable se realizará escribiendo el identificador del tipo de datos y luego el nombre de la variable. El nombre solo puede contener caracteres en inglés. No se pueden utilizar caracteres especiales, incluido el punto, por ejemplo.

Una declaración es una operación, es necesario escribir un punto y coma al final. Aprenderemos por qué en el próximo episodio que trata sobre operaciones.

La introducción de la variable denominada «Lotes«, que debe contener valores enteros, aparecerá, por lo tanto, en el código de la siguiente manera:

int Lotes;

Incluso pueden declararse más variables del mismo tipo al mismo tiempo, sus nombres solo tienen que estar separados por una coma:

double Beneficio, Perdida, Win_Rate, Riesgo_Beneficio;

De esta manera, hemos declarado cuatro variables a las que planeamos asignar números decimales. Si alguna de las variables fuera de un tipo diferente, debemos declararla por separado. El primer valor asignado a una variable se llama inicialización.

Inicialización de variables

La inicialización, es decir, la primera asignación de un valor a una variable, se realiza simplemente mediante una operación de asignación donde usamos el símbolo =. Las opciones son numerosas. La inicialización se puede realizar mediante asignación directa:

Deposito = 100 000;

O como resultado de una ecuación en la que ocurren otras variables:

A = B + C

O quizás como resultado de una función o una combinación de funciones:

Hoy = TimeToString(TimeCurrent(),TIME_DATE);

De esta manera, por ejemplo, hemos insertado la fecha actual del servidor del broker convertida a texto en la variable Hoy. Sin embargo, la variable Today debe declararse como una variable de tipo de cadena. Una vez más, no olvide el punto y coma al final.

La declaración y la inicialización se pueden combinar en una sola operación en una sola línea, como esta:

int A = 3;

color Yell = Yellow, Lemon = Lime;

En las dos líneas anteriores, hemos introducido una variable de tipo entera de valor 3 y las variables de color Yell, con el valor Yellow (amarillo), y Lemon con el valor Lime (verde lima).

Variables personalizadas vs variables predefinidas

Anteriormente, vimos la creación y el uso de las variables personalizadas. En el marco de MQL4, sin embargo, también hay una serie de variables predefinidas que no necesitamos declarar o inicializar. Si las usamos en el código, se vuelven de color rosa y automáticamente contienen el valor apropiado.

Estas variables contienen datos específicos sobre el mercado, el gráfico en el que se ejecuta el programa y otras características de la plataforma.

A continuación, encontrará una tabla con estas variables y los valores que contienen. Probablemente nunca usará algunas de ellas mientras que otras se utilizan en casi todos los programas.

Variable predeterminadaValor
DigitsEl número de posiciones decimales en el precio del mercado en el que se ejecuta el programa.
PointEl tamaño del punto del mercado en el que se ejecuta el programa.
LastErrorCódigo del último error.
PeriodEl marco de tiempo del gráfico en el que se ejecuta el programa.
_RandomSeedEstado del generador de números pseudoaleatorios.
_StopFlagBandera de stop del programa.
_SymbolEl nombre del símbolo (mercado) en el que se ejecuta el programa.
_UninitReasonEl motivo de la desinicialización.
AskEl último precio Ask conocido del mercado en el que se ejecuta el programa.
BarsEl número de barras del gráfico en el que se ejecuta el programa.
BidEl último precio Bid conocido del mercado en el que se ejecuta el programa.
Close[]La variable de tipo de matriz que contiene los precios de cierre de todas las barras del gráfico.
DigitsVer _Digits.
High[]La variable de tipo matriz que contiene los precios más altos de todas las barras del gráfico.
Low[]La variable de tipo matriz que contiene los precios más bajos de todas las barras del gráfico.
Open[]La variable de tipo de matriz que contiene los precios de apertura de todas las barras del gráfico.
PointVer _Point
Time[]La variable de tipo matriz que contiene los tiempos de apertura de todas las barras del gráfico.
Volume[]La variable de tipo matriz que contiene todos los volúmenes de las barras del gráfico.

El tema de las variables de tipo matriz es bastante importante en la programación en MQL4. Por lo tanto, merecen una explicación más detallada acerca de sus características y su uso. Ahora, explicaremos brevemente las diferencias entre las variables locales y globales.

Variables globales vs variables locales

Si una variable es global o local depende de la parte del programa en la que se declara. Si la variable se declara en el Header del código fuera del cuerpo de todas las funciones (hablamos sobre la estructura del programa en una sección anterior), es una variable global.

Dicha variable está disponible para todas las funciones del programa, tanto las principales como las personalizadas. En otras palabras, se puede utilizar con el mismo nombre y valor actual en todas las partes del programa.

Sin embargo, este tipo de variable global no debe confundirse con las variables globales que están disponibles incluso para toda la terminal Metatrader 4 y todos sus demás programas. Esas variables operan mediante un conjunto de funciones. Este tipo especial de variables se discutirá en un artículo separado.

Por el contrario, una variable local es una variable definida dentro de una de las funciones en el código. En ese caso, solo estará disponible para esa función. Si se usa en otra función, la variable no será detectada, o el compilador la marcará como un error y obligará al programador a repararla.

Esta otra función también puede tener una variable declarada con el mismo nombre pero su valor dependerá solo de las operaciones dentro de esta función.

Si necesita convertir el valor de una variable de una función a otra, puede hacerlo usando los parámetros de la llamada de función. Trataremos con más detalle este tema en la sección sobre funciones.

Como se mencionó anteriormente, en la próxima sección ampliaremos el tema de las variables de matriz que se utilizan con importantes variables predefinidas, como Open, High, Low, Close, Time y Volume.

Conclusión

Esperamos que este artículo le haya resultado útil y que ya esté interesado en construir su propio sistema automatizado de trading o indicador personalizado en Metatrader 4.

Planeamos actualizaciones periódicas en el futuro, así que no olvide estar atento a nuestro blog.