Indicadores: ATRStops_v1.1_Alert

 

ATRStops_v1.1_Alert:

Indicador de tendencia, ejecutado en forma de NRTR con posibilidad de suministrar alertas, enviar correos electrónicos y mensajes Push.

Fig.1 Indicador ATRStops_v1.1_Alert

Autor: Nikolay Kositsin

 
Ayuda, por alguna razón el terminal no dibuja la línea roja superior, sólo la línea azul inferior.
 
Альберт Туйкин:
Ayuda, por alguna razón en el terminal no dibuja la línea roja superior, sólo la azul inferior.
¡He comprobado todo de nuevo, el indicador funciona con absoluta normalidad!
 
Nikolay Kositsin:
¡He comprobado todo de nuevo, el indicador funciona absolutamente bien!

En la mayoría de los gráficos funciona perfectamente. Pero en dos gráficos no dibuja la línea roja :(
 
Альберт Туйкин:

Funciona bien en la mayoría de los gráficos. Pero en dos gráficos no dibuja la línea roja :(
Cuando una persona tiene un problema, depende totalmente de ella cómo comunicar ese problema a los que la rodean de forma que éstos puedan verlo.
 

Pido disculpas, he añadido una captura de pantalla.

Por ejemplo, en el gráfico de índices RTS todo funciona, pero en el gráfico de futuros RTS sólo hay una línea azul.

Archivos adjuntos:
k3nkgna35.JPG  195 kb
 
Альберт Туйкин:

Pido disculpas, he añadido una captura de pantalla.

Por ejemplo, todo funciona en el gráfico de índices RTS, pero en el gráfico de futuros RTS sólo hay una línea azul.

Está claro que el autor del código ha establecido los tamaños de fondo y techo globales demasiado pequeños en el código fuente. El código se modificará en breve.
//+------------------------------------------------------------------+
//|ATRStops_v1.1_Alert.mq5 ||
//|Copyright © 2006, Forex-TSD.com
//| Escrito por IgorAD,igorad2003@yahoo.co.uk | 
//| http://finance.groups.yahoo.com/group/TrendLaboratory | 
//+------------------------------------------------------------------+
//---- autoría del indicador
#property copyright "Copyright © 2006, Forex-TSD.com "
//---- enlace a la página web del autor
#property link      "http://www.forex-tsd.com/"
//---- número de versión del indicador
#property version   "1.10"
//---- dibujar indicador en la ventana principal
#property indicator_chart_window
//---- Se utilizan 4 buffers para el cálculo y el dibujo del indicador
#property indicator_buffers 4
//---- utilizó 4 construcciones gráficas
#property indicator_plots   4
//+----------------------------------------------+
//|| Parámetros de dibujo del indicador alcista
//+----------------------------------------------+
//---- dibujo del indicador 1 como una línea
#property  indicator_type1   DRAW_LINE
//---- el color azul se utiliza como color de la línea indicadora
#property  indicator_color1  clrBlue
//---- indicador línea 1 - sólido
#property  indicator_style1  STYLE_SOLID
//---- indicador 1 grosor de línea es 2
#property  indicator_width1  2
//---- indicador de pantalla marcador de línea
#property  indicator_label1  "Upper ATRStops_v1.1"
//+----------------------------------------------+
//|| Parámetros de representación del indicador bajista
//+----------------------------------------------+
//---- dibujo del indicador 2 como una línea
#property  indicator_type2   DRAW_LINE
//---- El color IndianRed se utiliza como color de la línea indicadora
#property  indicator_color2  clrIndianRed
//---- indicador línea 2 - sólido
#property  indicator_style2  STYLE_SOLID
//---- indicador 2 grosor de línea es 2
#property  indicator_width2  2
//---- indicador de pantalla marcador de línea
#property  indicator_label2  "Lower ATRStops_v1.1"
//+----------------------------------------------+
//|| Parámetros de dibujo del indicador alcista
//+----------------------------------------------+
//---- dibujo del indicador 3 como icono
#property  indicator_type3   DRAW_ARROW
//---- color Se utiliza el azul como color indicador
#property  indicator_color3  clrBlue
//---- espesor del indicador 3 es 4
#property  indicator_width3  4
//---- etiqueta indicadora de la pantalla
#property  indicator_label3  "Buy ATRStops_v1.1"
//+----------------------------------------------+
//|| Parámetros de representación del indicador bajista
//+----------------------------------------------+
//---- dibujo del indicador 4 como icono
#property  indicator_type4   DRAW_ARROW
//---- el color Rojo se utiliza como color indicador
#property  indicator_color4  clrRed
//---- espesor del indicador 4 es 4
#property  indicator_width4  4
//---- etiqueta indicadora de la pantalla
#property  indicator_label4  "Sell ATRStops_v1.1"
//+----------------------------------------------+
//|| Parámetros de entrada del indicador
//+----------------------------------------------+
input uint   Length=10;           // Período del indicador
input uint   ATRPeriod=5;         // Período del indicador ATR
input double Kv=2.5;              // Volatilidad ATR
input int    Shift=0;             // Desplazamiento horizontal del indicador en barras
input uint NumberofBar=1;         // Número de barra para señalización
input bool SoundON=true;          // Resolución de alerta
input uint NumberofAlerts=2;      // Número de descripciones
input bool EMailON=false;         // Habilitar el envío de la señal
input bool PushON=false;          // Activar el envío de una señal al teléfono móvil
//+----------------------------------------------+
//---- declaración de matrices dinámicas, que se
//---- se utilizará como búfer indicador
double ExtMapBufferUp[];
double ExtMapBufferDown[];
double ExtMapBufferUp1[];
double ExtMapBufferDown1[];
//---- declaración de variables enteras para los indicadores
int ATR_Handle;
//---- declaración de variables de inicio de datos enteros
int min_rates_total;
//+------------------------------------------------------------------+
//| Función de inicialización del indicador personalizada |
//+------------------------------------------------------------------+ 
int OnInit()
  {
//---- obtener el indicador ATR
   ATR_Handle=iATR(NULL,0,ATRPeriod);
   if(ATR_Handle==INVALID_HANDLE)
     {
      Print("No se pudo obtener el indicador ATR");
      return(1);
     }

//---- inicialización de variables de inicio de datos
   min_rates_total=int(ATRPeriod+Length);

//---- convirtiendo el array dinámico ExtMapBufferUp[] en buffer indicador
   SetIndexBuffer(0,ExtMapBufferUp,INDICATOR_DATA);
//---- desplazamiento horizontal del indicador 1 mediante Shift
   PlotIndexSetInteger(0,PLOT_SHIFT,Shift);
//---- desplaza el inicio de la cuenta atrás del dibujo del indicador 1
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);
//---- indexación de elementos en buffers, como en timeseries 
   ArraySetAsSeries(ExtMapBufferUp,true);
//---- configuración de los valores de los indicadores que no serán visibles en el gráfico
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);

//---- convertir matriz dinámica ExtMapBufferDown[] en buffer indicador
   SetIndexBuffer(1,ExtMapBufferDown,INDICATOR_DATA);
//---- desplazamiento horizontal del indicador 2 mediante Shift
   PlotIndexSetInteger(1,PLOT_SHIFT,Shift);
//---- desplaza el inicio de la cuenta atrás de dibujo del indicador 2
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total);
//---- indexación de elementos en buffers, como en timeseries 
   ArraySetAsSeries(ExtMapBufferDown,true);
//---- configuración de los valores de los indicadores que no serán visibles en el gráfico
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);

//---- convirtiendo el array dinámico ExtMapBufferUp1[] en buffer indicador
   SetIndexBuffer(2,ExtMapBufferUp1,INDICATOR_DATA);
//---- desplazamiento horizontal del indicador 1 mediante Shift
   PlotIndexSetInteger(2,PLOT_SHIFT,Shift);
//---- desplazamiento del inicio del dibujo del indicador 3
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,min_rates_total);
//---- indexación de elementos en buffers, como en timeseries 
   ArraySetAsSeries(ExtMapBufferUp1,true);
//---- configuración de los valores de los indicadores que no serán visibles en el gráfico
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- carácter para el indicador
   PlotIndexSetInteger(2,PLOT_ARROW,175);

//---- convertir matriz dinámica ExtMapBufferDown1[] en buffer indicador
   SetIndexBuffer(3,ExtMapBufferDown1,INDICATOR_DATA);
//---- desplazamiento horizontal del indicador 2 mediante Shift
   PlotIndexSetInteger(3,PLOT_SHIFT,Shift);
//---- desplazamiento del inicio del dibujo del indicador 4
   PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,min_rates_total);
//---- indexación de elementos en buffers, como en timeseries 
   ArraySetAsSeries(ExtMapBufferDown1,true);
//---- configuración de los valores de los indicadores que no serán visibles en el gráfico
   PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- carácter para el indicador
   PlotIndexSetInteger(3,PLOT_ARROW,175);

//---- inicialización de la variable para el nombre corto del indicador
   string shortname;
   StringConcatenate(shortname,"ATRStops_v1.1(",Length,", ",ATRPeriod,", ",DoubleToString(Kv,4),", ",Shift,")");
//--- creación de un nombre que se mostrará en una subventana separada y en un tooltip
   IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//--- determinar la precisión de la visualización de los valores de los indicadores
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Función de iteración del indicador personalizada |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,    // cantidad de historia en barras en el tick actual
                const int prev_calculated,// cantidad de historia en barras en el tick anterior
                const datetime &time[],
                const double &open[],
                const double& high[],     // matriz de precios máximos para el cálculo del indicador
                const double& low[],      // matriz de precios mínimos para el cálculo del indicador
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---- comprobar si el número de barras es suficiente para el cálculo
   if(BarsCalculated(ATR_Handle)<rates_total || rates_total<min_rates_total) return(0);

//---- declaraciones de variables locales 
   double ATR[];
   double smin0,smax0;
   int limit,to_copy,bar,trend0;
   static double smin1,smax1;
   static int trend1;

//---- indexación de elementos en matrices, como en las series temporales 
   ArraySetAsSeries(close,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
   ArraySetAsSeries(ATR,true);

//---- cálculo del número límite de inicio del ciclo de recálculo de compases
   if(prev_calculated>rates_total || prev_calculated<=0) // comprobar el primer inicio del cálculo del indicador
     {
      limit=rates_total-min_rates_total-1;               // número inicial para el cálculo de todas las barras
      trend1=0;
      smin1=-999999;
      smax1=+999999;
     }
   else
     {
      limit=rates_total-prev_calculated;                 // número de inicio para calcular nuevos compases
     }

   to_copy=int(limit+Length);
//---- copiar los datos recién aparecidos en matrices
   if(CopyBuffer(ATR_Handle,0,0,to_copy,ATR)<=0) return(0);

//---- ciclo de cálculo del indicador principal
   for(bar=limit; bar>=0; bar--)
     {      
      ExtMapBufferUp[bar]=EMPTY_VALUE;
      ExtMapBufferDown[bar]=EMPTY_VALUE;
      ExtMapBufferUp1[bar]=EMPTY_VALUE;
      ExtMapBufferDown1[bar]=EMPTY_VALUE;
      
      smin0=-999999;
      smax0=+999999;
      
      for(int iii=0; iii<int(Length); iii++)
        {
         int barx=bar+iii;
         smin0=MathMax(smin0,high[barx]-Kv*ATR[barx]);
         smax0=MathMin(smax0,low[barx]+Kv*ATR[barx]);
        }
        
      trend0=trend1;
      if(close[bar]>smax1) trend0=+1;
      if(close[bar]<smin1) trend0=-1;

      if(trend0>0)
        {
         if(smin0<smin1) smin0=smin1;
         ExtMapBufferUp[bar]=smin0;
        }
        
      if(trend0<0)
        {
         if(smax0>smax1) smax0=smax1;
         ExtMapBufferDown[bar]=smax0;
        }

      if(ExtMapBufferUp[bar+1]==EMPTY_VALUE && ExtMapBufferUp[bar]!=EMPTY_VALUE) ExtMapBufferUp1[bar]=ExtMapBufferUp[bar];
      if(ExtMapBufferDown[bar+1]==EMPTY_VALUE && ExtMapBufferDown[bar]!=EMPTY_VALUE) ExtMapBufferDown1[bar]=ExtMapBufferDown[bar];

      if(bar>0)
        {
         smin1=smin0;
         smax1=smax0;
         trend1=trend0;
        }
     }
//--- 
   BuySignal("ATRStops_v1.1_Alert",ExtMapBufferUp1,rates_total,prev_calculated,close,spread);
   SellSignal("ATRStops_v1.1_Alert",ExtMapBufferDown1,rates_total,prev_calculated,close,spread);
//--- 
   return(rates_total);
  }
//+------------------------------------------------------------------+
//| Función de señal de compra|
//+------------------------------------------------------------------+
void BuySignal(string SignalSirname,      // texto del nombre del indicador para las señales de correo y push
               double &BuyArrow[],        // tampón indicador con señales de compra
               const int Rates_total,     // número actual de barras
               const int Prev_calculated, // número de barras en el tick anterior
               const double &Close[],     // precio de cierre
               const int &Spread[])       // propagación
  {
//---
   static uint counter=0;
   if(Rates_total!=Prev_calculated) counter=0;

   bool BuySignal=false;
   bool SeriesTest=ArrayGetAsSeries(BuyArrow);
   int index;
   if(SeriesTest) index=int(NumberofBar);
   else index=Rates_total-int(NumberofBar)-1;
   if(NormalizeDouble(BuyArrow[index],_Digits) && BuyArrow[index]!=EMPTY_VALUE) BuySignal=true;
   if(BuySignal && counter<=NumberofAlerts)
     {
      counter++;
      MqlDateTime tm;
      TimeToStruct(TimeCurrent(),tm);
      string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
      SeriesTest=ArrayGetAsSeries(Close);
      if(SeriesTest) index=int(NumberofBar);
      else index=Rates_total-int(NumberofBar)-1;
      double Ask=Close[index];
      double Bid=Close[index];
      SeriesTest=ArrayGetAsSeries(Spread);
      if(SeriesTest) index=int(NumberofBar);
      else index=Rates_total-int(NumberofBar)-1;
      Bid+=Spread[index]*_Point;
      string sAsk=DoubleToString(Ask,_Digits);
      string sBid=DoubleToString(Bid,_Digits);
      string sPeriod=GetStringTimeframe(ChartPeriod());
      if(SoundON) Alert("BUY signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);
      if(EMailON) SendMail(SignalSirname+": BUY signal alert","BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
      if(PushON) SendNotification(SignalSirname+": BUY signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
     }

//---
  }
//+------------------------------------------------------------------+
//| Función de señal de venta|
//+------------------------------------------------------------------+
void SellSignal(string SignalSirname,      // texto del nombre del indicador para las señales de correo y push
                double &SellArrow[],       // tampón indicador con señales de compra
                const int Rates_total,     // número actual de barras
                const int Prev_calculated, // número de barras en el tick anterior
                const double &Close[],     // precio de cierre
                const int &Spread[])       // propagación
  {
//---
   static uint counter=0;
   if(Rates_total!=Prev_calculated) counter=0;

   bool SellSignal=false;
   bool SeriesTest=ArrayGetAsSeries(SellArrow);
   int index;
   if(SeriesTest) index=int(NumberofBar);
   else index=Rates_total-int(NumberofBar)-1;
   if(NormalizeDouble(SellArrow[index],_Digits) && SellArrow[index]!=EMPTY_VALUE) SellSignal=true;
   if(SellSignal && counter<=NumberofAlerts)
     {
      counter++;
      MqlDateTime tm;
      TimeToStruct(TimeCurrent(),tm);
      string text=TimeToString(TimeCurrent(),TIME_DATE)+" "+string(tm.hour)+":"+string(tm.min);
      SeriesTest=ArrayGetAsSeries(Close);
      if(SeriesTest) index=int(NumberofBar);
      else index=Rates_total-int(NumberofBar)-1;
      double Ask=Close[index];
      double Bid=Close[index];
      SeriesTest=ArrayGetAsSeries(Spread);
      if(SeriesTest) index=int(NumberofBar);
      else index=Rates_total-int(NumberofBar)-1;
      Bid+=Spread[index]*_Point;
      string sAsk=DoubleToString(Ask,_Digits);
      string sBid=DoubleToString(Bid,_Digits);
      string sPeriod=GetStringTimeframe(ChartPeriod());
      if(SoundON) Alert("SELL signal \n Ask=",Ask,"\n Bid=",Bid,"\n currtime=",text,"\n Symbol=",Symbol()," Period=",sPeriod);
      if(EMailON) SendMail(SignalSirname+": SELL signal alert","SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
      if(PushON) SendNotification(SignalSirname+": SELL signal at Ask="+sAsk+", Bid="+sBid+", Date="+text+" Symbol="+Symbol()+" Period="+sPeriod);
     }
//---
  }
//+------------------------------------------------------------------+
//| Obtener el marco temporal como una cadena|
//+------------------------------------------------------------------+
string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
  {
//----
   return(StringSubstr(EnumToString(timeframe),7,-1));
//----
  }
//+------------------------------------------------------------------+
 
¡Gracias, funcionó!
 

Hola,

¿Puede agregar el idioma Inglés en las propiedades, para que podamos entenderlo.

Gracias

 
gkb #: Hola, ¿Puede agregar el idioma Inglés en las propiedades, por lo que podemos entender it.Thanks

La publicación original fue en el CodeBase ruso en 2017. MetaQuotes es el que hizo una traducción de la publicación.

Traducido del ruso por MetaQuotes Ltd.
Código original: https:
//www.mql5.com/ru/code/17881

Así que dudo que el autor original lo haga. Podrías usar Google translate y cambiar los comentarios del código al inglés tú mismo.