| 
    

Brokers

Alertas sonoras, visuales y por email para tus indicadores

  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 apareza 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.
  2.   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;

  3. 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á:
  4. 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");
    }

  5. 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 veais como queda todo junto y comprobéis como funciona os dejo la versión con alerta sonora y envio de email:

MA_Crossover_Signal_con_alerta.mq4

 

Comentarios

Asignar una puntuación (mienstras más alta mejor es)
Valoración del artículo
Comentarios*

    Por favor introduzca el código de seguridad.
 
 
Alertas sonoras, visuales y por email para tus indicadores 2009-06-29 05:52:57 Alberto
Valoración del artículo 
 
N/D
Opinión de Alberto    29 Junio , 2009

como hago para agregarle ésta signal a un indicador que se llama SUPERSIGNAL V1, Y QUE ME COMBINE CON CRUCE DE EMAS 62-300-800, en H1, y STOCHASTIC, 14-3-3, ARRIBA DE 80 Y ABAJO DE 20¿?

Te ha interesado esta opinión? 
10
Reportar este comentario
Alertas sonoras, visuales y por email para tus indicadores 2009-06-29 18:25:56 Alfonso Ramirez
Valoración del artículo 
 
N/D
IndicatoriNosu Opinión de IndicatoriNosu    29 Junio , 2009
#1 Votante  -   Ver todos mis comentarios

Añadir alerta para multiples indicadores a la vez.....para mí es mucho más fácil hacerlo con un EA que con un indicador que combine múltiples indicadores.

Te ha interesado esta opinión? 
00
Reportar este comentario
Alertas sonoras, visuales y por email para tus indicadores 2010-10-12 09:06:15 Rafael Lean
Valoración del artículo 
 
N/D
Opinión de Rafael Lean    12 Octubre , 2010

Muy bueno

Gracias por este sensacional aporte.

Tengo un indicador, al cual no se cómo hacer para que no de las señales de alerta, ya que a cada tick se abre la ventana de aviso (se puede deshabilitar la señal sonora desde el metatrader, pero no la señal de aviso)
Este es un indicador bastante eficiente, ¿podria indicarme como hacer para deshabilitar las señales de avisos a cada tick? Siguiento su enseñanza, no he sido capaz de configurarlo debidamente:


/*
Generated by EX4-TO-MQ4 decompiler V4.0.224.1 []
Website: http://purebeam.biz
E-mail : purebeam@gmail.com
*/

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Lime
#property indicator_color2 Red

extern int ADXbars = 14;
extern int CountBars = 350;
double g_ibuf_84[];
double g_ibuf_88[];
double g_iadx_92;
double g_iadx_100;
double g_iadx_108;
double g_iadx_116;
extern bool alertasenal = true;
extern bool enviosenal = true;
int tiempo;

int init() {
string ls_unused_0;
IndicatorBuffers(2);
SetIndexStyle(0, DRAW_ARROW);
SetIndexArrow(0, 108);
SetIndexStyle(1, DRAW_ARROW);
SetIndexArrow(1, 108);
SetIndexBuffer(0, g_ibuf_84);
SetIndexBuffer(1, g_ibuf_88);
return (0);
}

int start() {
if (CountBars >= Bars) CountBars = Bars;
SetIndexDrawBegin(0, Bars - CountBars);
SetIndexDrawBegin(1, Bars - CountBars);
int l_ind_counted_8 = IndicatorCounted();
if (l_ind_counted_8 < 0) return (-1);
if (l_ind_counted_8 < 1) {
for (int li_0 = 1; li_0 g_iadx_108 && g_iadx_100 < g_iadx_116 && li_0 != 1) {
g_ibuf_84[li_4] = Low[li_4] - 5.0 * Point;
Alert("Buy Arrow",
"\n", "Current time is ", TimeToStr(TimeCurrent()),
"\n", Symbol());
li_0++;
}
if (g_iadx_92 < g_iadx_108 && g_iadx_100 > g_iadx_116 && li_0 != 1) {
g_ibuf_88[li_4] = High[li_4] + 5.0 * Point;
Alert("Sell Arrow",
"\n", "Current time is ", TimeToStr(TimeCurrent()),
"\n", Symbol());
li_0++;
}
}
return (0);
}

Te ha interesado esta opinión? 
10
Reportar este comentario
Alertas sonoras, visuales y por email para tus indicadores 2010-10-25 14:35:09 Rafael Lean
Valoración del artículo 
 
N/D
Opinión de Rafael Lean    25 Octubre , 2010

El de antes

Hola, soy el mismo de antes con la duda para deshabilitar la ventana de alerta; no podia responder a vuestra respuesta.

No se puede compilar porque esta obtenido del archivo con extension .ex4. Pero con MetaEditor, una vez añadido como indicador, lo seleccionamos desde la plataforma de metatrader 4 y asi se puede editar.

Los parametros de:

extern bool alertasenal = true;
extern bool enviosenal = true;

Se los añadi yo, no obstante aunque seleccione como "false" ambos valores, sigue y sigue mostrando las alertas.

?Hay alguna opcion para deshabilitar totalmente todas las ventas de alerta del metatrader?
Assi se podra quitar de un plumazo..

Gracias por la atencion

Te ha interesado esta opinión? 
01
Reportar este comentario
Alertas sonoras, visuales y por email para tus indicadores 2011-05-25 12:23:46 raul salas
Valoración del artículo 
 
N/D
rmeta1 Opinión de rmeta1    25 Mayo , 2011
Top 50 Votante  -   Ver todos mis comentarios

HOLA IndicatoriNosu:

NO se si estoy haciendo lo correcto o no al escribir aqui, primera vez q lo hago y no se si obtendre respuesta.

He perdido barbaridades operando de novato (bueno barbaridades almenos para mi) hasta que he visto el indicador de medias arriba señalado, lo he instalado despues de muchas vueltas y funciona muy bien. Estooy por retirarme del trading pq n hago mas q perder, trabajo de comercial y yo de informatica nada de nada.

Te pregunto comose puede hacer para que el MA_Crossover_Signal_con_alerta.mq4

me envie los mails solo en los graficos de 30m o 1h / lo digo pq recibo miles que no solo me desconciertan sino q no son eficaces.

Por otro lado he leido tus articulos y vaya si los hubiese leido antes alo mejor no me desplumaban tanto.

Por otro lado en donde se te puede seguir?? PQ veo q se puede apreder bastante.

A su vez como de programas yo no entiendo, si haecer que el MA_Crossover_Signal_con_alerta.mq4

Me envie las señales solo en periodos de 30m o 1H tiene coste hazmelo saber
mi email es: salasinversion@gmail.com

Ahh lo uso para materias primas que es por lo que entre en el trading hace muy poco, pero son tan volatiles q en muy poco me van a retirar, salvo q pueda como te comento seguir los avisos de 1h o 30m que compruebo q son eficaces y rentables.

bueno es el primer foro que entro y la primera anotacion que hago.

Si me respondes pues estare muy agradecido y si se puede habilitar esa opcion (no entiendo de codigos, aunque sea de pago) te lo agradecere tambien

Muchas gracias por tu tiempo.
Tks Slds Raul.-
Un novato al borde de las ruina.
Tks.

Te ha interesado esta opinión? 
00
Reportar este comentario
Alertas sonoras, visuales y por email para tus indicadores 2011-08-27 00:00:13 max
Valoración del artículo 
 
N/D
Opinión de max    27 Agosto , 2011

ayuda por favor

bastante bueno el articulo pero se necesita mas conocimientos segun el indicador hay grandes informaciones para llegar al resultado para que la alarma funcione.

Ya que necesito urgente agregarle una alarma a un indicador he intentado logrando un ruido
y hasta se me colgo el pc. Por lo que veo es mas complicado de lo que parece.

Les dejo el indicador por si me ayudan a lograrlo seria sensacional con mensaje de sonido y mensaje. Les agradesco de antemano . Max

Alarma a la primera barra verde y alrma a la primera barra roja.



/*
Generated by EX4-TO-MQ4 decompiler V4.0.224.1 []
Website: http://purebeam.biz
E-mail : purebeam@gmail.com
*/
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"

#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Blue
#property indicator_color2 ForestGreen
#property indicator_color3 Red

extern int period = 27;
extern string www.forexway.ru = "www.forexway.ru";
double g_ibuf_88[];
double g_ibuf_92[];
double g_ibuf_96[];

int init() {
SetIndexStyle(0, DRAW_NONE);
SetIndexStyle(1, DRAW_HISTOGRAM, STYLE_SOLID, 2, ForestGreen);
SetIndexStyle(2, DRAW_HISTOGRAM, STYLE_SOLID, 2, Red);
IndicatorDigits(Digits + 1);
SetIndexBuffer(0, g_ibuf_88);
SetIndexBuffer(1, g_ibuf_92);
SetIndexBuffer(2, g_ibuf_96);
IndicatorShortName("INDICATOR");
SetIndexLabel(1, NULL);
SetIndexLabel(2, NULL);
return (0);
}

int start() {
double ld_8;
double ld_16;
double ld_80;
int li_4 = IndicatorCounted();
double ld_32 = 0;
double ld_40 = 0;
double ld_unused_48 = 0;
double ld_unused_56 = 0;
double ld_64 = 0;
double ld_unused_72 = 0;
double l_low_88 = 0;
double l_high_96 = 0;
if (li_4 > 0) li_4--;
int li_0 = Bars - li_4;
for (int li_104 = 0; li_104 < li_0; li_104++) {
l_high_96 = High[iHighest(NULL, 0, MODE_HIGH, period, li_104)];
l_low_88 = Low[iLowest(NULL, 0, MODE_LOW, period, li_104)];
ld_80 = (High[li_104] + Low[li_104]) / 2.0;
ld_32 = 0.66 * ((ld_80 - l_low_88) / (l_high_96 - l_low_88) - 0.5) + 0.67 * ld_40;
ld_32 = MathMin(MathMax(ld_32, -0.999), 0.999);
g_ibuf_88[li_104] = MathLog((ld_32 + 1.0) / (1 - ld_32)) / 2.0 + ld_64 / 2.0;
ld_40 = ld_32;
ld_64 = g_ibuf_88[li_104];
}
bool li_108 = TRUE;
for (li_104 = li_0 - 2; li_104 >= 0; li_104--) {
ld_16 = g_ibuf_88[li_104];
ld_8 = g_ibuf_88[li_104 + 1];
if ((ld_16 < 0.0 && ld_8 > 0.0) || ld_16 < 0.0) li_108 = FALSE;
if ((ld_16 > 0.0 && ld_8 < 0.0) || ld_16 > 0.0) li_108 = TRUE;
if (!li_108) {
g_ibuf_96[li_104] = ld_16;
g_ibuf_92[li_104] = 0.0;
} else {
g_ibuf_92[li_104] = ld_16;
g_ibuf_96[li_104] = 0.0;
}
}
return (0);
}

Te ha interesado esta opinión? 
10
Reportar este comentario