Alertas sonoras, visuales y por email para tus indicadores

IndicatoriNosu mayo 19, 2009 15 Comentarios

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[i] = Low[i] - 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[i] = Low[i] - 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[i] = Low[i] - Range*0.5;
} else if ((fasterMAnow < slowerMAnow) && (fasterMAprevious > slowerMAprevious) && (fasterMAafter < slowerMAafter)) {
    CrossDown[i] = High[i] + Range*0.5;
}
if (i==1 && CrossUp[i] > CrossDown[i]) {
    Alertar("vender");
}
if (i==1 && CrossUp[i] < CrossDown[i]) {
    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

Compártelo: Facebook GoogleTwitterEmail
Mostrar Mas

Advertencia sobre riesgos: invertir en monedas digitales, títulos, acciones y otros valores, materias primas, divisas y otros productos de inversión derivados (por ejemplo, en contratos por diferencias o “CFD”) es una actividad especulativa y conlleva un elevado nivel de riesgo. Cada inversión es única y conlleva riesgos únicos.

Los CFD y otros derivados son instrumentos complejos y conllevan un elevado riesgo de perder dinero rápidamente debido al apalancamiento. Usted debería plantearse si comprende cómo funciona una inversión y si puede permitirse asumir el elevado riesgo de perder su dinero.

Las criptomonedas pueden experimentar grandes fluctuaciones en sus precios, y por consiguiente no son apropiadas para todos los inversores. Operar sobre criptomonedas no es una actividad que esté supervisada por ningún marco reglamentario de la UE. Las rentabilidades pasadas no garantizan resultados futuros. Salvo que se indique lo contrario, cualquier historial de trading que se muestre tendrá menos de 5 años y podría no ser suficiente como base para tomar decisiones de inversión. Su capital está en riesgo.

Cuando opera sobre acciones su capital está en riesgo.

La rentabilidad pasada no es una indicación de resultados futuros. Salvo que se indique lo contrario, el historial de trading que se muestre tendrá menos de 5 años y podría no ser suficiente como base para tomar decisiones de inversión. Los precios pueden tanto subir como bajar, pueden fluctuar ampliamente, usted podría estar expuesto a fluctuaciones en la tasa de cambio de las divisas y podría perder la totalidad de la cantidad que invierta o más. Invertir no es adecuado para todo el mundo; asegúrese de que ha comprendido en su totalidad los riesgos y los aspectos legales involucrados. Si no está seguro(a), busque asesoramiento financiero, legal, fiscal y/o contable independiente. Este sitio web no proporciona asesoramiento en inversiones, financiero, legal, fiscal ni contable. Algunos enlaces son enlaces de afiliados. Para más información, lea en su totalidad nuestra advertencia sobre riesgos y exención de responsabilidad.