iDeMarkerSignAlert: Tu nuevo indicador para MetaTrader 5

Mike 2016.07.20 23:43 198 0 0
Archivos adjuntos

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:
    inputuint NumberofBar=1;//Número de barras para la señalinputbool SoundON=true; //Activar alertasinputuint NumberofAlerts=2;//Número de alertasinputbool EMailON=false; //Habilitar envío de señales por correoinputbool 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
                   constint Rates_total,     // el número actual de barras
                   constint Prev_calculated, // el número de barras en el tick anterior
                   constdouble &Close[],     // precio de cierre
                   constint &Spread[])       // spread
      {
    //---
       staticuint 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;
          doubleAsk=Close[index];
          doubleBid=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
                    constint Rates_total,     // el número actual de barras
                    constint Prev_calculated, // el número de barras en el tick anterior
                    constdouble &Close[],     // precio de cierre
                    constint &Spread[])       // spread
      {
    //---
       staticuint 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;
          doubleAsk=Close[index];
          doubleBid=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.

Lista
Comentarios 0