Inicio Indicador técnico Publicación

BykovTrendAlert: El Indicador Ideal para MetaTrader 5

Archivos adjuntos
16458.zip (3.75 KB, Descargar 0 veces)

Autor original:

Ramdass - Conversión únicamente

El BykovTrend es un indicador de señales tipo semáforo que cuenta con alertas, envíos de correos electrónicos y notificaciones push a dispositivos móviles.

Para implementar las alertas, los mensajes de correo y las notificaciones push, se realizaron los siguientes cambios en el código del indicador:

  1. Se introdujeron nuevos parámetros de entrada.
    input uint NumeroDeBarra=1;//Número de barra para la señal
    input bool SonidoON=true; //Habilitar alertas
    input uint NumeroDeAlertas=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 NombreSeñal,      // texto del nombre del indicador para mensajes de correo y push
                   double &FlechaCompra[],        // buffer del indicador con señales de compra
                   const int TotalRates,     // 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 &Spread[])       // spread
      {
    //---
       static uint contador=0;
       if(TotalRates!=Prev_calculado) contador=0;
    
       bool señalCompra=false;
       bool pruebaSerie=ArrayGetAsSeries(FlechaCompra);
       int indice;
       if(pruebaSerie) indice=int(NumeroDeBarra);
       else indice=TotalRates-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=TotalRates-int(NumeroDeBarra)-1;
          double Ask=Cierre[indice];
          double Bid=Cierre[indice];
          pruebaSerie=ArrayGetAsSeries(Spread);
          if(pruebaSerie) indice=int(NumeroDeBarra);
          else indice=TotalRates-int(NumeroDeBarra)-1;
          Bid+=Spread[indice];
          string sAsk=DoubleToString(Ask,_Digits);
          string sBid=DoubleToString(Bid,_Digits);
          string sPeriodo=GetStringTimeframe(ChartPeriod();
          if(SonidoON) Alert("Señal de COMPRA 
     Ask=",Ask,"
     Bid=",Bid,"
     tiempo actual=",texto,"
     Símbolo=",Symbol()," Periodo=",sPeriodo);
          if(EmailON) SendMail(NombreSeñal+": alerta de señal de COMPRA","Señal de COMPRA en Ask="+sAsk+", Bid="+sBid+", Fecha="+texto+" Símbolo="+Symbol()+" Periodo="+sPeriodo);
          if(PushON) SendNotification(NombreSeñal+": Señal de COMPRA en Ask="+sAsk+", Bid="+sBid+", 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 mensajes de correo y push
                    double &FlechaVenta[],       // buffer del indicador con señales de venta
                    const int TotalRates,     // 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 &Spread[])       // spread
      {
    //---
       static uint contador=0;
       if(TotalRates!=Prev_calculado) contador=0;
    
       bool señalVenta=false;
       bool pruebaSerie=ArrayGetAsSeries(FlechaVenta);
       int indice;
       if(pruebaSerie) indice=int(NumeroDeBarra);
       else indice=TotalRates-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=TotalRates-int(NumeroDeBarra)-1;
          double Ask=Cierre[indice];
          double Bid=Cierre[indice];
          pruebaSerie=ArrayGetAsSeries(Spread);
          if(pruebaSerie) indice=int(NumeroDeBarra);
          else indice=TotalRates-int(NumeroDeBarra)-1;
          Bid+=Spread[indice];
          string sAsk=DoubleToString(Ask,_Digits);
          string sBid=DoubleToString(Bid,_Digits);
          string sPeriodo=GetStringTimeframe(ChartPeriod());
          if(SonidoON) Alert("Señal de VENTA 
     Ask=",Ask,"
     Bid=",Bid,"
     tiempo actual=",texto,"
     Símbolo=",Symbol()," Periodo=",sPeriodo);
          if(EmailON) SendMail(NombreSeñal+": alerta de señal de VENTA","Señal de VENTA en Ask="+sAsk+", Bid="+sBid+", Fecha="+texto+" Símbolo="+Symbol()+" Periodo="+sPeriodo);
          if(PushON) SendNotification(NombreSeñal+": Señal de VENTA en Ask="+sAsk+", Bid="+sBid+", Fecha="+texto+" Símbolo="+Symbol()+" Periodo="+sPeriodo);
         }
    //---
      }
    //+------------------------------------------------------------------+
    //|  Obtener el marco de tiempo como una cadena                         |
    //+------------------------------------------------------------------+
    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("BykovTrendAlert",FlechaCompra,total_rates,prev_calculated,cierre,spread);
       SellSignal("BykovTrendAlert",FlechaVenta,total_rates,prev_calculated,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 configurados 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.

Este indicador fue implementado por primera vez en MQL4 y publicado en Code Base el 28.09.2007.

Fig1. El indicador BykovTrendAlert en el gráfico

Fig1. El indicador BykovTrendAlert en el gráfico


Fig.2. El indicador BykovTrendAlert Generando alertas.

Fig.2. El indicador BykovTrendAlert Generando alertas.

Publicaciones relacionadas

Comentarios (0)