Alertas sonoras, visuales y por email para tus indicadores

IndicatoriNosu mayo 19, 2009 15 Comentarios
Compártelo: Facebook GoogleTwitterEmail

En mí largo caminar a través de multitud de foros relacionados con Metatrader, una de las peticiones que más se hacen es la de incorporar alertas a los indicadores. No cabe duda de la gran utilidad de estas alertas, pues te permiten poder estar haciendo cualquier otra cosa a la espera de una señal de tu indicador favorito.

Incorporar las alertas no es una tarea muy difícil en mql4 ya que la función de alerta está ya construida en la plataforma y basta con llamar a dicha función mediante la sentencia Alert(). Entre los paréntesis incluiremos el mensaje que queremos que aparezca en la ventana de alertas. Si tienes más de un indicador con alertas y en varios pares o timeframes, te será muy útil incluir el nombre del indicador, el par de divisas (utilizaremos la función Symbol() que retorna el par de divisas del gráfico en el que se esté ejecutando el indicador) y el timeframe (obtenido mediante la función Period()) . De forma general, la función Alert() quedaría algo así:

Alert("Nombre de nuestro indicador: señal de compra o venta en ",Symbol()," ",Period());

Veamos un pequeño ejemplo añadiendo alerta y envío de email con la señal en un indicador. Para realizar el ejemplo tomaremos el indicador MA Crossover Signal escrito por Jason Robison, de jnrtrading (web ahora cerrada), y distribuido en código abierto de forma gratuita.

Para empezar descarga MA_Crossorver_Signal.mq4 y carga el archivo en el Metaeditor.

El siguiente paso será indentificar las condiciones que se han de cumplir para generar la señal de venta y la señal de compra, en nuestro caso el cruce de medias móviles. Cómo todos sabemos, o deberíamos saber, las señales de compra en un cruce de medias móviles se produce cuando la media móvil de reacción más rápida (menor periodo) cruza de abajo hacia arriba a la media móvil de reacción más lenta (mayor periodo). Viceversa para la señal de venta.

Si vemos el código del indicador, y sabiendo como se producen las señales en el cruce de medias móviles, podremos identificar de forma no muy difícil cuando se va a dar la señal de compra y cuando la señal de venta y poder ejecutar la función de alerta en el momento adecuado.

if ((fasterMAnow > slowerMAnow) && (fasterMAprevious < slowerMAprevious) && (fasterMAafter > slowerMAafter)) {
    CrossUp = Low - Range*0.5;
}

Las condiciones expresadas arriba nos indican las condiciones de cruce al alza pues la media móvil rápida era menor a la lenta en el período anterior y es mayor en el periodo siguiente (además de quedar claramente identificado por el propio nombre de la variable CrossUp). Para obtener la señal sonora bastaría con introducir la función Alert descrita anteriormente:

if ((fasterEMAnow > slowerEMAnow) && (fasterEMAprevious < slowerEMAprevious) && (fasterEMAafter > slowerEMAafter)) {
    CrossUp = Low - Range*0.5;
    Alert("Cruce MA: señal de compra en ",Symbol()," ",Period());
}

Si lo dejamos así la señal sería repetitiva a cada tick, lo cual es realmente molesto. Procedamos con algo más sofisticado, vamos a crear nuestra propia función de alerta en la que vamos a incluir además el envío de la señal a nuestro email. Llamaremos a esta función Alertar y será llamada en nuestro código con la sentencia Alertar(string texto). Además vamos a añadir control externo para elegir cuando queremos usar las alertas y cuando no.

1.- Variables de control: Vamos a añadir dos variables tipo bool, una para controlar si queremos usar la alerta sonora o no y otra para hacer lo mismo con el envío del email.

Llamemos a estas variables por ejemplo, alertasenal y enviosenal (no se puede usar la ñ). Para que puedan usarse desde la configuración del indicador en el gráfico las vamos a inicializar de forma externa y la situaremos bajo las demás variables externas, además inicializamos una variable, a la que llamamos tiempo (no externa), que nos servirá para controlar que la alerta solo se produzca una vez y no en cada tick que reciba Metatrader:

extern int FasterMode = 1; //0=sma, 1=ema, 2=smma, 3=lwma
extern int FasterMA =   13;
extern int SlowerMode = 1; //0=sma, 1=ema, 2=smma, 3=lwma
extern int SlowerMA =   25;
extern bool alertasenal = true;
extern bool enviosenal = true;
int tiempo;

2.- Llamada a nuestra función Alertar: Nuestra función Alertar se va a construir dependiendo de una variable tipo texto (string) y será llamada mediante la sentencia Alertar("texto"). De esto modo debemos introducir Alertar("compra") o Alertar("venta") según las condiciones que se produzcan en el indicador. Nuestro indicador de ejemplo cuenta con dos buffer, CrossUp y CroosDown, se deduce que si el buffer CrossUp es mayor al buffer CrossDown se dará la señal de venta y viceversa, por lo tanto deberemos ejecutar nuestra función Alertar() cuando se produzca el cruce en el período anterior (1) ya que si la llamamos en el periodo actual (0, la vela actual aún no ha cerrado) podríamos obtener falsas señales que al cierre de la vela no se confirmen. El indicador quedará:

if ((fasterMAnow > slowerMAnow) && (fasterMAprevious < slowerMAprevious) && (fasterMAafter > slowerMAafter)) {
    CrossUp = Low - Range*0.5;
} else if ((fasterMAnow < slowerMAnow) && (fasterMAprevious > slowerMAprevious) && (fasterMAafter < slowerMAafter)) {
    CrossDown = High + Range*0.5;
}
if (i==1 && CrossUp > CrossDown) {
    Alertar("vender");
}
if (i==1 && CrossUp < CrossDown) {
    Alertar("comprar");
}

3.- Construcción de la función Alertar(string senal): En esta función se va construir un mensaje en función del valor del texto de la variable senal (que introdujimos anteriormente como “comprar” o “vender”). La función se ejecutará en un void que se introduce al final del código tras el último }.

void Alertar(string senal) {
    string msg;
    if (tiempo != Time[0]) {
        msg = TimeToStr(TimeCurrent())+" Cruce de MA: "+senal + " "+Symbol()+  " en " +   DoubleToStr(Close[0],Digits);
        if (alertasenal) {
            Alert(msg);
        }
        if (enviosenal) {
            SendMail("Alerta de trading " + TimeToStr(TimeCurrent()),msg);
        }
        tiempo = Time[0];
    }
}
  • La variable de texto "msg" contendrá nuestro mensaje.
  • La variable "tiempo" va hacer que la alerta y el envío se produzca una sola vez de forma que no se produzca en cada tick recibido.
  • Recuerda que para utilizar la función la función SendMail() y que el email te llegue correctamente debes tener configurada tu cuenta de correo en Metatrader (se accede a través del menú Herramientas->Opciones->Email).

Y para que veáis como queda todo junto y comprobéis como funciona os dejo la versión con alerta sonora y envío de email:

MA_Crossover_Signal_con_alerta.mq4

Mostrar Mas