Inicio Indicador técnico Publicación

wlxBW5ZoneAlert: El Indicador Definitivo para MetaTrader 5

Archivos adjuntos
16121.zip (3.5 KB, Descargar 0 veces)

Autor real:

Wellx

Hoy quiero hablarles sobre el indicador wlxBW5ZoneAlert, un sistema de señales basado en el Oscilador Acelerador y el Oscilador Asombroso de Bill Williams. Este indicador no solo ofrece señales, sino que también envía alertas, correos electrónicos y notificaciones push a nuestros dispositivos móviles.

A continuación, les detallo los cambios realizados en el código del indicador para implementar las alertas, los correos electrónicos y las notificaciones push:

  • Se introdujeron nuevos parámetros de entrada:
    input uint NumberofBar=1;//Número de barras para la señal
    input bool SoundON=true; //Habilitar alertas
    input uint NumberofAlerts=2;//Número de alertas
    input bool EMailON=false; //Habilitar el envío de correos electrónicos
    input bool PushON=false; //Habilitar el envío de señales a dispositivos móviles
    
  • Se añadieron tres nuevas funciones al final del código del indicador: BuySignal(), SellSignal() y GetStringTimeframe().
    //+------------------------------------------------------------------+
    //| Función de señal de compra                                            |
    //+------------------------------------------------------------------+
    void BuySignal(string SignalSirname,      // texto del nombre del indicador para correos electrónicos y mensajes push
                   double &BuyArrow[],        // buffer del indicador con señales de compra
                   const int Rates_total,     // número actual de barras
                   const int Prev_calculated, // número de barras en el tick anterior
                   const double &Close[],     // precio de cierre
                   const int &Spread[])       // spread
      {
    u//---
       static uint counter=0;
       if(Rates_total!=Prev_calculated) counter=0;
    
       bool BuySignal=false;
       bool SeriesTest=ArrayGetAsSeries(BuyArrow);
       int index;
       if(SeriesTest) index=int(NumberofBar);
       else index=Rates_total-int(NumberofBar)-1;
       if(NormalizeDouble(BuyArrow[index],_Digits) && BuyArrow[index]!=EMPTY_VALUE) BuySignal=true;
       if(BuySignal && counter<=NumberofAlerts)
         {
          counter++;
          MqlDateTime tm;
          TimeToStruct(TimeCurrent(),tm);
          string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
          SeriesTest=ArrayGetAsSeries(Close);
          if(SeriesTest) index=int(NumberofBar);
          else index=Rates_total-int(NumberofBar)-1;
          double Ask=Close[index];
          double Bid=Close[index];
          SeriesTest=ArrayGetAsSeries(Spread);
          if(SeriesTest) index=int(NumberofBar);
          else index=Rates_total-int(NumberofBar)-1;
          Bid+=Spread[index];
          string sAsk=DoubleToString(Ask,_Digits);
          string sBid=DoubleToString(Bid,_Digits);
          string sPeriod=GetStringTimeframe(ChartPeriod());
          if(SoundON) Alert("Señal de COMPRA 
     Ask=",Ask,"
     Bid=",Bid,"
     Fecha y Hora=",text,"
     Símbolo=",Symbol()," Periodo=",sPeriod);
          if(EMailON) SendMail(SignalSirname+": Alerta de señal de COMPRA","Señal de COMPRA en Ask="+sAsk+", Bid="+sBid+", Fecha="+text+" Símbolo="+Symbol()+" Periodo="+sPeriod);
          if(PushON) SendNotification(SignalSirname+": Señal de COMPRA en Ask="+sAsk+", Bid="+sBid+", Fecha="+text+" Símbolo="+Symbol()+" Periodo="+sPeriod);
         }
    
    u//---
      }
    //+------------------------------------------------------------------+
    //| Función de señal de venta                                             |
    //+------------------------------------------------------------------+
    void SellSignal(string SignalSirname,      // texto del nombre del indicador para correos electrónicos y mensajes push
                    double &SellArrow[],       // buffer del indicador con señales de venta
                    const int Rates_total,     // número actual de barras
                    const int Prev_calculated, // número de barras en el tick anterior
                    const double &Close[],     // precio de cierre
                    const int &Spread[])       // spread
      {
    u//---
       static uint counter=0;
       if(Rates_total!=Prev_calculated) counter=0;
    
       bool SellSignal=false;
       bool SeriesTest=ArrayGetAsSeries(SellArrow);
       int index;
       if(SeriesTest) index=int(NumberofBar);
       else index=Rates_total-int(NumberofBar)-1;
       if(NormalizeDouble(SellArrow[index],_Digits) && SellArrow[index]!=EMPTY_VALUE) SellSignal=true;
       if(SellSignal && counter<=NumberofAlerts)
         {
          counter++;
          MqlDateTime tm;
          TimeToStruct(TimeCurrent(),tm);
          string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
          SeriesTest=ArrayGetAsSeries(Close);
          if(SeriesTest) index=int(NumberofBar);
          else index=Rates_total-int(NumberofBar)-1;
          double Ask=Close[index];
          double Bid=Close[index];
          SeriesTest=ArrayGetAsSeries(Spread);
          if(SeriesTest) index=int(NumberofBar);
          else index=Rates_total-int(NumberofBar)-1;
          Bid+=Spread[index];
          string sAsk=DoubleToString(Ask,_Digits);
          string sBid=DoubleToString(Bid,_Digits);
          string sPeriod=GetStringTimeframe(ChartPeriod());
          if(SoundON) Alert("Señal de VENTA 
     Ask=",Ask,"
     Bid=",Bid,"
     Fecha y Hora=",text,"
     Símbolo=",Symbol()," Periodo=",sPeriod);
          if(EMailON) SendMail(SignalSirname+": Alerta de señal de VENTA","Señal de VENTA en Ask="+sAsk+", Bid="+sBid+", Fecha="+text+" Símbolo="+Symbol()+" Periodo="+sPeriod);
          if(PushON) SendNotification(SignalSirname+": Señal de VENTA en Ask="+sAsk+", Bid="+sBid+", Fecha="+text+" Símbolo="+Symbol()+" Periodo="+sPeriod);
         }
    u//---
      }
    //+------------------------------------------------------------------+
    //|  Obtener el marco de tiempo como una cadena                       |
    //+------------------------------------------------------------------+
    string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
      {
    //----
       return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
      }
    
  • Se añadieron un par de llamados a las funciones BuySignal() y SellSignal() después de los ciclos de cálculo del indicador en el bloque OnCalculate().
    u//---     
       BuySignal("wlxBW5ZoneAlert",BuyBuffer,rates_total,prev_calculated,close,spread);
       SellSignal("wlxBW5ZoneAlert",SellBuffer,rates_total,prev_calculated,close,spread);
    u//---
    

Donde BuyBuffer y SellBuffer son los nombres de los buffers del indicador para almacenar las señales de compra y venta. Los valores vacíos en los buffers del indicador deben ser configurados como ceros o EMPTY_VALUE.

Se asume que solo se utilizará una llamada a las funciones BuySignal() y SellSignal() en el bloque OnCalculate() del código del indicador.

El indicador utiliza las clases de la biblioteca SmoothAlgorithms.mqh (cópialo a <terminal_data_folder>\MQL5\Include). El uso de estas clases se describió a fondo en el artículo "Promediando Series de Precios para Cálculos Intermedios Sin Usar Buffers Adicionales".

Originalmente, este indicador fue escrito en MQL4 y se publicó por primera vez en la Base de Código el 08.03.2008.

Fig.1. El indicador wlxBW5ZoneAlert en el gráfico

Fig.1. El indicador wlxBW5ZoneAlert en el gráfico

Fig.2. El indicador wlxBW5ZoneAlert. Generando alertas.

Fig.2. El indicador wlxBW5ZoneAlert. Generando alertas.

Publicaciones relacionadas

Comentarios (0)