Cómo programar un Expert Advisor en Metatrader

2

En este artículo vamos a crear un Expert Advisor muy simple que utilizará como señal un indicador por cruce de Medias Móviles Exponenciales (EMA).

Las EMA son un indicador técnico básico en los sistemas de trading, son medias del precio de las últimas x barras, pero ponderando el peso de cada barra con una función exponencial. Es decir, en la media cuenta mucho más la última barra que la penúltima y a su vez la penúltima barra cuenta mucho más que la antepenúltima.

Si tenemos dos lineas de EMA, una con un periodo de barras mayor que la otra podemos utilizar como señal el cruce de la EMA corta por la larga. Si la EMA corta cruza a la larga de abajo a arriba será señal de compra y si al contrario la cruza de arriba a abajo será señal de venta.

Nuestro Expert Advisor ejecutará su código a cada nueva apertura de barra, cada vez que detecte un cruce abrimos una única operación, cuando se vuelve a dar el cruce contrario cerramos esa operación y abrimos una nueva en contrario. Simple.

Lo básico es obtener la señal de cruce. Para eso utilizamos la función iMA que nos devuelve el valor de las lineas EMA. Para saber si dos lineas se han cruzado necesitamos saber el valor de cuatro puntos. Por ejemplo podemos tomar el valor de la linea larga hace 3 barras y hace 1 y comprararlos con los valores de la linea corta en las mismas barras:

// Tomamos datos de las dos EMAs (Corta y Larga).
double emaLargaA = iMA(NULL,0,LargaEMA,0,1,4,3);
double emaLargaB = iMA(NULL,0,LargaEMA,0,1,4,1);
double emaCortaA = iMA(NULL,0,CortaEMA,0,1,4,3);
double emaCortaB = iMA(NULL,0,CortaEMA,0,1,4,1);

// Calculamos si se han cruzado
if(emaCortaA < emaLargaA && emaCortaB > emaLargaB)
  señal = 0; // ema corta cruza de abajo a arriba.
else if(emaCortaA > emaLargaA && emaCortaB < emaLargaB)
  señal = 1; // ema corta cruza de arriba a abajo.
else
  señal = -1; // no hay cruce.

Una vez hemos obtenido la señal: 0 para compra, 1 para venta, -1 no hay señal. Abriremos una operación si no hay ninguna abierta y si la señal era de compra o venta.

// Si no hay órden abierta y hay señal podemos operar.
if(OrdersTotal() == 0 && señal != -1)
{
  if(señal == 0) // Señal 0 -> COMPRA
    ticket = OrderSend(Symbol(),OP_BUY,Size,Ask,3,0,0,NULL,23,0,Green);
  else if(señal == 1) // Señal 1 -> VENTA
    ticket = OrderSend(Symbol(),OP_SELL,Size,Bid,3,0,0,NULL,23,0,Green);
}

Una vez abierta la orden comprobaremos cuándo ha llegado una señal contraria para cerrarla.

// Si hay una orden abierta y hay señal en contra cerramos
if(OrdersTotal() != 0 && señal != -1)
{
// Seleccionamos la orden.
OrderSelect(ticket,SELECT_BY_TICKET);

//Comprobamos si la señal es contraria
if(OrderType() == 0 && señal == 1)
  OrderClose(ticket,Size,Bid,3,Yellow); // Cerramos la compra.
if(OrderType() == 1 && señal == 0)
  OrderClose(ticket,Size,Ask,3,Yellow); // Cerramos la venta.
}

Este código sencillo, que podeis descargar al final del artículo, se ejecutará a cada nueva barra de cotización como vimos en el artículo anterior.

En el código completo hay un par de elementos clave para el funcionamiento del Expert Advisor. Vamos a detallarlos:

  • static int ticket; Definimos como estática la variable ticket para que no cambie a cada ejecución de la función start (esto es a cada nuevo tick). En esta variable guardamos el ticket de la última operación abierta para poder referenciarla posteriormente a la hora de cerrarla (cuando llegue la señal en contrario).
  • OrderSelect(ticket,SELECT_BY_TICKET); Seleccionamos la orden utilizando el ticket anterior, con esto ya tenemos acceso a varias funciones que nos devuelven datos sobre la orden. Inmediatamente utilizaremos la función OrderType() para conocer si la orden es de compra o venta y compararlo con la señal del cruce de medias.

Como se ve, el Expert Advisor es bastante simple y en el periodo de tiempo elegido y el par EUR/USD da muy buenos resultados:

En cualquier otro par vemos que falla como una escopeta de feria… así que ¡ojo con los falsos positivos! Hacer dinero en Forex no es tan fácil pero este código puede servirnos de base para crear muchos otros Expert Advisors.

Share.

About Author

2 Comments

Leave A Reply