Inicio Indicador técnico Publicación

Alerta del Histograma Balance de Poder: Un Indicador para MetaTrader 5

Archivos adjuntos
16403.zip (22.71 KB, Descargar 0 veces)

Autor original: RoboFx

El indicador Balance de Poder (BOP) presenta un histograma de colores que muestra la fuerza y dirección de la tendencia actual, incluyendo alertas que se envían por correo electrónico y notificaciones push a dispositivos móviles. Este histograma cambia de color según los niveles de sobrecompra y sobreventa que establezcas y la dirección del movimiento del histograma.

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

  1. Se introdujeron nuevos parámetros de entrada:
    //---- Variables de entrada para alertas 
    input uint NumeroDeBarras=1;                    //Número de barras 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ñal por correo
    input bool PushActivado=false;                     //Habilitar envío de señal 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 &ColorArray[],// buffer de índice de color
                   int ColorIndice,// índice de color en el buffer de índice de color para generar una señal
                   const int TotalBarras,     // número actual de barras
                   const int Prev_calculado, // 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_calculado) contador=0;
    
       bool SeñalCompra=false;
       bool PruebaSerie=ArrayGetAsSeries(ColorArray);
       int indice,indice1;
       if(PruebaSerie)
         {
          indice=int(NumeroDeBarras);
          indice1=indice+1;
         }
       else
         {
          indice=TotalBarras-int(NumeroDeBarras)-1;
          indice1=indice-1;
         }
       if(ColorArray[indice1]!=ColorIndice && ColorArray[indice]==ColorIndice) 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 Ask=Cierre[indice];
          double Bid=Cierre[indice];
          PruebaSerie=ArrayGetAsSeries(Spread);
          if(PruebaSerie) indice=int(NumeroDeBarras);
          else indice=TotalBarras-int(NumeroDeBarras)-1;
          Bid+=Spread[indice];
          string sAsk=DoubleToString(Ask,_Digits);
          string sBid=DoubleToString(Bid,_Digits);
          string sPeriodo=GetStringTimeframe(ChartPeriod());
          if(SonidoActivado) Alert("Señal de COMPRA 
     Ask=",Ask,"
     Bid=",Bid,"
     tiempo actual=",texto,"
     Símbolo=",Symbol()," Periodo=",sPeriodo);
          if(CorreoActivado) 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(PushActivado) 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 correos y mensajes push
                    double &ColorArray[],       // buffer de índice de color
                    int ColorIndice,             // índice de color en el buffer de índice de color para generar una señal
                    const int TotalBarras,     // número actual de barras
                    const int Prev_calculado, // 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_calculado) contador=0;
    
       bool SeñalVenta=false;
       bool PruebaSerie=ArrayGetAsSeries(ColorArray);
       int indice,indice1;
       if(PruebaSerie)
         {
          indice=int(NumeroDeBarras);
          indice1=indice+1;
         }
       else
         {
          indice=TotalBarras-int(NumeroDeBarras)-1;
          indice1=indice-1;
         }
       if(ColorArray[indice1]!=ColorIndice && ColorArray[indice]==ColorIndice) 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 Ask=Cierre[indice];
          double Bid=Cierre[indice];
          PruebaSerie=ArrayGetAsSeries(Spread);
          if(PruebaSerie) indice=int(NumeroDeBarras);
          else indice=TotalBarras-int(NumeroDeBarras)-1;
          Bid+=Spread[indice];
          string sAsk=DoubleToString(Ask,_Digits);
          string sBid=DoubleToString(Bid,_Digits);
          string sPeriodo=GetStringTimeframe(ChartPeriod());
          if(SonidoActivado) Alert("Señal de VENTA 
     Ask=",Ask,"
     Bid=",Bid,"
     tiempo actual=",texto,"
     Símbolo=",Symbol()," Periodo=",sPeriodo);
          if(CorreoActivado) 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(PushActivado) 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 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("BalanceOfPower_Histogram_Alert",ColorIndBuffer,0,TotalBarras,Prev_calculado,Cierre,Spread);
       SellSignal("BalanceOfPower_Histogram_Alert",ColorIndBuffer,7,TotalBarras,Prev_calculado,Cierre,Spread);
    //---
    

Donde ColorIndBuffer es el nombre del buffer de índice de color que almacena el color de las velas en forma de un índice.

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

El indicador utiliza las clases de la biblioteca SmoothAlgorithms.mqh (cópiala en <carpeta_de_datos_terminal>\MQL5\Include). El uso de las clases se describió a fondo en el artículo "Promediando Series de Precios para Cálculos Intermedios Sin Usar Buffers Adicionales".

Originalmente, este indicador fue escrito en MQL5 y fue publicado por primera vez en la Base de Código el 07.02.2013.

Fig1. El indicador Balance de Poder_Histogram_Alert en el gráfico

Fig1. El indicador Balance de Poder_Histogram_Alert en el gráfico

Fig.2. El indicador Balance de Poder_Histogram_Alert Generando alertas.

Fig.2. El indicador Balance de Poder_Histogram_Alert Generando alertas.

Publicaciones relacionadas

Comentarios (0)