Programacion Expert Advisor Metatrader MQL4 Para Noobs

download Programacion Expert Advisor Metatrader MQL4 Para Noobs

of 39

Transcript of Programacion Expert Advisor Metatrader MQL4 Para Noobs

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    1/39

    MQL4 para Novatos I

    (NOTA: Si no sabe qu esMetatrader, le recomiendo que eche un vistazo aeste artculo antes de empezar con ste)

    Lo primero de todo, recordemos qu podemos hacer utilizando estelenguaje. Con MQL4 podemos crear:

    Scripts: se trata de secuencias de comandos que permiten tareas deforma automatizada.

    Custom Indicators: se trata de los indicadores que nosotros diseemos. Expert Advisors: o lo que es lo mismo, sistemas de trading automticos. Libraries: son conjuntos de funciones creadas para desarrollar una

    tarea especfica.

    En este primer artculo, vamos a ver cmo se crean sencillos scripts ysimultneamente iremos viendo los fundamentos bsicos de este lenguaje.Para ello, utilizaremos el editor de MQL que incorpora Metatrader,denominado MetaEditor 4. Para arrancarlo, basta con entrar en Metatradery presionar la tecla F4. Una vez dentro de MetaEditor vamos a File->New. Nosaparecer el siguiente asistente:

    Seleccionamos Script y le damos a Siguiente. En la siguiente ventana

    introduc imos los datos que nos pide y le damos a Finalizar:

    http://www.x-trader.net/cms/articulos/software-y-tecnologia/metatrader.htmlhttp://www.x-trader.net/cms/articulos/software-y-tecnologia/metatrader.html
  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    2/39

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

    Observe que hay algunas lneas en gris que vienen precedidas por el smbolo//. Ello significa que estn comentadas y que sern ignoradas de cara aprocesar los comandos; en particular, delante de cualquier lnea en la que

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    3/39

    pongamos el smbolo // podremos introducir nuestros propios comentarios.Cdig o Fuente, Com p i la c in y O tra s Co sa s d el Mo ntnPor si alguno no lo sabe todava: lo que vamos a escribir en MetaEditor sedenomina c d igo fuente, es decir, se trata de una secuencia de comandosque nosotros podemos comprender al estar escrito en un lenguaje de

    programacin. Sin embargo, Metatrader no lo comprender a menos que lotraduzcamos a su propio idioma. Esta traduccin de comandos,denominada c om p ila c in, se consigue pulsando la tecla F5 en MetaEditor.Una vez compilado el cdigo, se genera un archivo especial que es el quelee Metatrader.

    Una vez compilado un script, bastar con que vayamos a Metatrader yentremos en el men View->Navigator. En la ventana que nos aparecer ala izquierda del grfico, haremos click en Scripts y se desplegar la lista detodos los que tengamos. Haciendo doble c lick en ellos ejecutaremos lasecuencia de comandos que hayamos creado.

    Bien, volvamos a la ventana de Metaeditor donde tenamos el punto departida del script. Los comandos que deseemos incluir deben escribirsesiempre entre las lneas int start(){y return(0);}

    VariablesAhora que ya sabemos donde escribir, veamos cmo introducir variables.Bsicamente 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 precisin), string (cadena de texto) y bool (booleano).

    Veamos un ejemplo: si deseamos definir el tamao 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 lavariable; as por ejemplo podemos escribir simplemente:

    double stoplosseurus ;

    Y asignarle posteriormente un valor.

    Conviene recordar que en MQL4 se distingue el uso de maysculas yminsculas por lo que las siguientes expresiones:

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    4/39

    double HIGHPRICE; double highprice; double HighPrice; double highPrice;

    declararn cuatro variables diferentes.

    Asimismo, los nombres de las variables no pueden comenzar por nmeros o

    smbolos.

    Por ltimo hay que tener en cuenta que las palabras del lenguaje MQL4deben ir siempre en minsculas. Por ejemplo, las expresiones:

    DOUBLE hightPrice1; Double hightPrice2;

    producirn un error al compilar.

    Una vez declaradas las variables, veamos qu se puede hacer con ellas:Op e ra c io ne s a ritmtic a s

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

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

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

    // Multiplicacin(*): en la variable c multiplicamos a por b, obtenemos elvalor 100.0c = a*b;

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

    // Tambin podemos combinar operaciones tal que c ahora valdra 104.0c = (a + b)*b;

    Gene ra c in d e venta na s c on m ensa jesTodas las operaciones que acabamos de ver son realizadas correctamentecuando ejecutamos este script en Metatrader. Sin embargo, al ejecutarlo no

    tendremos ninguna confirmac in visual de que todo va bien. Para ello,necesitamos utilizar una funcin muy til, MessageBox().

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    5/39

    Mediante dicha funcin podemos generar ventanas con mensajesinformativos del estado de una secuencia de comandos. El esquema parautilizar esta funcin es el siguiente:

    MessageBox("Mensaje que queremos mostrar.","Ttulo de la Ventana");

    Veamos un ejemplo de cmo podramos utilizar esta funcin con el siguientecdigo:

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

    Como resultado obtenemos la siguiente ventana:

    Vec tores (Arra ys)

    Pasamos a ver cmo se dec laran vectores en MQL. El esquema para ello esel siguiente:

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

    Por ejemplo, la sentencia:

    double price[5];

    nos crear un vec tor de 5 elementos de tipo Double.

    C mo podemos hacer referencia a cada uno de los componentes delarray y darles un valor? Muy fcil: una vez hemos declarado el array "price"del ejemplo anterior, podemos dar un valor a su primer elemento de lasiguiente forma:

    price[0] = 1.2341;

    Obsrvese que los ndices de los arrays empiezan en 0, de tal forma quedicho valor se corresponde con el primer elemento del array. Del mismo

    price[1] = 1.2321; nos asignara un valor al segundo elemento del array y assucesivamente.

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    6/39

    Por supuesto, podemos declarar un array asignndole valores iniciales:

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

    Aunque tambin es posible no especificar el nmero de elementos y dejar

    que Metatrader lo determine:

    double price[] = {1.2234, 1.2421};

    Asimismo, con los arrays tambin podemos realizar las mismas operacionesque hacamos con las variables como se muestra en los siguientes ejemplos:

    double price[2];price[0] = 1.2234;price[1] = 1.2421;

    MessageBox("El prec io medios es " + (price[0] + price[1]) / 2.0,"Precio medio");Va riab les y Arra ys de SerieEn el lenguaje MQL, existe una serie de variables y arrays que vienen de seriey que nos sern de gran utilidad a la hora de crear nuestro propio cdigo:

    double Open[]; // array de prec ios de aperturadouble High[]; / / array de mximosdouble Low[]; / / array de mnimos.double C lose[]; / /array de precios de cierredouble Volume[]; / / array de volmenes.double Bid // ltimo prec io de compradouble Ask // ltimo prec io de venta

    Por supuesto, podemos hacer referencia a un determinado valor del array;as, por ejemplo, High[0] hace referencia al ltimo mximo del precio. Elsiguiente grfico seguramente termine de aclararles del todo el asunto:

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    7/39

    Cmo pueden observar cada barra est indexada, siendo la barra 0 laltima, la barra 1 la penltima, etc.

    MQL4 para Novatos II

    BuclesVeamos ahora como crear una estructura de bucle (l oop) en MQL.Recordemos que este tipo de estructura puede ser tipo For o While; staltima la veremos en prximos artculos.

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

    for(Declaracin de Contador; Condiciones para el bucle; Incremento delcontador){

    Cdigo que se ejecutar en el bucle}Veamos en detalle la estructura anterior:

    Declaracin del Contador: siempre utilizaremos una variable de tipo intpara el contador, que normalmente siempre ser inicializada en 0.

    Condiciones para el bucle: aqu indicaremos la condicin ocondiciones que, en caso de verificarse, permitirn que el buc lecontine ejecutndose; en caso contrario, el bucle finalizar.

    Incremento del contador: aqu indicaremos en qu cantidad seincrementar el contador cada vez que termine un bucle.Normalmente, salvo que sea un caso especial, aadiremos una

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    8/39

    unidad al contador lo que se consigue aadiendo dos signos positivos(++) detrs del nombre de la variable que acte como contador.

    Seguramente un ejemplo aclare todo esto: supongamos que queremos

    calcular la media de todos los mximos que hay en el grfico; lo haramosdel siguiente modo:

    //Declaramos una variable para almacenar los mximos y la media

    double CumHigh = 0.0;double AveragePrice=0.0;

    // Iniciamos el bucle: damos valor inicial 0 a la variable contador a,producindose el final del bucle se alcance el// nmero total de barras que haya en el grfico (Bars) y sumando unaunidad a en cada iterac in.// 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;

    Cond ic ionesVeamos ahora cmo se construyen condiciones en MQL. Bsicamente laestructura es similar a la de otros lenguajes, utilizando la palabra If, por lo queun ejemplo debera 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 condicin viene entre parntesis despus de lapalabra If. Dado que la condicin es falsa (ya que a es igual a 10), al finaldel script, el valor de b ser 2 ya que si no se verifica la condicin pasamos alvalor Else, que es el que nos determina qu suceder si a es menor o igual a10.

    En MQL podemos utilizar diferentes operadores para realizar comparaciones:

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    9/39

    == (igual), != (distinto), > (mayor) , < (menor) , >= (mayor o igual) y 5) | | (a

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    10/39

    Bucles de tipowhile

    Las estructuras de tipo whilepueden sernos tiles en muchas ocasiones. Suforma general es:

    while(condicin){ cdigo a ejecutar mientras se d la condicin }La principal diferencia de este tipo de estructura con los buc les de tipo fo resque no existe una variable contador. Por tanto, si no necesitamos uncontador podemos ahorrarnos trabajar con fo ry usar una bucle while. Amedida que avancemos en la serie iremos viendo ejemplos de este tipo deestructura.

    Un nuevo tipo de condiciones. El operador switch.Con el operador sw itc h, podemos ahorrarnos complejas estructurascompuestas por varios ify else. Fundamentalmente la estructura de tiposw itc hes utilizada cuando necesitamos realizar una tarea en funcin delvalor de una variable. Por ejemplo, supongamos que deseamos crear unsistema cuyo comportamiento vara en funcin de la situac in en qu est elmercado. As, declaramos la variable que toma valores enteros, marketState:

    int marketState

    Que puede tomar los siguientes valores:

    1, si el mercado es alcista2, si el mercado es bajista3, si el mercado est sin tendencia

    Si ahora creramos el sistema combinando varios ify e lsetendramos que:

    if (marketState == 1){ // Estrategia Mercado Alcista }

    else if(marketState == 2){ // Estrategia Mercado Bajista }else if(marketState == 3){ // Estrategia Mercado sin Tendencia }else { // Error: no se consideran otras posibilidades }Como podemos ver, todas las condiciones dependen de una nica variabley en todas se compara su valor con un significado asoc iado a l. En este tipode situaciones, las estructuras de tipo sw itc hson mucho ms eficaces:

    switch(marketState)

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    11/39

    {case 1: // Estrategia Mercado Alcistabreak;case 2: // Estrategia Mercado Bajistabreak;

    case 3: // Estrategia Mercado sin Tendenciabreak;default: // Error: no se consideran otras posibilidadesbreak;}Obsrvese en el ejemplo anterior que hemos definido previamente lavariable de estado marketState.

    En general, las estructuras de tipo sw itc hpresentan la siguiente forma:

    switch(variable de estado){ case [valor de la variable]: / / Cdigo a ejecutar para este caso

    break;case [otro valor de la variable]: / / Cdigo a ejecutar para este casobreak;default: // Cdigo para el resto de casosbreak; }

    Ms operadores: cont inuey breakAcabamos de ver en la estructura sw itc hel uso del operador b reak. Perob reakpuede utilizarse no slo dentro de una estructura de ese tipo sino engeneral para salir de cualquier tipo de bucle. Por ejemplo, supongamos quenecesitamos saber cul es la ltima barra hasta la que el volumennegociado acumulado ha sido mayor o igual a 1000. Para ello podemosutilizar el siguiente cdigo:

    int a = 0;double volume = 0.0;

    while(a < Bars){// Si la variable volume supera 1000 points, salimos del bucle whileif(volume > 1000.0)break;volume = volume + Volume[a];// Alternativamente para acumular valores en una variable tambin// podemos escribir tambin volume += Volume[a];a++; }

    El otro operador relacionado con este tipo de tareas es c o nt inue, el cual seutiliza para omitir iteraciones no deseadas. Supongamos que queremos

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    12/39

    obtener el volumen total de las barras mostradas en el grfico peroignorando aquellas barras cuyo volumen sea superior a 50. Para ello,utilizaramos el siguiente cdigo:

    int a = -1;

    double volume = 0.0;while(a < Bars){ a++;// Si el volumen supera el valor 50, omitimos esa barraif(Volume[a] > 50.0)continue;volume += Volume[a]; }

    Escribiendo nuestras propias funcionesNormalmente nos encontraremos con situac iones en las que veremos que serepite el cdigo varias veces. Para ahorrarnos tiempo tecleando podemoscrearnos funciones para llamarlas en los momentos que las necesitemos.Veamos un ejemplo para entenderlo.

    Supongamos que deseamos saber el color de la ltima vela aparec ida en elgrfico. Para ello, dec laramos una variable booleana (tan slo hay doscasos posibles, blanco o negro) tal que:

    bool color;// Suponemos que color = false se corresponde con una vela negraif(Close[0] > Open[0])color = true;if(Open[0] > Close[0])color = false;

    Si quisieramos saber el color de la vela en otra regin del grfico (porejemplo, hace 5 velas), deberamos reemplazar [0] por el valorcorrespondiente. Pero qu pasara si necesitramos hacerlo para todas lasvelas del grfico? Es en este tipo de situac iones en las que necesitamosrecurrir a funciones. Vamos a crear una funcin que nos permitir determinarel color de cualquier vela:

    bool color;color = GetColor(0);

    Como podemos ver, en lugar de imponer la condicin para obtener el valorde la variable color, lo que hacemos es crear una funcin que nos devolverel valor (true/ false - blanco/negro) y que se llamar GetColor. Obsrveseque posee un argumento (el cero entre parntesis) hace referencia a laltima barra del grfico.

    La estructura general de una funcin en MQL4 es la siguiente:

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    13/39

    [tipo de valor devuelto] [nombre de la funcin] ([lista de argumentos]){ // cdigo de la funcin

    return([valor a devolver]); }

    Veamos cmo escribiramos la funcin GetColor:

    bool GetColor(int index){ bool color;if(Close[index] > Open[index])color = true;if(Open[index] > Close[index])color = false;return(color); }

    Seguramente les llame la atencin la primera lnea, en la que aparece intindex entre parntesis. Sin embargo, cuando llamamos a la funcin,habamos escrito simplemente GetColor(0). Qu es lo que ocurre?Sencillamente que cuando hemos escrito la funcin, hemos definido con lavariable index el tipo de argumento que rec ibir la funcin (en este caso detipo int Entero).

    Por supuesto, si necesitaramos ms argumentos porque estuviramosescribiendo una funcin ms compleja, simplemente bastara conintroducirlos separados por comas. Por ejemplo:

    bool FuncionC omplicada(int Argumento1, int Argumento2, stringArgumentostring)

    Si quisieramos que la funcin no devuelva ningn valor utilizaremos elcomando void:

    void function() { // code }

    Tambin podemos establecer valores por defecto para los argumentos de lafuncin. Por ejemplo:

    void FuncionA(int argumento1, int argumento2, int argumentoespecial =50){ // code }Si tuvieramos que llamar a la funcin FuncionA, no sera necesario pasarle unvalor al tercer argumento (argumentoespecial) ya que tiene asignado unvalor igual a 50 por defecto.

    En todo caso, debemos recordar que los argumentos que tengan valores

    asignados por defecto deben aparecer siempre a l final de la lista deargumentos.

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    14/39

    Arrays multidimensionalesEn MQL4 tambin podemos trabajar con arrays de varias dimensiones, esdecir, matrices de datos. Un ejemplo de array multidimensional sera el

    siguiente:

    [0] 10 20 30

    [1] 40 50 60

    [2] 70 80 90

    [0] [1] [2]

    Los nmeros que aparecen entre corchetes indican cmo son los ndicesutilizados para referenciar filas y columnas en MQL4. As, el elemento [0] [1]sera 20, el elemento [1] [2] sera 60 y as sucesivamente.

    Para crear una matriz como la anterior en MQL4, tenemos el comandoarray2D[num filas] [num columnas] tal que:

    int array2D[3][3]={10,20,30,40,50,60,70,80,90};

    Tambin podemos crear arrays en 3D mediante el siguiente comando:

    int array3D[num x][num y][num z] = {lista de nmeros separada por comas};

    Algunas funciones adicionales para trabajar con arrays seran las siguientes:

    Obtener el nmero de elementos de un array: int ArraySize(objetoarray[]);

    Asignar valores a un array: int ArrayInitialize(objeto array[],double valor); Valor mximo y mnimo de un array:

    int ArrayMaximum(double array[], int count = WHOLE_ARRAY, int start = 0);int ArrayMinimum(double array[], int count = WHOLE_ARRAY, int start = 0);

    Calcular la dimensin de un array: int ArrayDimension(objeto array[]);

    Ordenar los elementos de un array:

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    15/39

    int ArraySort(double&array[], int count = WHOLE_ARRAY, int start = 0, intsort_dir = MODE_ASCEND);

    Copiar un array dentro de otro:int ArrayCopy(object&dest[], object source[], int start_dest = 0, intstart_source=0, int count=WHOLE_ARRAY);

    PreprocesadoresTerminamos la entrega de hoy con lo que se conoce como preprocesador.Veamos en qu consisten con un sencillo ejemplo. Hace a lgunos prrafosveamos la siguiente estructura de tipo sw itc h:

    switch(marketState){case 1: // Estrategia Mercado Alcistabreak;case 2: // Estrategia Mercado Bajistabreak;case 3: // Estrategia Mercado sin Tendenciabreak;

    default: // Error: no se consideran otras posibilidadesbreak;}Qu les parecera poder cambiar los valores 1, 2 y 3 por las palabras Alcista,Bajista y Plano? Realmente el cdigo sera an ms comprensible, verdad?

    Pues bien, para poder hacer eso simplemente basta con definirpreprocesadores de la siguiente forma: al comienzo del cdigo,insertaramos las siguientes lneas:

    #define ALCISTA 1#define BAJ ISTA 2#define PLANO 3

    Como podemos observar, los preprocesadores siempre van precedidos delsmbolo #.

    Mediante este cdigo lo que hacemos es que, por ejemplo, cada vez queaparezca la palabra ALCISTA en el cdigo a compilar, sta ser

    reemplazado por el valor 1.

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    16/39

    Para comprobarlo, creen un nuevo script e introduzcan el siguiente cdigopara luego ejecutarlo:

    //+------------------------------------------------------------------+// | Preprocesador.mq4 |

    //| X-Trader.net |/ / | |//+------------------------------------------------------------------+

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

    #define ALCISTA 1#define BAJ ISTA 2#define PLANO 3

    //+------------------------------------------------------------------+//| script program start function |//+------------------------------------------------------------------+

    int start(){

    MessageBox("ALCISTA=" + ALCISTA + " BAJ ISTA=" + BAJ ISTA +" PLANO=" + PLANO);

    return(0);}

    MQL4 para Novatos III

    Retomamos la serie sobre programac in en MQL4. En esta tercera entregapasamos a ver las principales funciones matemticas de que disponemos eneste lenguaje, as como algunas funciones adicionales para mostrarinformacin en pantalla.

    FUNCIONES MATEMTICAS

    MathAbs(Valor Absoluto)Esquema: double MathAbs(double value)Ejemplo:

    int a=-10;a=MathAbs(a); // ahora a vale 10

    MathCeil(Redondeo por exceso)Esquema: double MathCeil(double x)

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    17/39

    Ejemplo:

    double a ;a=MathCeil(1.001); // dado que se redondea por exceso, a valdr 2.0

    MathFloor(Redondeo por defecto)Esquema: double MathFloor(double x)Ejemplo:

    double a ;a=MathFloor(1.999); // dado que se redondea por defecto, a valdr 1.0

    MathRound(Redondeo normal: si la parte dec imal es superior a 0.5, seredondea por exceso, en caso contrario por defecto)Esquema: double MathRound(double x)Ejemplo:

    double a ;a=MathFloor(1.1); // al ser 0.1 menor que 0.5, a valdr 1.0

    double b;b=MathFloor(1.8); // al ser 0.8 mayor que 0.5, a valdr 2.0

    MathMax(Mximo de una serie)Esquema: double MathMax(double valor1, double valor2)Ejemplo:

    double a;a=MathMax(50.0,1.0); // a toma el valor 50.0

    MathMin(Mnimo de una serie)Esquema: double MathMin(double valor1, double valor2)Ejemplo:

    double a;a=MathMin(10.0,12.0); // a toma el valor 10.0

    MathPow(Potencia de un nmero)Esquema: double MathPow(double base, double exponente)Ejemplo:

    double a;

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    18/39

    a=MathPow(5.0,2.0); // a toma el valor 25, es decir, 5 elevado a 2

    MathSqrt(Raz cuadrada de un nmero)Esquema: double MathSqrt(double x)

    Ejemplo:

    double a;a=MathSqrt(9.0); // a es igual a 3, raz cuadrada de 9

    MathLog(Logaritmo neperiano de un nmero)Esquema: double MathLog(double x)Ejemplo:

    double a;a=MathLog(10.0); // El valor de a es 2.30258509

    MathExp(Potencia del nmero e)Esquema: double MathExp(double d)Ejemplo:

    double a;a=MathExp(1); // El valor de a es 2.7182818

    MathMod(Resto de una divisin)Esquema: double MathMod(double Numerador, double Denominador)Ejemplo:

    double a;a=MathMod(5,2); // Si dividimos 5 entre 2, el resto que queda es a=1.0

    MathRand(Generacin de nmeros aleatorios)Esquema: int MathRand() (esta funcin no tiene argumentos)Ejemplo: si bien por defecto utiliza el rango de enteros comprendidos entre 0y 32767, podemos fijar el intervalo en el que queremos obtener los nmerosde la siguiente forma:

    MathRand()%6 // Devuelve enteros aleatoriamente entre 0 (valor 1) y 5(valor 6).

    MathRand()%6+5 // Devuelve enteros aleatoriamente entre 5 (valor 6) y 10(valor 11)

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    19/39

    (MathRand()%11+10)*(-1) // Obtenemos enteros aleatorios entre -10 y -20

    (MathRand()%1001/1000.0) // Obtenemos valores entre 0 y 1 con tresdecimales

    MathSrand(Generacin de nmeros enteros aleatorios iniciando lasecuencia en un valor determinado o semilla)Esquema: void MathSrand(int semilla)Ejemplo: Esta funcin puede combinarse de forma muy efectiva con lafuncin TimeLocal, que devuelve el nmero de segundos transcurridos desdeel 1 de Enero de 1970 tal que:

    MathSrand(TimeLocal());

    Con ello, conseguimos dar un valor nico a la semilla de partida.

    Funciones TrigonomtricasEn MQL tenemos disponibles las funciones de seno, coseno y tangente ascomo sus inversas, esto es, arcoseno, arcocoseno y arcotangente. Elesquema de utilizacin para cada una de ellas es, respectivamente:

    double MathSin(double x)

    double MathCos(double x)double MathTan(double x)double MathArcsin(double x)double MathArccos(double x)double MathArctan(double x)

    Todas ellas funcionan en base a radianes por lo que conviene convertircualquier nmero en grados a radianes antes de introducirlo en estasfunciones, de la forma:

    Radianes = (Grados * Pi)/180Suele ser conveniente dec larar el nmero Pi como una variable al comienzode cualquier cdigo con estas funciones. Para ello escribiremos:

    #define PI 3.1415926535897

    OTRAS FUNCIONES PARA MOSTRAR MENSAJESHasta ahora slo habamos visto la funcin MessageBox para mostrarinformac in en pantalla. Veamos algunas funciones ms.

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    20/39

    Alert(Emitir una alerta)Esquema: void Alert(...)Ejemplo:

    Alert(Signal Type:+signaltype);

    Recordemos que el sonido de las alertas puede configurarse desde el menTools->Options dentro de la pestaa Events.

    Comment(Muestra un mensaje en la esquina superior izquierda del grfico)Esquema: void Comment(...)Ejemplo: si escribimos por ejemplo:

    Comment(Recuerda que tiene soporte en 1.5300);

    Al ejecutar el cdigo que contiene esta instruccin, nos aparecer esecomentario en la parte superior izquierda del grfico.

    Print(Permite mostrar mensajes en el registro de un Expert Advisor)Esquema: void Print( ...)Ejemplo: si queremos que cuando carguemos un Expert Advisor se nosmuestre alguna informacin en pantalla, utilizaremos esta funcin; porejemplo:

    Print(EA cargado correctamente);

    MQL4 para Novatos IV

    Continuamos con la serie sobre el lenguaje MQL. En esta ocasin se abordanlas principales funciones de indicadores tcnicos que trae incorporadas deserie. Todas las funciones que vamos a ver a continuac in constan casisiempre de los siguientes argumentos:

    symbol define sobre qu par de divisas o valor se aplicar el indicador.Si queremos que pueda usarse en cualquier grfico daremos valorNULL (o 0) a este parmetro. Si queremos aplicarlo a un productodeterminado deberemos escribir su nombre como una cadena("EURUSD","GBPUSD" etc.).

    timeframe en el segundo argumento se define la escala temporal enla que se va a utilizar el indicador. Si queremos que se utilice el periododel grfico sobre el que insertamos el indicador simplemetnte daremos

    valor 0 a este parmetro. Si queremos especificar el periodo,deberemos utilizar una de las siguientes constantes:

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    21/39

    PERIOD_M1 - 1 minutoPERIOD_M5 - 5 minutosPERIOD_M15 - 15 minutosPERIOD_M30 - 30 minutos

    PERIOD_H1 - 1 horaPERIOD_H4 - 4 horasPERIOD_D1 - 1 daPERIOD_W1 - 1 semanaPERIOD_MN1 - 1 mes

    shift el ltimo argumento define cul ser el ltimo valor del indicadorque se mostrar en pantalla. Normalmente querremos que nosmuestre el ltimo valor del indicador por lo que le asignaremos valor 0,

    pero si queremos que nos muestre valores anteriores del indicador enla ltima barra (esto es, queremos retardar el indicador) leasignaremos el valor 1 para mostrar el valor del indicador en la barraanterior, 2 para mostrar su valor hace dos barras, etc.

    Asimismo en los indicadores es habitual utilizar valores calculados a partir delos campos que definen una barra, para despus promediarlos utilizando unmtodo determinado. Para ello se utilizan los siguientes argumentos:

    applied_price define el campo que utilizaremos del precio; para elloutilizaremos las siguientes constantes:

    PRICE_CLOSE - CierrePRICE_OPEN - AperturaPRICE_HIGH - MximoPRICE_LOW - MnimoPRICE_MEDIAN Prec io Medio definido como (Mx+Mn)/2PRICE_TYPICAL Prec io Tpico, calculado como (Mx+Mn+Cierre)/3PRICE_WEIGHTED Prec io ponderado, obtenido a partir de la siguientefrmula: (Mx+Mn+Cierre+Cierre)/4

    ma_method permite definir el mtodo utilizado para calcular unamedia mvil. Admite los siguientes valores:

    MODE_SMA Media mvil simpleMODE_EMA - Media mvil exponencialMODE_SMMA - Media mvil suavizadaMODE_LWMA - Media mvil ponderada linealmente

    period define cuntas barras se incluiran para calcular la media

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    22/39

    ma_shift permite desplazar la media un nmero definido de barras. Siel valor introducido es positivo desplazar la media a la derecha elnmero de barras que hayamos indicado; por el contrario, si el valor es

    negativo, la media es desplazada a la izquierda.

    Las funciones de indicadores que vamos a ver a continuacin puedenagruparse en dos categoras: simples, cuando slo constan de una lnea, ocomplejas, cuando constan de varias lneas. En este ltimo caso, se utilizarel parmetro mode como veremos ms adelante..

    Pasamos a continuacin a ver todas las funciones de indicadores tcnicosque incorpora este lenguaje, la forma de utilizarlos y un ejemplo:

    Aceleracin/Deceleracin (AC)Este indicador mide la velocidad a la que varan los precios.

    Esquema: double iAC(string symbol, int timeframe, int shift)

    Ejemplo:double ac;ac=iAC(0,0,0); // AC aplicado a la ltima barra en cualquier grfico decualquier escala temporal. ac=iAC("GBPUSD",PERIOD_M30,0);// AC aplicado a la ltima barra del grfico de 30 min. del GBPUSD.

    Acumulacin/Distribucin (A/D)Indicador utilizado para confirmar la tendencia de los precios utilizando elvolumen. Debe tener en cuenta que, en el caso de las divisas, Metatradermuestra el volumen negociado por el broker en su red de negociacin por loque no tiene porque ser representativo del volumen negociado a nivelmundial.

    Esquema: double iAD(string symbol, int timeframe, int shift)

    Ejemplo:double ad;ad=iAD("GBPUSD",PERIOD_M5,5); // A/D de hace 6 barras en el grfico de 5min. del GBPUSD

    AlligatorIndicador desarrollado por Bill Williams que combina 3 medias mviles

    Esquema:

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    23/39

    double iAlligator( string symbol, int timeframe, int jaw_period, int jaw_shift, intteeth_period,

    int teeth_shift, int lips_period, int lips_shift, int ma_method, int

    applied_price,

    int mode, int shift)

    Obsrvese que aparte de los habituales symbol, timeframe y shift estafuncin para controlar el periodo y el desplazamiento de cada una de lastres lneas - mandbula (jaw), dientes (teeth) y labios (lips) - de que secompone el Alligator.

    Asimismo incorpora los parmetros para seleccionar el tipo de media

    aplicada (ma_method) y el campo del prec io sobre el que se aplicar(applied_price).

    Finalmente si miramos la estructura tenemos un parmetro adicional del quepor ahora slo habamos hecho mencin: mode. Las constantes que admiteeste parmetro varan dependiendo de la funcin que la utilice y sirvegeneralmente para seleccionar, en el caso de los indicadores de tipocomplejo, la lnea con la que queremos trabajar. En el caso del Alligatoradmite los siguientes valores:

    MODE_GATORJ AW - Mandbula del Alligator (lnea azul)MODE_GATORTEETH - Dientes del Alligator (lnea roja)MODE_GATORLIPS - Labios del Alligator (lnea verde)

    Ejemplo:double teeth;teeth=iAlligator(EURUSD,PERIOD_H1,128,96,64,0,0,0,MODE_EMA,PRICE_TYPICAL,MODE_GATORTEETH,0);// Calcula los "dientes" lnea roja) en un grfici horario del EURUSD.// Para ell utiliza una media mvil exponencial aplicada a precio tpico// Los periodos utilizados para el indicador son 128, 96 y 64. No se aplicadesplazamiento.

    Average Directional Movement Index (ADX)Este indicador se utiliza para detectar si hay o no tendencia.

    Esquema: double iADX(string symbol,int timeframe,int period,intapplied_price,int mode,int shift)

    En este indicador, el parmetro mode admite los siguientes valores:

    MODE_MAIN - Lnea principal del indicador

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    24/39

    MODE_PLUSDI - Lnea +DIMODE_MINUSDI - Lnea DI

    Ejemplo:double plusDi;

    plusDi=iADX(USDCAD,PERIOD_M1,6,PRICE_OPEN,MODE_PLUSDI,0);// Calcula el valor de la lnea +DI en el grfico de 1 min del USDCADutilizando// un periodo de 6 barras y tomando las aperturas de cada barra.

    Average True Range (ATR)Este indicador permite medir la volatilidad del mercado

    Esquema: double iATR(string symbol,int timeframe,int period,int shift)

    Ejemplo:double atr;atr=iATR(0,0,15,0); // ATR de 15 periodos del grfico y escala temporal quedeseemos.

    Awesome Oscillator (AO)Desarrollado por Bill Williams, permite determinar el momentum del mercado

    Esquema: double iAO( string symbol, int timeframe, int shift)

    Ejemplo:double ao;ao=iAO(EURAUD,PERIOD_W1,1);// AO de la penltima barra calculado en el grfico semanal del EURAUD.

    Bears PowerEste indicador trata de estimar el potencial bajista del mercado

    Esquema: double iBearsPower(string symbol,int timeframe,int period,intapplied_price,int shift

    Ejemplo:double bep;bep=iBearsPower("EURUSD",PERIOD_M5,32,PRICE_C LOSE,1);// Bears Power de la penltima barra calculado sobre 32 cierres// en un grfico de 5 min. del EURUSD

    Bollinger Bands (BB)Se trata del conoc ido indicador de J ohn Bollinger, con el que se pretende

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    25/39

    establecer un rango de movimiento probable para el prec io

    Esquema:

    double iBands( string symbol, int timeframe, int period, int deviation, int

    bands_shift,int applied_price, int mode, int shift)

    Como puede apreciarse tenemos dos parmetros adicionales: deviation,con el que se controla la amplitud de las bandas y bands_shift, con el que esposible desplazar las bandas. Por supuesto, tambin contamos con elparmetro mode, que admite los siguientes valores:

    MODE_UPPER - Lnea superiorMODE_LOWER - Lnea inferior

    Ejemplo:double bb;bb=iBands(0,0,20,2,0,PRICE_LOW,MODE_LOWER,0);// Banda inferior de Bollinger calculada hasta la ltima barra// de cualquier periodo y escala. Utiliza 20 barras para la media// que se calcula sobre los mnimos y la desviacin utilizada es 2

    Bulls PowerEste indicador trata de estimar el potencial alcista del mercado

    Esquema: double iBullsPower(string symbol, int timeframe, int period, intapplied_price, int shift)

    Ejemplo:double bup;bup=iBullsPower(0,0,10,PRICE_C LOSE,1);// Bears Power de la penltima barra calculado sobre 10 cierres// en un grfico y escala cualesquiera.

    Commodity Channel Index (CCI)El CCI se utiliza para medir la desviacin del prec io con respecto a su media

    Esquema: double iCCI( string symbol, int timeframe, int period, intapplied_price, int shift

    Ejemplo:double cci;cci=iCCI(0,0,14,PRICE_TYPICAL,0);// CCI de 14 periodos calculado sobre el prec io tpico

    // para cualquier grfico y escala.

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    26/39

    DeMarker (DeM)Creado por Tom DeMark, este indicador intenta predec ir un giro demercado basndose en la diferencia del precio con respecto a barrasanteriores.

    Esquema: double iDeMarker( string symbol, int timeframe, int period, int shift)

    Ejemplo:double dm;dm=iDeMarker("EURJPY",PERIOD_H4,51,1);// Calcula el DeMarker hasta la penltima barra en un grfico de 4 horas// del EURJPY utilizando un 51 barras.

    EnvelopesCon este oscilador es posible crear envolventes del prec io en base a unamedia mvil.

    Esquema: double iEnvelopes( string symbol, int timeframe, int ma_period, intma_method, int ma_shift,

    int applied_price, double deviation, int mode, int shift)

    Aqu aparece el parmetro deviation con el que se controla la amplitud dela envolvente en trminos porcentuales (por ejemplo, si asignamos el valor0.25 diremos que sume y reste el 25% del precio a la media mvil).

    Asimismo, dado que el indicador consta de dos lneas, disponemos delparmetro mode para seleccionar la lnea que deseemos, utilizando par ellolos siguientes valores:

    MODE_UPPER - Lnea superiorMODE_LOWER - Lnea inferior

    Ejemplo:double envel;envel=iEnvelopes(0,0,21,MODE_SMA,0,PRICE_CLOSE,0.05,MODE_LOWER,0);// Banda inferior de la envolvente calculada usando una media simple de 21periodos// y una desviacin del 5% para cualquier grfico y escala

    Force Index (FRC)Este indicador trata de medir la fuerza de la tendencia.

    Esquema: double iForce( string symbol, int timeframe, int period, int

    ma_method, int applied_price, int shift)

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    27/39

    Ejemplo:double force;force=iForce("EURGBP",PERIOD_M5,21,MODE_LWMA,PRICE_HIGH,1);// FRC de 21 periodos calculado hasta la penltima barra usando una media// linealmente ponderada de los mximos del grfico del EURGBP en 5 min.

    FractalsSe trata de otro de los indicadores de Bill Williams, utilizado para detectarsuelos y techos. Dado que el fractal no se da en todas las barras, estafuncin devuelve el valor cero mientras no se produzca el patrn.

    Esquema: double iFractals( string symbol, int timeframe, int mode, int shift)

    Esta funcin dispone del parmetro mode para seleccionar el tipo de fractal:MODE_UPPER - Fractales bajistas (techo de mercado)MODE_LOWER - Fractales alcistas (suelo de mercado)

    Ejemplo:double frac;frac=iFractals("USDJ PY",PERIOD_D1,MODE_UPPER,0);// Fractales bajistas en la ltima barra de un grfico diario del USDJ PY.

    Gator OscillatorEl Gator Oscillator se utiliza para mediar el grado de convergenc ia odivergencia entre las lneas que componen el Alligator.

    Esquema:

    double iGator( string symbol, int timeframe, int jaw_period, int jaw_shift, intteeth_period,

    int teeth_shift, int lips_period, int lips_shift, int ma_method, intapplied_price, int mode, int shift)

    Dado que se basa en el Alligator, aparecen los parmetros para modificarsus mandbulas, dientes y labios. Asimismo cuenta con el parmetro modepara seleccionar la parte del histograma que nos interese:

    MODE_UPPER - Histograma positivo (verde)MODE_LOWER - Histograma negativo (rojo)

    Ejemplo:

    double gator;gator=iGator(0,0,13,8,8,0,0,0,MODE_SMA,PRICE_CLOSE,MODE_UPPER,0);

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    28/39

    / / Histograma positivo calculado sobre el Alligator de periodos 13,8,8// utilizando una media mvil simple de los cierres.

    Ichimoku Kinko HyoSe trata del conoc ido conjunto de lneas japons

    Esquema: double iIchimoku( string symbol, int timeframe, int tenkan_sen, intkijun_sen,

    int senkou_span_b, int mode, int shift)

    Como puede observarse cuenta con los parmetros para controlar elperiodo de cada una de las lneas que compone el indicador y unparmetro mode para seleccionar la lnea que nos interese:

    MODE_TENKANSEN - Tenkan-senMODE_KIJUNSEN - Kijun-senMODE_SENKOUSPANA - Senkou Span AMODE_SENKOUSPANB - Senkou Span BMODE_CHINKOUSPAN - C hinkou Span

    Ejemplo:double ichi;ichi=iIchimoku(0,0,13,21,53,MODE_KIJUNSEN,0);// Valor del Kijun-sen tomando periodos 13, 21, 53.

    Market Facilitation Index (BW MFI)Creado por Bill Williams, este indicador muestra el coc iente entre el rango dela barra y el volumen negociado en dicha barra.

    Esquema: double iBWMFI( string symbol, int timeframe, int shift

    Ejemplo:double bwmfi;bwmfi=iBWMFI(0,0,0); // BWMFI calculado para la ltima barra del chart quetenemos en pantalla.

    MomentumEl Momentum permite calcular la variacin entre dos cierres separados xbarras

    Esquema: double iMomentum( string symbol, int timeframe, int period, int

    applied_price, int shift)

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    29/39

    Ejemplo:double mom;mom=iMomentum(0,0,12,PRICE_CLOSE,1);// Momentum de 12 periodos calculado hasta la penltima barra.

    Money Flow Index (MFI)Este indicador mide la entrada y salida de dinero en el mercado

    Esquema: double iMFI( string symbol, int timeframe, int period, int shift

    Ejemplo:double mfi;mfi = iMFI(0,0,14,0);// Calcula un MFI de 14 periodos para el grfico actual.

    Moving Average (MA)Calcula una media mvil utilizando el mtodo indicado sobre el campo delprec io que deseemos.

    Esquema: double iMA( string symbol, int timeframe, int period, int ma_shift, intma_method, int applied_price, int shift)

    Ejemplo:double ma;ma=iMA("EURCHF",PERIOD_M15,21,6,MODE_LWMA,PRICE_LOW,1);// Calcula la media mvil linealmente ponderada de 21 periodos en elgrfico de 15 min.// del EURCHF hasta la penltima barra y la desplaza 6 barras hacia laderecha.

    Moving Average Convergence/Divergence (MACD)El MACD es un indicador que trata de determinar la tendencia en base ados medias exponenciales.

    Esquema: double iMACD( string symbol, int timeframe, intfast_ema_period, int slow_ema_period, int signal_period, int applied_price, intmode, int shift)

    En este esquema los parmetros fast_ema_period, slow_ema_period ysignal_period controlan el valor de las medias moviles utilizadas en elindicador. Asimismo el parmetro mode permite seleccionar la lnea que nosinterese asignando uno de estos valores:

    MODE_MAIN - Lnea principalMODE_SIGNAL - Lnea Signal

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    30/39

    Ejemplo:double ma;ma=iMACD(0,0,9,21,9,PRICE_CLOSE,MODE_MAIN,0);// Valor de la lnea principal del MACD en el grfico actual, utilizando

    parmetros, 9, 21 y 9.

    Moving Average of Oscillator (OsMA)El OsMA permite calcular la diferencia entre la lnea principal y la lneasignal del MACD

    Esquema:

    double iOsMA( string symbol, int timeframe, int fast_ema_period, int

    slow_ema_period,int signal_period, int applied_price, int shift)

    Ejemplo:double osma;osma=iOsMA(0,0,12,26,9,PRICE_CLOSE,0);// OsMA de un MACD de periodos 12,26,9

    On Balance Volume (OBV)Indicador que relaciona el comportamiento del prec io con el volumen

    Esquema: double iOBV( string symbol, int timeframe, int applied_price, int shift)

    Ejemplo:

    double obv;obv=iOBV(0,0,PRICE_OPEN,0);// OBV calculado hasta la ltima barra utilizando la apertura.

    Parabolic Stop and Reverse system (Parabolic SAR)El Parabolic SAR es un indicador que permite definir la tendencia y puntos deentrada y salida.

    Esquema: double iSAR( string symbol, int timeframe, double step, doublemaximum, int shift)

    Incorpora los parmetros habituales en este indicador: step para definir laaceleracin y maximum para fijar el tope de la aceleracin.

    Ejemplo:double sar;

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    31/39

    sar=iSAR(0,0,0.02,0.2,0);// Parabolic SAR con aceleracin 0.02 y tope 0.2.

    Relative Strength Index (RSI)

    Se trata del conoc ido indicador de Welles Wilder para detectar puntos degiro en el mercado.

    Esquema: double iRSI( string symbol, int timeframe, int period, intapplied_price, int shift)

    Ejemplo:double rsi;rsi=iRSI("USDCAD",PERIOD_M1,9,PRICE_OPEN,0);// Calcula un RSI de 9 periodos en el grfico de 1 min. del USDCAD utilizando

    // datos de apertura.

    Relative Vigor Index (RVI)EL RVI es un indicador muy similar al Estocstico que trata de detectar girosde mercado.

    Esquema: double iRVI( string symbol, int timeframe, int period, int mode, intshift)

    El indicador consta de dos lneas por lo que requiere del parmetro mode,que admite los siguientes valores:

    MODE_MAIN - Lnea principalMODE_SIGNAL - Lnea signal

    Ejemplo:double rvi;rvi=iRVI(0,0,12,MODE_MAIN,1);// Calcula la lnea principal de un RVI de 12 periodos hasta la penltimabarra.

    Standard DeviationCon este indicador se calcula la desviac in tpica del mercado, con objetode medir su volatilidad.

    Esquema: double iStdDev( string symbol, int timeframe, int ma_period, intma_shift, int ma_method, int applied_price, int shift)

    Ejemplo:double sd;

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    32/39

    sd=iStdDev(0,0,10,0,MODE_SMA,PRICE_CLOSE,0);// Calcula la desviac in tpica de 10 periodos utilizando una media movilsimple.

    Stochastic OscillatorEl Estocstico es un indicador con el que se intenta detectar puntos de girodel mercado.

    Esquema: double iStochastic( string symbol, int timeframe, int %Kperiod, int%Dperiod, int slowing, int method,

    int price_field, int mode, int shift)

    Aqu aparecen algunos parmetros que controlan el comportamiento delEstocstico: as %Kperiod es el periodo de la lnea %K, %Dperiod es el de la

    lnea %D y slowing es el periodo de la media mvil que suaviza la lnea %D.Por su parte, el parmetro price_field admite dos valores: 0, para tomarmnimos y mximos en el clculo, 1 si queremos que slo utilice los cierres.

    Finalmente dado que el Estocstico consta de dos lneas contamos con elparmetro mode que admite los siguientes valores:

    MODE_MAIN - Lnea principalMODE_SIGNAL - Lnea Signal

    Ejemplo:double s;s=iStochastic(0,0,10,6,6,MODE_SMA,0,MODE_MAIN,0);// Calcula el valor de la lnea principal del Estocstico de parmetros 10,6,6// Para ello, utiliza una media simple y mximos y mnimos

    Williams Percent Range (%R)Indicador que funciona de manera similar al Estocstico desarrollado porLarry Williams

    Esquema: double iWPR( string symbol, int timeframe, int period, int shift)

    Ejemplo:double wpr;wpr=iWPR("USDCHF",PERIOD_D1,9,0);// Calcula un WPR de 9 periodos en el grfico diario del USDCHF.

    MQL4 para Novatos V

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    33/39

    Bien, pasamos a la accin: si Vd. ha seguido el curso desde el principio, nodebera tener problemas para crear su primer indicador en MQL4.

    Eso s, antes de ponernos manos a la obra es prec iso repasar qucaractersticas poseen los indicadores en Metatrader:

    Por un lado, existen indicadores que se dibujan sobre el propio grfico,constan de una o varias lneas, sus valores pueden ser ilimitados y serepresentan con un color, grosor y estilo de lnea definidos. Este sera elcaso de una media mvil.

    Por otro lado, tenemos indicadores que se dibujan en una nuevasubventana mostrando una o varias lneas cuyo color, grosor y estilopueden ser definidos, y cuyos valores estn acotados. Tal sera el casodel RSI.

    Tambin tenemos indicadores en forma de histograma o que serepresentan mediante smbolos (flechas, crculos, etc.)

    En definitiva podemos decir que un indicador consta de los siguientesparmetros:

    Una o ms lneas (que en MQL4 se denominan Buffers), pudiendodefinir para cada una su aspecto, color, grosor y estilo.

    La ventana en la que se trazar (sobre el grfico 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 ajustarautomticamente la escala.

    Teniendo en cuenta todo esto, comenzamos a crear nuestro primerindicador. Para ello abrimos el Metaeditor tecleando F4 y vamos a File->New.Se nos abrir un asistente en el que debemos seleccionar Custom Indicator ydarle a Siguiente. A continuac in rellenamos los campos de Name, Author yLink. J ustamente debajo de esos campos vemos un espacio en blanco quepone Parameters. Ah podemos aadir variables que despus se puedenmodificar para que cualquier usuario pueda hacer cambios en los valores

    que definen el indicador.

    Para nuestro ejemplo, pulsamos en Add y pondremos como nombre alparmetro, barsToProcess, y fijando su valor por defecto igual a 100, dejandoel tipo de variable como int (entero). Le damos a Siguiente.

    Ahora se nos piden dos cosas: por un lado, si queremos tener el indicador enuna ventana aparte (para lo cual deberemos marcar Indicator in separatewindow) y por otro, el nmero de lneas (Indexes) de que constar elindicador. Debemos tener en cuenta que aunque pongamos que tiene 5

    lneas no tienen porque dibujarse todas: podemos por ejemplo usar 3 paraalmacenar valores y 2 para representar el indicador en s. Asimismo, el

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    34/39

    mximo de lneas que podemos poner es de 8. Para aadir una nueva lneaharemos click en Add pero por defecto ya tenemos una, cuyo colorpodemos modificar (ponemos Azul por ejemplo) as como el tipo derepresentac in (que por ahora dejaremos en Line).

    Hacemos click en Finalizar y listo, ya tenemos definidos todos los parmetrosdel indicador. Veamos qu significa el cdigo que acabamos de generar:

    El encabezado recoge los datos del autor:

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

    A continuacin se enumeran las propiedades del indicador: debe dibujarseen una subventana, con una lnea y en color azul marino (Navy):

    #property indicator_separate_window#property indicator_buffers 1#property indicator_color1 Navy

    Observese que el parmetro indicator_color va seguido de un nmero, quese corresponde con la lnea (buffer) a la que afecta (ojo, la enumeracin delos buffers comienza aqu en 1 y no en 0 como hasta ahora).

    Seguidamente nos muestra los parmetros definidos:

    //---- input parametersextern int barsToProcess=100;

    Definimos el buffer:

    //---- buffersdouble ExtMapBuffer1[];

    Ahora comienza el cdigo del indicador en s. Si miramos el cdigocompleto veremos que consta de tres secciones diferenciadas: init(), deinit()y start(). Veamos en qu consiste cada una:

    init() es una funcin que slo ser llamada una vez, en el momento deinicializar el indicador. En esta seccin se comprueba que los valoresde los parmetros son correc tos y se prepara el indicador para cargardatos. No obstante no es obligatorio utilizarla por lo que si no lo vamosa usar podemos borrarla.

    deinit() se utilizar para indicar qu debe suceder cuando borremos elindicador de un grfico. De nuevo esta funcin no es obligatoria.

    start() ser llamada cada vez que aparezca un nuevo tick en el

    grfico por lo que aqu es donde debemos poner las instrucciones quepermitirn realizar los clculos para obtener el valor del indicador.

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    35/39

    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 funcinSetIndexStyle. En este caso, con DRAW_LINE nos dibujar una lnea.

    Observese que aqu la enumeracin de los buffers vuelve a ser desde 0. Porsu parte la funcin SetIndexBuffer asocia un array al buffer que habamosdefinido. Finalmente return(0) finaliza la funcin init():

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

    En el caso de deinit() no tenemos nada (generalmente no utilizaremosdemasiado esta funcin)

    Ahora nos falta decirle qu es lo que debe dibujar. Con lo que vamos aponer dentro de start() vamos a dibujar un indicador que representenmeros aleatorios. El cdigo que debe aparecer en esa seccin es elsiguiente:

    int start(){int counted_bars=IndicatorCounted();for(int i=0;i

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    36/39

    Bien veamos qu significa el cdigo que hemos introducido en start().Comenzamos con un buc le de tipo for, comenzando en la ltima barra (i=0)y finalizando en la primera disponible (i

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    37/39

    Donde se ha introducido la funcin IndicatorCounted() que nos dicecuantas barras no se han modificado desde que se llam a la funcin start().Ahora el bucle for depende de la variable limit que almacena el nmero debarras que estn modificndose en el momento de calcular el indicador.

    Finalmente, seguro que recuerdan que hemos introducido un parmetrollamado barsToProcess que todava no aparece en el cdigo. Pues bien, hallegado el momento de usarlo, veamos el siguiente cdigo:

    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

  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    38/39

    nuestra creencia fue acertada y se restar un punto en el caso de que labarra cierre en el sentido contrario al que apostamos. En caso de que laapertura y el cierre sean iguales no se sumar ni restar ningn punto.

    As pues, nos descargamos el Expert Advisor hac iendo click aquy lo

    copiamos en la carpeta Experts, que cuelga debajo de la que hayamosinstalado Metatrader.

    A continuac in abrimos Metatrader, pulsamos F4 para entrar en el editor deMQL4 y abrimos el archivo que acabamos de descargar(Intuition_Trainer.mq4). Tecleamos F5 para compilarlo y ya lo tenemos listopara funcionar.

    Ahora cargamos un grfico (preferiblemente 1 5 minutos, para quepodamos ver cmo funciona sin tener que esperar demasiado) y

    seguidamente vamos al men View->Navigator. Nos debe aparecer unaventana a la izquierda en la que una de las posibilidades es Expert Advisors.La desplegamos hac iendo click en el smbolo "+" y ah debe aparecer el queacabamos de compilar con el nombre de Intuition_Trainer. Lo seleccionamos,damos al botn derecho y le damos a Attach to a chart. Antes de cargarse,nos dar opcin a modificar sus dos parmetros:

    Gap, que nos permite indicar la distancia, expresada en pips, entre lasflechas y el prec io de apertura de la vela.

    Time_Limit, que nos indica el nmero de segundos que las flechas

    permanecern activas hasta que el usuario realice su apuesta (siponemos este valor a cero, las flechas estarn activas hasta quefinalice la formacin de la vela)

    Una vez introducido en el grfico debemos obtener algo parecido a losiguiente:

    Podemos ver dos flechas sobre la ltima vela y, en la esquina superior

    izquierda del grfico, la puntuac in del "juego", siendo el primero nmero lapuntuacin total, el segundo dgito el nmero de aciertos y el tercero, el

    http://www.x-trader.net/cms/images/stories/archivos/308/Intuition_Trainer.mq4http://www.x-trader.net/cms/images/stories/archivos/308/Intuition_Trainer.mq4
  • 7/23/2019 Programacion Expert Advisor Metatrader MQL4 Para Noobs

    39/39

    nmero de fallos.

    Para poder "jugar", basta con esperar a que aparezca una nueva vela,hacer doble click en la flecha que se corresponde con la direccin queconsideramos incorrecta y presionamos la tecla Suprimir para borrarla.

    Bien, una vez que hemos jugado un rato a ser adivinos, reflexionemos acercade la utilidad de este Expert Advisor: est c laro que hoy en da para operaren los mercados con xito debemos tener una estrategia, ya sea basado enanlisis fundamental o tcnico, as como una reglas de gestin monetaria.Pero no debemos olvidar la intuicin del trader, esa que desarrollan lostraders profesionales tras miles de horas delante de la pantalla leyendo elmercado y que les permite saber lo que puede hacer el mercado sin utilizarningn indicador, aunque en ocasiones puedan equivocarse. As, del mismomodo que aprendemos a pintar, cantar o tocar el piano, la capacidad deleer el grfico tambin puede desarrollarse y mejorarse; incluso medianteeste juego podemos descubrir patrones de mercado que podemos convertiren sistemas.