En MetaTrader hay tres tipos de programas: Experts Advisors (EA), indicadores y scripts. Cada tipo tiene su propósito y características particulares:
Estos son los tres tipos básicos de programas en MQL4 para MetaTrader, hay también otros más avanzados como las librerías, pero éstas las dejaremos por ahora.
En este artículo vamos a programar paso a paso un indicador muy simple, este indicador abrirá una nueva ventana adjunta a la gráfica de cotización en la que mostrará la diferencia en valor absoluto entre el precio de apertura de una barra y el precio de cierre. ¡Manos a la obra!
Se puede descargar el código del indicador y colocarlo en la carpeta “C:\Archivos de Programa\Metatrader\experts\indicators” o escribirlo desde cero. Para esto abrimos el MetaEditor con F4 y seleccionando “File >> New” creamos un nuevo “Custom indicator”, MetaEditor generará una plantilla de código muy útil pero que de momento podemos vaciar borrando todo el contenido para poder empezar desde cero.
Las primeras lineas de código que escribiremos son:
// Licencia #property copyright "GNU GPL v3.0 Programando Forex" #property link "http://www.programandoforex.com" // Propiedades generales #property indicator_separate_window #property indicator_buffers 1 #property indicator_color1 Red // Buffers double ExtMapBuffer1[];
Veamos qué significan estas lineas de código. Aquí lo importante son las propiedades generales y el buffer.
#property indicator_separate_windowEsta propiedad define si el indicador se va a dibujar sobre la gráfica de cotización o en una ventanita aparte, debajo de la gráfica. En nuestro caso queremos una ventana separada.
#property indicator_buffers 1 #property indicator_color1 Red // Buffers double ExtMapBuffer1[];
A continuación estas propiedades indican que vamos a utilizar un buffer gráfico para dibujar el indicador y que va a ser de color rojo. La última linea crea ese buffer. En próximos artículos describiremos los buffers gráficos, por ahora sabemos que ahí se va a guardar la información necesaria para dibujar la linea.
Ahora ya tenemos declaradas las variables principales, a continuación tenemos que darles un valor (inicializarlas). Como su nombre indica la función init() se ejecuta una única vez al inicio del programa indicador. Dentro de esta función inicializaremos las variables, como el estilo de dibujo de la linea del indicador. Además esta función tiene su contrapartida en la función deinit(), que se ejecuta cuando eliminamos un indicador de la gráfica, deinit() es el lugar indicado donde colocar código que borre lineas y dibujos de la gráfica, pero en este primer ejemplo no lo vamos a necesitar.
// Esto se ejecuta al cargar el indicador int init() { // Propiedades gráficas SetIndexStyle(0,DRAW_LINE); SetIndexBuffer(0,ExtMapBuffer1); // Mostrar una linea de texto sobre el indicador string nombre = "¡El primer indicador funcionando!"; IndicatorShortName(nombre); return(0); }
La primera linea especifica que el buffer número 0 (el primero) se va a dibujar como una linea (DRAW_LINE), también se pueden dibujar histogramas y otros símbolos. La segunda símplemente mapeará el indicador 0 en el buffer de nombre ExtMapBuffer1.
Finalmente llegamos a la función start() que se va a ejecutar cada tick.
int start() { // Variables double vOpen, vClose; // Contar número de barras int counted_bars = IndicatorCounted(); int pos = Bars - counted_bars; // Para cada barra dar un valor en el buffer while(pos>=0) { vOpen = Open[pos]; vClose = Close[pos]; ExtMapBuffer1[pos]= MathAbs(vOpen - vClose); pos--; } return(0); }
Aquí hay dos funciones muy importantes IndicatorCounted() y Bars. La función start() va a ir recorriendo desde la primera barra (la más antigua) hacia adelante, todas las barras que hay en la gráfica. Por eso necesitamos saber mediante Bars cuántas barras se muestran en la gráfica y con IndicatorCounted() cuántas hemos leido ya. Restando los valores de ambas funciones sabremos en qué posición estamos.
En las primeras lineas definimos dos variables en las que guardar los valores de la cotización. Por cada barra queremos saber el precio de apertura: Open[] y de cierre: Close[]. Para cada barra guardaremos esos valores en las variables vOpen y vClose.
ExtMapBuffer1[pos]= MathAbs(vOpen - vClose);
Por último en esta linea asignamos la diferencia del precio de apertura y de cierre (en valor absoluto: MathAbs()) a la posición del buffer correspondiente. MetaTrader se encargará de dibujar la linea leyendo cada valor de este buffer.
Con esto ya tenemos listo nuestro primer indicador, lo compilamos pulsando F5 y si lo hemos hecho todo bien aparecerá un mensaje informando que no ha habido errores. A continuación en nuestra ventana de MetaTrader en “Navigator>>Custom Indicators” aparecerá el indicador. Sólo tenemos que hacer doble click o arrastrarlo hasta un gráfico de cotización para verlo funcionar.
Espero que esta primera introducción haya sido útil, es un indicador muy simple y que aporta poca o nula información… en un próximo artículo lo complicaremos un poco más.