Cómo Poner una Alerta a un Indicador en MQL4

En muchísimas ocasiones me han preguntado cómo poner alertas a un determinado indicador y, si bien no existe una forma única, en este artículo voy a tratar de dar respuesta de la forma más genérica posible a dicha pregunta.

Lo primero de todo evidentemente es abrir el archivo del indicador al cual queremos poner la alerta. Para nuestro ejemplo voy a utilizar un indicador bastante conocido, el Color Stochastic (podéis descargarlo desde el Foro visitando este hilo. Una vez abierto con el MetaEditor debemos seguir estos pasos:

1. Lo primero de todo es buscar el apartado de parámetros del indicador al comienzo del código del indicador. Se trata de una serie de línea que generalmente vienen precedidos de la palabra extern. En concreto debemos buscar el último extern que en nuestro caso es:

extern int       overSold  =20;

Y pegar a continuación el siguiente bloque de código:

extern int     AlertCandle         = 1;                                                                  
extern bool    ShowChartAlerts     = false;
extern string  AlertEmailSubject   = "";
datetime       LastAlertTime       = -999999;
string         AlertTextCrossUp    = "Estocástico en Sobrecompra";
string         AlertTextCrossDown  = "Estocástico en Sobreventa";

Como podemos ver, nuestra intención es definir cuándo el indicador está en sobrecompra y cuándo en sobreventa.

2. Seguidamente debemos buscar dentro del bloque int start() y justo antes del último return(0) que aparezca en ese bloque pegaremos el siguiente código:

ProcessAlerts();

Con esto lo que conseguimos es que se procese la función ProcessAlerts que vamos a definir en el siguiente paso y que va a ser la que ejecute las alertas.

3. Finalmente debemos pegar este código al final del todo del indicador:


int ProcessAlerts()   {

  if (AlertCandle >= 0  &&  Time[0] > LastAlertTime)   {

 if (KFull[AlertCandle] > overBought  &&  KFull[AlertCandle+1] <= overBought)  {
      string AlertText = Symbol() + "," + TFToStr(Period()) + ": " + AlertTextCrossUp;
      if (ShowChartAlerts)          Alert(AlertText);
      if (AlertEmailSubject > "")   SendMail(AlertEmailSubject,AlertText);
      LastAlertTime = Time[0];
   }

if (KFull[AlertCandle] < overSold  &&  KFull[AlertCandle+1] >= overSold)  {
      AlertText = Symbol() + "," + TFToStr(Period()) + ": " + AlertTextCrossDown;

      if (ShowChartAlerts)          Alert(AlertText);
      if (AlertEmailSubject > "")   SendMail(AlertEmailSubject,AlertText);
      LastAlertTime = Time[0];

    }

  }  return(0);

}

+------------------------------------------------------------------+
string TFToStr(int tf)   {
+------------------------------------------------------------------+
if (tf == 0)        tf = Period();
  if (tf >= 43200)    return("MN");
  if (tf >= 10080)    return("W1");
  if (tf >=  1440)    return("D1");
  if (tf >=   240)    return("H4");
  if (tf >=    60)    return("H1");
  if (tf >=    30)    return("M30");
  if (tf >=    15)    return("M15");
  if (tf >=     5)    return("M5");
  if (tf >=     1)    return("M1");
  return("");
}

Para cualquier otro indicador, bastaría con cambiar los nombres de los buffers (en este caso KFull) por los del buffer del indicador que nos interese. Asimismo, a la derecha de la desigualdad (por ejemplo donde pone Overbought en KFull[AlertCandle] > overBought  &&  KFull[AlertCandle+1] <= overBought) podemos poner cualquier valor o parámetro así como cualquier otro buffer. En definitiva es ingeniárselas un poco para conseguir que aparezca la condición de la que deseamos ser alertados, lo demás va rodado.

Si además quisiéramos añadir alertas al móvil simplemente deberíamos modificar el código anterior añadiendo la función SendNotification de MQL4 en el if que dispara la alerta if(Show Alerts) para que nos envíe la alerta al móvil con el mensaje que deseemos. Abriendo unas llaves para meter las dos condiciones [Alert(AlertText); y SendNotification(AlertText);], el código anterior quedaría de la siguiente manera:



                                                                         
int ProcessAlerts()   {
if (AlertCandle >= 0  &&  Time[0] > LastAlertTime)   {
                                                                     
if (KFull[AlertCandle] > overBought  &&  KFull[AlertCandle+1] <= overBought)  {
      string AlertText = Symbol() + "," + TFToStr(Period()) + ": " + AlertTextCrossUp;
      if (ShowChartAlerts)          {Alert(AlertText);  SendNotification(AlertText); }
      if (AlertEmailSubject > "")   SendMail(AlertEmailSubject,AlertText);
      LastAlertTime = Time[0];
    }
    
if (KFull[AlertCandle] < overSold  &&  KFull[AlertCandle+1] >= overSold)  {
      AlertText = Symbol() + "," + TFToStr(Period()) + ": " + AlertTextCrossDown;
      if (ShowChartAlerts)         { Alert(AlertText); SendNotification(AlertText); }
      if (AlertEmailSubject > "")   SendMail(AlertEmailSubject,AlertText);
      LastAlertTime = Time[0];
    }

  }
  return(0);
}

+------------------------------------------------------------------+
string TFToStr(int tf)   {
+------------------------------------------------------------------+
  if (tf == 0)        tf = Period();
  if (tf >= 43200)    return("MN");
  if (tf >= 10080)    return("W1");
  if (tf >=  1440)    return("D1");
  if (tf >=   240)    return("H4");
  if (tf >=    60)    return("H1");
  if (tf >=    30)    return("M30");
  if (tf >=    15)    return("M15");
  if (tf >=     5)    return("M5");
  if (tf >=     1)    return("M1");
  return("");
}

Si todo ha ido correctamente, basta con que compilemos y listo, ya tenemos nuestro indicador con alertas. Ahora insertamos el indicador y además de sus parámetros habituales, nos encontraremos con los relativos a las alertas como podemos ver en la siguiente imagen:

 

 

Los valores que admite cada parámetro son los siguientes:

  • AlertCandle: debemos ponerlo en 1 si queremos que la alerta salte una vez que la vela actual se cierre y se cree una nueva. Si queremos que las alertas se disparen directamente en la vela actual debemos fijar este parámetro en 0.
  • ShowChartAlerts: lo pondremos en True si queremos que salte la típica ventanita con sonido de Metatrader cuando se dispare la alerta.
  • AlertEmailSubject: en caso de que queramos que Metatrader nos envíe un email con la alerta, bastará con poner aquí el texto del asunto del correo que se enviará. Si lo dejamos en blanco no enviará ningún email. En todo caso recordad que debéis tener configurado correctamente el apartado de Email dentro de las opciones de Metatrader para que funcione.

 

Saludos,
X-Trader

COMPARTIR EN: