iStochKomposterAlert: El Indicador de Señales para MetaTrader 5 con Alertas

Mike 2016.07.20 23:45 256 0 0
Archivos adjuntos

Autor real:

komposter

El iStochKomposterAlert es un indicador basado en el clásico oscilador estocástico, que ayuda a identificar zonas de sobrecompra y sobreventa. Este indicador incluye alertas, enviando notificaciones por correo electrónico y a dispositivos móviles.

A continuación, se detallan las modificaciones realizadas en el código del indicador para implementar las alertas, correos electrónicos y notificaciones push:

  1. Se han introducido nuevos parámetros de entrada:
  2. inputuint NumeroDeBar=1;//Número de barra para la señalinputbool SonidoON=true; //Habilitar alertasinputuint NumeroDeAlertas=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
  3. Se añadieron tres nuevas funciones al final del código del indicador: BuySignal(), SellSignal() y GetStringTimeframe()
  4. //+------------------------------------------------------------------+//| Función de señal de compra                                              |//+------------------------------------------------------------------+void BuySignal(string NombreSeñal,      // texto del nombre del indicador para correos y mensajes
                   double &FlechaCompra[],        // buffer del indicador con señales de compra
                   constint Total_Barras,     // el número actual de barras
                   constint Previo_Calculado, // el número de barras en el tick anterior
                   constdouble &Cierre[],     // precio de cierre
                   constint &Spread[])       // spread
      {
    //---
       staticuint contador=0;
       if(Total_Barras!=Previo_Calculado) contador=0;
    
       bool SeñalCompra=false;
       bool PruebaSerie=ArrayGetAsSeries(FlechaCompra);
       int indice;
       if(PruebaSerie) indice=int(NumeroDeBar);
       else indice=Total_Barras-int(NumeroDeBar)-1;
       if(NormalizeDouble(FlechaCompra[indice],_Digits) && FlechaCompra[indice]!=EMPTY_VALUE) SeñalCompra=true;
       if(SeñalCompra && contador<=NumeroDeAlertas)
         {
          contador++;
          MqlDateTime tm;
          TimeToStruct(TimeCurrent(),tm);
          string texto=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
          PruebaSerie=ArrayGetAsSeries(Cierre);
          if(PruebaSerie) indice=int(NumeroDeBar);
          else indice=Total_Barras-int(NumeroDeBar)-1;
          doublePregunta=Cierre[indice];
          doubleOferta=Cierre[indice];
          PruebaSerie=ArrayGetAsSeries(Spread);
          if(PruebaSerie) indice=int(NumeroDeBar);
          else indice=Total_Barras-int(NumeroDeBar)-1;
          Oferta+=Spread[indice];
          string sPregunta=DoubleToString(Pregunta,_Digits);
          string sOferta=DoubleToString(Oferta,_Digits);
          string sPeriodo=GetStringTimeframe(ChartPeriod());
          if(SonidoON) Alert("Señal de COMPRA 
     Oferta=",Pregunta,"
     Bid=",Oferta,"
     hora actual=",texto,"
     Símbolo=",Symbol()," Periodo=",sPeriodo);
          if(EMailON) SendMail(NombreSeñal+": alerta de señal de COMPRA","Señal de COMPRA en Oferta="+sPregunta+", Bid="+sOferta+", Fecha="+texto+" Símbolo="+Symbol()+" Periodo="+sPeriodo);
          if(PushON) SendNotification(NombreSeñal+": Señal de COMPRA en Oferta="+sPregunta+", Bid="+sOferta+", Fecha="+texto+" Símbolo="+Symbol()+" Periodo="+sPeriodo);
         }
    //---
      }
    //+------------------------------------------------------------------+//| Función de señal de venta                                             |//+------------------------------------------------------------------+void SellSignal(string NombreSeñal,      // texto del nombre del indicador para correos y mensajes
                    double &FlechaVenta[],       // buffer del indicador con señales de venta
                    constint Total_Barras,     // el número actual de barras
                    constint Previo_Calculado, // el número de barras en el tick anterior
                    constdouble &Cierre[],     // precio de cierre
                    constint &Spread[])       // spread
      {
    //---
       staticuint contador=0;
       if(Total_Barras!=Previo_Calculado) contador=0;
    
       bool SeñalVenta=false;
       bool PruebaSerie=ArrayGetAsSeries(FlechaVenta);
       int indice;
       if(PruebaSerie) indice=int(NumeroDeBar);
       else indice=Total_Barras-int(NumeroDeBar)-1;
       if(NormalizeDouble(FlechaVenta[indice],_Digits) && FlechaVenta[indice]!=EMPTY_VALUE) SeñalVenta=true;
       if(SeñalVenta && contador<=NumeroDeAlertas)
         {
          contador++;
          MqlDateTime tm;
          TimeToStruct(TimeCurrent(),tm);
          string texto=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
          PruebaSerie=ArrayGetAsSeries(Cierre);
          if(PruebaSerie) indice=int(NumeroDeBar);
          else indice=Total_Barras-int(NumeroDeBar)-1;
          doublePregunta=Cierre[indice];
          doubleOferta=Cierre[indice];
          PruebaSerie=ArrayGetAsSeries(Spread);
          if(PruebaSerie) indice=int(NumeroDeBar);
          else indice=Total_Barras-int(NumeroDeBar)-1;
          Oferta+=Spread[indice];
          string sPregunta=DoubleToString(Pregunta,_Digits);
          string sOferta=DoubleToString(Oferta,_Digits);
          string sPeriodo=GetStringTimeframe(ChartPeriod());
          if(SonidoON) Alert("Señal de VENTA 
     Oferta=",Pregunta,"
     Bid=",Oferta,"
     hora actual=",texto,"
     Símbolo=",Symbol()," Periodo=",sPeriodo);
          if(EMailON) SendMail(NombreSeñal+": alerta de señal de VENTA","Señal de VENTA en Oferta="+sPregunta+", Bid="+sOferta+", Fecha="+texto+" Símbolo="+Symbol()+" Periodo="+sPeriodo);
          if(PushON) SendNotification(NombreSeñal+": Señal de VENTA en Oferta="+sPregunta+", Bid="+sOferta+", Fecha="+texto+" Símbolo="+Symbol()+" Periodo="+sPeriodo);
         }
    //---
      }
    //+------------------------------------------------------------------+//|  Obtener el timeframe como un string                               |//+------------------------------------------------------------------+string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
      {
    //----
       return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
      }
    
  5. Se añadieron un par de llamadas a las funciones BuySignal() y SellSignal() después de los ciclos de cálculo del indicador en el bloque OnCalculate():
  6. BuySignal("iWPRSign",FlechaCompra,total_barras,previo_calculado,cierre,spread);
        SellSignal("iWPRSign",FlechaVenta,total_barras,previo_calculado,cierre,spread);
    

Donde FlechaCompra y FlechaVenta 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 cero 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 iStochKomposterAlert en el gráfico

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

Fig.2. El indicador iStochKomposterAlert. Generando alertas.

Fig.2. El indicador iStochKomposterAlert. Generando alertas.

Lista
Comentarios 0