RJTX_Matches_Smoothed_Alert: Un Indicador Esencial para MetaTrader 5

Mike 2018.12.28 22:09 24 0 0
Archivos adjuntos

Autor real:

Rafael Jimenez Tocino

Indicador RJTX_Matches_Smoothed que incluye alertas, correos electrónicos y notificaciones push para smartphones.

Se han realizado varios cambios en el código del indicador para implementar alertas, mensajes de correo electrónico y notificaciones push:

  1. Se añadieron nuevas variables de entrada al indicador
    input uint NumeroDeBarras=1;                 // Número de barras para activar la señal
    input bool SonidoActivado=true;          // Habilitar alertas
    input uint NumeroDeAlertas=2;       // Número de alertas
    input bool CorreoActivado=false;          // Habilitar el envío de señales por correo
    input bool NotificacionPushActivada=false;           // Habilitar el envío de señales a dispositivos móviles
    


  2. Se agregaron tres nuevas funciones al final 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 TotalBarras,     // número actual de barras
                   const int &Prev_calculated, // número de barras en el tick anterior
                   const double &Cierre[],     // precio de cierre
                   const int &Spread[])       // spread
      {
    //---
       static uint contador=0;
       if(TotalBarras!=Prev_calculated) contador=0;
    
       bool SeñalCompra=false;
       bool PruebaSerie=ArrayGetAsSeries(FlechaCompra);
       int indice,indice1;
       if(PruebaSerie)
        {
         indice=int(NumeroDeBarras);
         indice1=indice+1;
        }
       else
         {
          indice=TotalBarras-int(NumeroDeBarras)-1;
          indice1=indice-1;
         }
       if(!FlechaCompra[indice1] && FlechaCompra[indice]) 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(NumeroDeBarras);
          else indice=TotalBarras-int(NumeroDeBarras)-1;
          double Preguntar=Cierre[indice];
          double Pedir=Cierre[indice];
          PruebaSerie=ArrayGetAsSeries(Spread);
          if(PruebaSerie) indice=int(NumeroDeBarras);
          else indice=TotalBarras-int(NumeroDeBarras)-1;
          Pedir+=Spread[indice]*_Point;
          string sPedir=DoubleToString(Pedir,_Digits);
          string sPedir=DoubleToString(Pedir,_Digits);
          string sPeriodo=GetStringTimeframe(ChartPeriod());
          if(SonidoActivado) Alert("Señal de COMPRA 
     Pedir=",Pedir,"
     Bid=",Pedir,"
     tiempo actual=",texto,"
     Símbolo=",Symbol()," Period=",sPeriodo);
          if(CorreoActivado) SendMail(NombreSeñal+": Alerta de señal de COMPRA","Señal de COMPRA en Pedir="+sPedir+", Bid="+sPedir+", Fecha="+texto+" Símbolo="+Symbol()+" Period="+sPeriodo);
          if(NotificacionPushActivada) SendNotification(NombreSeñal+": Señal de COMPRA en Pedir="+sPedir+", Bid="+sPedir+", Fecha="+texto+" Símbolo="+Symbol()+" Period="+sPeriodo);
         }
    //---
      }
    //+------------------------------------------------------------------+
    //| 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 TotalBarras,     // número actual de barras
                    const int Prev_calculated, // número de barras en el tick anterior
                    const double &Cierre[],     // precio de cierre
                    const int &Spread[])       // spread
      {
    //---
       static uint contador=0;
       if(TotalBarras!=Prev_calculated) contador=0;
    
       bool SeñalVenta=false;
       bool PruebaSerie=ArrayGetAsSeries(FlechaVenta);
       int indice,indice1;
       if(PruebaSerie)
        {
         indice=int(NumeroDeBarras);
         indice1=indice+1;
        }
       else
         {
          indice=TotalBarras-int(NumeroDeBarras)-1;
          indice1=indice-1;
         }
       if(!FlechaVenta[indice1] && FlechaVenta[indice]) 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(NumeroDeBarras);
          else indice=TotalBarras-int(NumeroDeBarras)-1;
          double Pedir=Cierre[indice];
          double Bid=Cierre[indice];
          PruebaSerie=ArrayGetAsSeries(Spread);
          if(PruebaSerie) indice=int(NumeroDeBarras);
          else indice=TotalBarras-int(NumeroDeBarras)-1;
          Bid+=Spread[indice]*_Point;
          string sPedir=DoubleToString(Pedir,_Digits);
          string sBid=DoubleToString(Bid,_Digits);
          string sPeriodo=GetStringTimeframe(ChartPeriod());
          if(SonidoActivado) Alert("Señal de VENTA 
     Pedir=",Pedir,"
     Bid=",Bid,"
     tiempo actual=",texto,"
     Símbolo=",Symbol()," Period=",sPeriodo);
          if(CorreoActivado) SendMail(NombreSeñal+": Alerta de señal de VENTA","Señal de VENTA en Pedir="+sPedir+", Bid="+sBid+", Fecha="+texto+" Símbolo="+Symbol()+" Period="+sPeriodo);
          if(NotificacionPushActivada) SendNotification(NombreSeñal+": Señal de VENTA en Pedir="+sPedir+", Bid="+sBid+", Fecha="+texto+" Símbolo="+Symbol()+" Period="+sPeriodo);
         }
    //---
      }
    //+------------------------------------------------------------------+
    //|  Obtención del timeframe como 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("RJTX_Matches_Smoothed_Alert",FlechaCompra,total_barras,prev_calculated,cierre,spread);
       SellSignal("RJTX_Matches_Smoothed_Alert",FlechaVenta,total_barras,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. Se deben agregar ceros o EMPTY_VALUE a los buffers del indicador como valores vacíos.

Se asume que solo se utilizará una llamada a cada una de las funciones BuySignal() y SellSignal() en el código del indicador en el bloque OnCalculate().

El indicador utiliza las clases de la biblioteca SmoothAlgorithms.mqh (que deben copiarse en la carpeta <directorio_de_datos_del_terminal>\MQL5\Include). El uso de estas clases se describió a fondo en el artículo Promediando Series de Precios para Cálculos Intermedios sin Usar Buffers Adicionales.

Este indicador se implementó por primera vez en MQL4 y se publicó en la Base de Código el 23 de diciembre de 2015.


Fig.1. Indicador RJTX_Matches_Smoothed_Alert en el gráfico

Fig.1. Indicador RJTX_Matches_Smoothed_Alert en el gráfico


Fig. 2. Indicador RJTX_Matches_Smoothed_Alert. Alertando

Fig. 2. Indicador RJTX_Matches_Smoothed_Alert. Alertando

Lista
Comentarios 0