Bien, pasamos a la acción: si Vd. ha seguido el curso desde el principio, no debería tener problemas para crear su primer indicador en MQL4.

Eso sí, antes de ponernos manos a la obra es preciso repasar qué características poseen los indicadores en Metatrader:

  • Por un lado, existen indicadores que se dibujan sobre el propio gráfico, constan de una o varias líneas, sus valores pueden ser ilimitados y se representan con un color, grosor y estilo de línea definidos. Este sería el caso de una media móvil.
  • Por otro lado, tenemos indicadores que se dibujan en una nueva subventana mostrando una o varias líneas cuyo color, grosor y estilo pueden ser definidos, y cuyos valores están acotados. Tal sería el caso del RSI.
  • También tenemos indicadores en forma de histograma o que se representan mediante símbolos (flechas, círculos, etc.)


En definitiva podemos decir que un indicador consta de los siguientes parámetros:

  • Una o más líneas (que en MQL4 se denominan Buffers), pudiendo definir para cada una su aspecto, color, grosor y estilo.
  • La ventana en la que se trazará (sobre el gráfico o en una subventana)
  • En caso de que el indicador sea dibujado en una subventana, habrá que definir si el rango del indicador será limitado o se ajustará automáticamente la escala.


Teniendo en cuenta todo esto, comenzamos a crear nuestro primer indicador. Para ello abrimos el Metaeditor tecleando F4 y vamos a File->New. Se nos abrirá un asistente en el que debemos seleccionar Custom Indicator y darle a Siguiente. A continuación rellenamos los campos de Name, Author y Link. Justamente debajo de esos campos vemos un espacio en blanco que pone Parameters. Ahí podemos añadir variables que después se pueden modificar para que cualquier usuario pueda hacer cambios en los valores que definen el indicador.

Para nuestro ejemplo, pulsamos en Add y pondremos como nombre al parámetro, barsToProcess, y fijando su valor por defecto igual a 100, dejando el tipo de variable como int (entero). Le damos a Siguiente.

Ahora se nos piden dos cosas: por un lado, si queremos tener el indicador en una ventana aparte (para lo cual deberemos marcar Indicator in separate window) y por otro, el número de líneas (Indexes) de que constará el indicador. Debemos tener en cuenta que aunque pongamos que tiene 5 líneas no tienen porque dibujarse todas: podemos por ejemplo usar 3 para almacenar valores y 2 para representar el indicador en sí. Asimismo, el máximo de líneas que podemos poner es de 8. Para añadir una nueva línea haremos click en Add pero por defecto ya tenemos una, cuyo color podemos modificar (ponemos Azul por ejemplo) así como el tipo de representación (que por ahora dejaremos en Line).

Hacemos click en Finalizar y listo, ya tenemos definidos todos los parámetros del indicador. Veamos qué significa el código que acabamos de generar:

El encabezado recoge los datos del autor:

#property copyright "X-Trader"
#property link      "https://www.x-trader.net"


A continuación se enumeran las propiedades del indicador: debe dibujarse en una subventana, con una línea y en color azul marino (Navy):

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 Navy


Observese que el parámetro indicator_color va seguido de un número, que se corresponde con la línea (buffer) a la que afecta (ojo, la enumeración de los buffers comienza aquí en 1 y no en 0 como hasta ahora).

Seguidamente nos muestra los parámetros definidos:

//---- input parameters
extern int barsToProcess=100;


Definimos el buffer:

//---- buffers
double ExtMapBuffer1[];


Ahora comienza el código del indicador en sí. Si miramos el código completo veremos que consta de tres secciones diferenciadas: init(), deinit() y start(). Veamos en qué consiste cada una:

  • init() es una función que sólo será llamada una vez, en el momento de inicializar el indicador. En esta sección se comprueba que los valores de los parámetros son correctos y se prepara el indicador para cargar datos. No obstante no es obligatorio utilizarla por lo que si no lo vamos a usar podemos borrarla.
  • deinit() se utilizará para indicar qué debe suceder cuando borremos el indicador de un gráfico. De nuevo esta función no es obligatoria.
  • start() será llamada cada vez que aparezca un nuevo tick en el gráfico por lo que aquí es donde debemos poner las instrucciones que permitirán realizar los cálculos para obtener el valor del indicador.


Veamos que ha escrito el asistente dentro de cada una de las funciones:

En init() se ha especificado como se dibujará el buffer mediante la función SetIndexStyle. En este caso, con DRAW_LINE nos dibujará una línea. Observese que aquí la enumeración de los buffers vuelve a ser desde 0. Por su parte la función SetIndexBuffer asocia un array al buffer que habíamos definido. Finalmente return(0) finaliza la función init():

int init()
{
//---- indicators
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,ExtMapBuffer1);
//----
return(0);
}


En el caso de deinit() no tenemos nada (generalmente no utilizaremos demasiado esta función)

Ahora nos falta decirle qué es lo que debe dibujar. Con lo que vamos a poner dentro de start() vamos a dibujar un indicador que represente números aleatorios. El código que debe aparecer en esa sección es el siguiente:

int start()
{ int counted_bars=IndicatorCounted();
for(int i=0;i<Bars;i++)
{ ExtMapBuffer1[i]=MathRand()%1001; }
return(0); }


Un poco más adelante veremos que significa todo esto. De momento vamos a compilar el indicador tecleando F7. Una vez hecho esto, vamos a Metatrader, abrimos el Navigator (Ctrl+N) y desplegamos Custom Indicators. En esa lista debe aparecer el indicador con el nombre que le hayan dado. Le seleccionamos, pulsamos botón derecho en el ratón y hacemos click en Attach to a chart. En la ventana que nos aparece hacemos click en Aceptar. El resultado debería ser algo como esto:

 

 

Bien veamos qué significa el código que hemos introducido en start(). Comenzamos con un bucle de tipo for, comenzando en la última barra (i=0) y finalizando en la primera disponible (i<Bars) incrementando una unidad el contador (i++):

for(int i=0;i<Bars;i++)

En cada iteración del bucle asignamos a cada elemento del buffer (que se corresponde con la correspondiente barra del gráfico) un número aleatorio entre 0 y 1000:

{     ExtMapBuffer1[i]=MathRand()%1001;  }

Obsérvese que cada vez que entra un nuevo tick, el oscilador cambia por completo ya que depende de la función MathRand(). Si no quisieramos que esto sucediera (cosa más que probable ya que el consumo de recursos del ordenador se dispararía) podríamos utilizar el siguiente código:


int start()
{ int counted_bars=IndicatorCounted(),
limit;
if(counted_bars>0)
counted_bars--;
limit=Bars-counted_bars;
for(int i=0;i<limit;i++)
{ ExtMapBuffer1[i]=MathRand()%1001; }
return(0); }

Donde se ha introducido la función IndicatorCounted() que nos dice cuantas barras no se han modificado desde que se llamó a la función start(). Ahora el bucle for depende de la variable limit que almacena el número de barras que están modificándose en el momento de calcular el indicador.

Finalmente, seguro que recuerdan que hemos introducido un parámetro llamado barsToProcess que todavía no aparece en el código. Pues bien, ha llegado el momento de usarlo, veamos el siguiente código:

int start()  
{     int counted_bars=IndicatorCounted(),         
limit;        
if(counted_bars>0)        
counted_bars--;          
limit=Bars-counted_bars;          
if(limit>barsToProcess)        
limit=barsToProcess;         
for(int i=0;i<limit;i++)     
{ExtMapBuffer1[i]=MathRand()%1001;}
return(0);  }


Ahora lo que hacemos es comprobar si limit es mayor que barsToProcess. En caso afirmativo hacemos que limit sea igual a barsToProcess. De esta forma podemos aplicar el indicador a las últimas n barras que deseemos.

 

(Continuará...)


Un saludo,
X-Trader

 

 


Si te ha gustado este articulo, ¡compártelo en redes!