Inicio Indicador técnico Publicación

Fisher_org_v1_Sign: Indicador de Alertas para MetaTrader 5

Archivos adjuntos
15880.zip (4.18 KB, Descargar 0 veces)

Autor real:

TrendLaboratory Ltd.

Te presento el indicador de señales con flechas de semáforo basado en el oscilador Fisher_org_v1. Este indicador te ayudará a identificar cuándo salir de las zonas de sobrecompra y sobreventa, además de contar con alertas que envían correos electrónicos y notificaciones push a tus dispositivos móviles.

Se han realizado las siguientes modificaciones en el código del indicador para implementar las alertas, mensajes de correo y notificaciones push:

  1. Se introdujeron nuevos parámetros de entrada:
    input uint NumeroDeBarra=1;//Número de barra para la señal
    input bool SonidoActivado=true; //Habilitar alertas
    input uint NumeroDeAlertas=2;//Número de alertas
    input bool CorreoActivado=false; //Habilitar envío de señales por correo
    input bool NotificacionPushActivada=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 NombreSeñal,      // texto del nombre del indicador para correos y mensajes push
                   double &FlechaCompra[],        // buffer del indicador con señales de compra
                   const int TotalDeBarras,     // el número actual de barras
                   const int Prev_calculado, // el número de barras en el tick anterior
                   const double &Cierre[],     // precio de cierre
                   const int &Diferencial[])       // spread
      {
    u//---
       static uint contador=0;
       if(TotalDeBarras!=Prev_calculado) contador=0;
    
       bool SeñalCompra=false;
       bool PruebaSerie=ArrayGetAsSeries(FlechaCompra);
       int indice;
       if(PruebaSerie) indice=int(NumeroDeBarra);
       else indice=TotalDeBarras-int(NumeroDeBarra)-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(NumeroDeBarra);
          else indice=TotalDeBarras-int(NumeroDeBarra)-1;
          double Preguntar=Cierre[indice];
          double Ofertar=Cierre[indice];
          PruebaSerie=ArrayGetAsSeries(Diferencial);
          if(PruebaSerie) indice=int(NumeroDeBarra);
          else indice=TotalDeBarras-int(NumeroDeBarra)-1;
          Ofertar+=Diferencial[indice];
          string sOfertar=DoubleToString(Preguntar,_Digits);
          string sBid=DoubleToString(Ofertar,_Digits);
          string sPeriodo=GetStringTimeframe(ChartPeriod());
          if(SonidoActivado) Alert("Señal de COMPRA 
     Preguntar=",Preguntar,"
     Ofertar=",Ofertar,"
     hora actual=",texto,"
     Símbolo=",Symbol()," Periodo=",sPeriodo);
          if(CorreoActivado) SendMail(NombreSeñal+": alerta de señal de COMPRA","Señal de COMPRA en Preguntar="+sOfertar+", Ofertar="+sBid+", Fecha="+texto+" Símbolo="+Symbol()+" Periodo="+sPeriodo);
          if(NotificacionPushActivada) SendNotification(NombreSeñal+": Seña de COMPRA en Preguntar="+sOfertar+", Ofertar="+sBid+", Fecha="+texto+" Símbolo="+Symbol()+" Periodo="+sPeriodo);
         }
    
    u//---
      }
    //+------------------------------------------------------------------+
    //| Función de señal de venta                                             |
    //+------------------------------------------------------------------+
    void SellSignal(string NombreSeñal,      // texto del nombre del indicador para correos y mensajes push
                    double &FlechaVenta[],       // buffer del indicador con señales de venta
                    const int TotalDeBarras,     // el número actual de barras
                    const int Prev_calculado, // el número de barras en el tick anterior
                    const double &Cierre[],     // precio de cierre
                    const int &Diferencial[])       // spread
      {
    u//---
       static uint contador=0;
       if(TotalDeBarras!=Prev_calculado) contador=0;
    
       bool SeñalVenta=false;
       bool PruebaSerie=ArrayGetAsSeries(FlechaVenta);
       int indice;
       if(PruebaSerie) indice=int(NumeroDeBarra);
       else indice=TotalDeBarras-int(NumeroDeBarra)-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(NumeroDeBarra);
          else indice=TotalDeBarras-int(NumeroDeBarra)-1;
          double Preguntar=Cierre[indice];
          double Ofertar=Cierre[indice];
          PruebaSerie=ArrayGetAsSeries(Diferencial);
          if(PruebaSerie) indice=int(NumeroDeBarra);
          else indice=TotalDeBarras-int(NumeroDeBarra)-1;
          Ofertar+=Diferencial[indice];
          string sOfertar=DoubleToString(Preguntar,_Digits);
          string sBid=DoubleToString(Ofertar,_Digits);
          string sPeriodo=GetStringTimeframe(ChartPeriod());
          if(SonidoActivado) Alert("Señal de VENTA 
     Preguntar=",Preguntar,"
     Ofertar=",Ofertar,"
     hora actual=",texto,"
     Símbolo=",Symbol()," Periodo=",sPeriodo);
          if(CorreoActivado) SendMail(NombreSeñal+": alerta de señal de VENTA","Señal de VENTA en Preguntar="+sOfertar+", Ofertar="+sBid+", Fecha="+texto+" Símbolo="+Symbol()+" Periodo="+sPeriodo);
          if(NotificacionPushActivada) SendNotification(NombreSeñal+": Señal de VENTA en Preguntar="+sOfertar+", Ofertar="+sBid+", Fecha="+texto+" Símbolo="+Symbol()+" Periodo="+sPeriodo);
         }
    u//---
      }
    //+------------------------------------------------------------------+
    //|  Obtener el marco de tiempo como un string                          |
    //+------------------------------------------------------------------+
    string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
      {
    //----
       return(StringSubstr(EnumToString(timeframe),7,-1));
    //----
      }
    
  3. 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()
    BuySignal("iWPRSign",FlechaCompra,total_de_barras,prev_calculado,cierre,diferencial);
        SellSignal("iWPRSign",FlechaVenta,total_de_barras,prev_calculado,cierre,diferencial);
    

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 establecerse en cero o en 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 Fisher_org_v1_Sign en el gráfico

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

Fig.2. El indicador Fisher_org_v1_Sign Generando alertas.

Fig.2. El indicador Fisher_org_v1_Sign Generando alertas.

Publicaciones relacionadas

Comentarios (0)