Inicio Indicador técnico Publicación

iWPRSignAlert: Tu nuevo aliado en MetaTrader 5

Archivos adjuntos
15837.zip (3.06 KB, Descargar 0 veces)

El indicador de señales con flechas de tipo semáforo se basa en el clásico oscilador Williams’ Percent Range, lo que te permite identificar fácilmente las zonas de sobrecompra y sobreventa. Además, cuenta con alertas que envían correos electrónicos y notificaciones push a dispositivos móviles.

Para implementar estas alertas y notificaciones, se han realizado varios cambios en el código del indicador:

  1. Se han introducido 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 envío de señales por correo
    input bool PushON=false; //Habilitar envío de señales a dispositivos móviles
    
  2. 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 y mensajes push
                   double &BuyArrow[],        // búfer del indicador con señales de compra
                   const int Rates_total,     // el número actual de barras
                   const int Prev_calculated, // el número de barras en el tick anterior
                   const double &Close[],     // precio de cierre
                   const int &Spread[])       // spread
      {
    //---
       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,"
     tiempo actual=",text,"
     Símbolo=",Symbol()," Period=",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()+" Period="+sPeriod);
          if(PushON) SendNotification(SignalSirname+": Se ha generado la señal de COMPRA en Ask="+sAsk+", Bid="+sBid+", Fecha="+text+" Símbolo="+Symbol()+" Period="+sPeriod);
         }
    
    //---
      }
    //+------------------------------------------------------------------+
    //| Función de señal de venta                                             |
    //+------------------------------------------------------------------+
    void SellSignal(string SignalSirname,      // texto del nombre del indicador para correos y mensajes push
                    double &SellArrow[],       // búfer del indicador con señales de venta
                    const int Rates_total,     // el número actual de barras
                    const int Prev_calculated, // el número de barras en el tick anterior
                    const double &Close[],     // precio de cierre
                    const int &Spread[])       // spread
      {
    //---
       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,"
     tiempo actual=",text,"
     Símbolo=",Symbol()," Period=",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()+" Period="+sPeriod);
          if(PushON) SendNotification(SignalSirname+": Se ha generado la señal de VENTA en Ask="+sAsk+", Bid="+sBid+", Fecha="+text+" Símbolo="+Symbol()+" Period="+sPeriod);
         }
    //---
      }
    //+------------------------------------------------------------------+
    //|  Obtener el timeframe como una cadena                               |
    //+------------------------------------------------------------------+
    string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
      {
    //----
       return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
      }
    
  3. Se añadieron llamadas a las funciones BuySignal() y SellSignal() después de los ciclos de cálculo del indicador en el bloque OnCalculate():
    BuySignal("iWPRSign",BuyBuffer,rates_total,prev_calculated,close,spread);
        SellSignal("iWPRSign",SellBuffer,rates_total,prev_calculated,close,spread);
    

Donde BuyBuffer y SellBuffer son los nombres de los búferes del indicador para almacenar las señales de compra y venta. Es importante que los valores vacíos en los búferes del indicador sean 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.

Fig.1. El indicador iWPRSignAlert

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

Fig.2. El indicador iWPRSignAlert generando alertas

Fig.2. El indicador iWPRSignAlert. Generando alertas.

Publicaciones relacionadas

Comentarios (0)