Inicio Indicador técnico Publicación

iDeMarkerSignAlert: Tu nuevo indicador para MetaTrader 5

Archivos adjuntos
15838.zip (3.08 KB, Descargar 0 veces)

El iDeMarkerSignAlert es un indicador de señales basado en el clásico oscilador DeMarker, que te ayuda a identificar áreas de sobrecompra y sobreventa. Este indicador cuenta con alertas que envían correos electrónicos y notificaciones push a tus dispositivos móviles, facilitando tu operativa.

A continuación, te detallo las mejoras que se han incorporado al código del indicador para implementar estas alertas:

  1. Se han añadido nuevos parámetros de entrada:
    input uint NumberofBar=1;//Número de barras para la señal
    input bool SoundON=true; //Activar 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 notificaciones
                   double &BuyArrow[],        // buffer 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("BUY signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);
          if(EMailON) SendMail(SignalSirname+": BUY signal alert","BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
          if(PushON) SendNotification(SignalSirname+": BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
         }
    
    //---
      }
    //+------------------------------------------------------------------+
    //| Función de señal de venta                                             |
    //+------------------------------------------------------------------+
    void SellSignal(string SignalSirname,      // texto del nombre del indicador para correos y notificaciones
                    double &SellArrow[],       // buffer 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("SELL signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);
          if(EMailON) SendMail(SignalSirname+": SELL signal alert","SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
          if(PushON) SendNotification(SignalSirname+": SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+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);
    

Recuerda que BuyBuffer y SellBuffer son los nombres de los buffers del indicador donde se almacenan las señales de compra y venta. Los valores vacíos en los buffers del indicador deben establecerse 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.

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

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

Fig.2. El indicador iDeMarkerSignAlert generando alertas

Fig.2. El indicador iDeMarkerSignAlert. Generando alertas.

Publicaciones relacionadas

Comentarios (0)