MQL4 para Novatos I

(NOTA: Si no sabe qué es Metatrader, le recomiendo que eche un vistazo a ese artículo antes de empezar con este)

Lo primero de todo, recordemos qué podemos hacer utilizando este lenguaje. Con MQL4 podemos crear:

  • Scripts: se trata de secuencias de comandos que permiten tareas de forma automatizada.
  • Custom Indicators: se trata de los indicadores que nosotros diseñemos.
  • Expert Advisors: o lo que es lo mismo, sistemas de trading automáticos.
  • Libraries: son conjuntos de funciones creadas para desarrollar una tarea específica.


En este primer artículo, vamos a ver cómo se crean sencillos scripts y simultáneamente iremos viendo los fundamentos básicos de este lenguaje. Para ello, utilizaremos el editor de MQL que incorpora Metatrader, denominado MetaEditor 4. Para arrancarlo, basta con entrar en Metatrader y presionar la tecla F4. Una vez dentro de MetaEditor vamos a File->New. Nos aparecerá el siguiente asistente:

Image


Seleccionamos Script y le damos a Siguiente. En la siguiente ventana introducimos los datos que nos pide y le damos a Finalizar:

Image


Con ello inicializamos la ventana del script para empezar a programar en ella:

Image


Observe que hay algunas líneas en gris que vienen precedidas por el símbolo “//”. Ello significa que están comentadas y que serán ignoradas de cara a procesar los comandos; en particular, delante de cualquier línea en la que pongamos el símbolo “//” podremos introducir nuestros propios comentarios.


Código Fuente, Compilación y Otras Cosas del Montón
Por si alguno no lo sabe todavía: lo que vamos a escribir en MetaEditor se denomina código fuente, es decir, se trata de una secuencia de comandos que nosotros podemos comprender al estar escrito en un lenguaje de programación. Sin embargo, Metatrader no lo comprenderá a menos que lo traduzcamos a su propio idioma. Esta traducción de comandos, denominada compilación, se consigue pulsando la tecla F5 en MetaEditor. Una vez compilado el código, se genera un archivo especial que es el que lee Metatrader.

Una vez compilado un script, bastará con que vayamos a Metatrader y entremos en el menú View->Navigator. En la ventana que nos aparecerá a la izquierda del gráfico, haremos click en Scripts y se desplegará la lista de todos los que tengamos. Haciendo doble click en ellos ejecutaremos la secuencia de comandos que hayamos creado.

Bien, volvamos a la ventana de Metaeditor donde teníamos el punto de partida del script. Los comandos que deseemos incluir deben escribirse siempre entre las líneas int start(){ y return(0);}

 

Variables
Ahora que ya sabemos donde escribir, veamos cómo introducir variables. Básicamente el esquema que debemos usar es el siguiente:

[tipo variable] [nombre variable] = [valor variable];

Dentro de los tipos de variables tenemos los siguientes: int (entero), double (doble precisión), string (cadena de texto) y bool (booleano).

Veamos un ejemplo: si deseamos definir el tamaño de un stop para el EUR/USD. Para ello, podemos escribir:

double stoplosseurus = 0.0025;

En algunos casos, puede que no sea necesario asignar un valor inicial a la variable; así por ejemplo podemos escribir simplemente:

double stoplosseurus ;

Y asignarle posteriormente un valor.

Conviene recordar que en MQL4 se distingue el uso de mayúsculas y minúsculas por lo que las siguientes expresiones:
double HIGHPRICE; double highprice; double HighPrice; double highPrice;

declararán cuatro variables diferentes.

Asimismo, los nombres de las variables no pueden comenzar por números o símbolos.

Por último hay que tener en cuenta que las palabras del lenguaje MQL4 deben ir siempre en minúsculas. Por ejemplo, las expresiones:

DOUBLE hightPrice1;  Double hightPrice2;

producirán un error al compilar.


Una vez declaradas las variables, veamos qué se puede hacer con ellas:

Operaciones aritméticas

//Declaramos variables para el ejemplo
double a = 50.0;
double b = 2.0;   
double c;

// Suma(+): en la variable c sumamos los valores de a y b, obtenemos el valor 52.0
c = a + b;      

// Resta(-): en la variable c restamos los valores de a y b, obtenemos el valor 48.0  
c = a - b;      

// Multiplicación(*): en la variable c multiplicamos a por b, obtenemos el valor 100.0
c = a*b;        

// División(/): en la variable c dividimos el valor de a por b, obtenemos el valor 25.0   
c = a / b;

// También podemos combinar operaciones tal que c ahora valdría 104.0
c = (a + b)*b;

Generación de ventanas con mensajes
Todas las operaciones que acabamos de ver son realizadas correctamente cuando ejecutamos este script en Metatrader. Sin embargo, al ejecutarlo no tendremos ninguna confirmación visual de que todo va bien. Para ello, necesitamos utilizar una función muy útil, MessageBox().

Mediante dicha función podemos generar ventanas con mensajes informativos del estado de una secuencia de comandos. El esquema para utilizar esta función es el siguiente:

MessageBox("Mensaje que queremos mostrar.","Título de la Ventana");

Veamos un ejemplo de cómo podríamos utilizar esta función con el siguiente código:

int a = 50;   
int b = 100;     
MessageBox("Muy fácil. a+b=" + (a + b), "Resultado de la Suma");  

Como resultado obtenemos la siguiente ventana:

Image


Vectores (Arrays)
Pasamos a ver cómo se declaran vectores en MQL. El esquema para ello es el siguiente:

(Tipo de array) (Nombre del array) [Nº de elementos];

Por ejemplo, la sentencia:

double price[5];

nos creará un vector de 5 elementos de tipo Double.

¿Cómo podemos hacer referencia a cada uno de los componentes del array y darles un valor? Muy fácil: una vez hemos declarado el array "price" del ejemplo anterior, podemos dar un valor a su primer elemento de la siguiente forma:

price[0] = 1.2341;

Obsérvese que los índices de los arrays empiezan en 0, de tal forma que dicho valor se corresponde con el primer elemento del array. Del mismo price[1] = 1.2321; nos asignaría un valor al segundo elemento del array y así sucesivamente.

Por supuesto, podemos declarar un array asignándole valores iniciales:

double price[2] = {1.2234, 1.2421};

Aunque también es posible no especificar el número de elementos y dejar que Metatrader lo determine:

double price[] = {1.2234, 1.2421};

Asimismo, con los arrays también podemos realizar las mismas operaciones que hacíamos con las variables como se muestra en los siguientes ejemplos:

double price[2];
price[0] = 1.2234;   
price[1] = 1.2421;     
MessageBox("El precio medios es " + (price[0] + price[1]) / 2.0,"Precio medio");

Variables y Arrays de Serie
En el lenguaje MQL, existe una serie de variables y arrays que vienen de serie y que nos serán de gran utilidad a la hora de crear nuestro propio código:

double Open[];  // array de precios de apertura  
double High[]; // array de máximos
double Low[]; // array de mínimos.
double Close[]; //array de precios de cierre
double Volume[]; // array de volúmenes.
double Bid  // Último precio de compra
double Ask  // Último precio de venta

Por supuesto, podemos hacer referencia a un determinado valor del array; así, por ejemplo, High[0] hace referencia al último máximo del precio. El siguiente gráfico seguramente termine de aclararles del todo el asunto:

Image


Cómo pueden observar cada barra está indexada, siendo la barra 0 la última, la barra 1 la penúltima, etc.

 



Bucles
Veamos ahora como crear una estructura de bucle (loop) en MQL. Recordemos que este tipo de estructura puede ser tipo For o While; ésta última la veremos en próximos artículos.

La estructura general de un bucle de tipo For en MQL es la siguiente:

for(Declaración de Contador; Condiciones para el bucle; Incremento del contador)    
{      
Código que se ejecutará en el bucle
}

Veamos en detalle la estructura anterior:

 

  • Declaración del Contador: siempre utilizaremos una variable de tipo int para el contador, que normalmente siempre será inicializada en 0.
  • Condiciones para el bucle: aquí indicaremos la condición o condiciones que, en caso de verificarse, permitirán que el bucle continúe ejecutándose; en caso contrario, el bucle finalizará.
  • Incremento del contador: aquí indicaremos en qué cantidad se incrementará el contador cada vez que termine un bucle. Normalmente, salvo que sea un caso especial, añadiremos una unidad al contador lo que se consigue añadiendo dos signos positivos (++) detrás del nombre de la variable que actúe como contador.


Seguramente un ejemplo aclare todo esto: supongamos que queremos calcular la media de todos los máximos que hay en el gráfico; lo haríamos del siguiente modo:

//Declaramos una variable para almacenar los máximos y la media

double CumHigh = 0.0;
double AveragePrice=0.0;

// Iniciamos el bucle: damos valor inicial 0 a la variable contador a, produciéndose el final del bucle se alcance el
// número total de barras que haya en el gráfico (Bars) y sumando una unidad a en cada iteración.
// En la variable CumHigh sumamos la barra de a periodos atras.

for(int a = 0; a < Bars; a++)
{ CumHigh += High[a]; }

// Calculamos la media dividiendo la suma total entre el nº de barras

AveragePrice = CumHigh/Bars;



Condiciones
Veamos ahora cómo se construyen condiciones en MQL. Básicamente la estructura es similar a la de otros lenguajes, utilizando la palabra If, por lo que un ejemplo debería ser suficiente para entenderlo:


int a = 10;  
int b = 0;     
if(a > 10 )    
{      b = 1;    }  
else    
{      b = 2;    }     
MessageBox("b=" + b,"."); 

En el ejemplo anterior, la condición viene entre paréntesis después de la palabra If. Dado que la condición es falsa (ya que a es igual a 10), al final del script, el valor de b será 2 ya que si no se verifica la condición pasamos al valor Else, que es el que nos determina qué sucederá si a es menor o igual a 10.

En MQL podemos utilizar diferentes operadores para realizar comparaciones: == (igual), != (distinto), > (mayor) , < (menor) , >= (mayor o igual) y <= (menor o igual).

Veamos un ejemplo en el que ahora se incluye un bucle dentro de una condición:

int a=0;
double b=0.0;
bool e;
if(a==0)
{ for(int c=0;c<Bars;c++)
{ b+=High[c]; }
if(b>500.0)
{ e=true; }
else
{ e=false; } }

El código anterior suma los máximos del gráfico si a es igual a 0; posteriormente si la suma es superior a 500.0 devuelve el valor verdadero mediante la variable e, o falso en caso contrario.

Por supuesto, las condiciones se pueden superponer unas sobre otras como en el siguiente ejemplo:

int a=0;
int result;
if(a==0)
{ result=1; }
else if(a==1)
{ result=2; }
else if(a==2)
{ result=3; }
else { result=4; }



Las condiciones se pueden complicar aún más introduciendo los valores lógicos && (AND) y || (OR). Por ejemplo:

int a=10;  
int b=20;     
if ( ((a>5) || (a<15)) && ( b==20))    
MessageBox("Me ha salido bien!","Ejemplo del uso de AND y OR");

En el próximo artículo veremos cómo construir complejas expresiones así como algunas aplicaciones.

(Continuará...)

Un saludo,
X-Trader 

Artículos Relacionados


¿Adiós Metatrader 4?

¿Adiós Metatrader 4?

Parece que los rumores comienzan a ser ciertos: la versión 4 de Metatrader no tiene cabida en los futuros planes de negocio de MetaQuotes. En este artículo, todos los detalles al respecto.

Novedades Metatrader 4

Novedades Metatrader 4

Atentos a las últimas versiones aparecidas tras la compilación 574 de Metatrader4, ya que viene con importantes novedades que si no las tenemos en cuenta pueden provocar que nuestros EAs e...

Tickstory

Tickstory

Andrest nos descubre una excelente herramienta para nuestra Metatrader: se trata de Tickstory, programa con el que vamos a poder descargar históricos desde el servidor de Dukascopy y exportarlos a...

Bug en Metatrader 4

Bug en Metatrader 4

Recientemente MetaQuotes ha lanzado la versión 418 de Metatrader 4. Si no se han actualizado aún a la nueva versión, no lo hagan ya que incluye un importante error que impide que la mayoría de...

R para Traders I

R para Traders I

En el trading cada vez se requiere el uso de herramientas más sofisticadas y potentes para el análisis de datos. Es aquí donde entra R, un entorno de programación GNU que nos facilitará enormemente...

Lenguajes de Programación para HFT

Lenguajes de Programación para HFT

Mucho se ha hablado y especulado sobre el High Frequency Trading pero muy pocos conocen realmente en qué lenguajes se programan los algoritmos utilizados en este tipo de trading. Como veremos en...