Indicadores: ATRStops_v1.1_Alert

 

ATRStops_v1.1_Alert:

Indicador de tendência executado como NRTR com possibilidade de enviar alertas e mensagens via Push.

Fig.1 Indicador ATRStops_v1.1_Alert

Autor: Nikolay Kositsin

 
Ajuda: por algum motivo, o terminal não desenha a linha vermelha superior, apenas a linha azul inferior.
 
Альберт Туйкин:
Por algum motivo, o terminal não desenha a linha vermelha superior, apenas a azul inferior.
Verifiquei tudo novamente e o indicador funciona normalmente!
 
Nikolay Kositsin:
Verifiquei tudo novamente e o indicador funciona muito bem!

Na maioria dos gráficos, funciona perfeitamente. Mas em dois gráficos ele não desenha a linha vermelha :(
 
Альберт Туйкин:

Ele funciona bem na maioria dos gráficos. Mas em dois gráficos ele não desenha a linha vermelha :(
Quando uma pessoa tem um problema, cabe inteiramente a ela comunicar esse problema às pessoas ao seu redor de uma forma que elas possam ver.
 

Peço desculpas, adicionei uma captura de tela.

Por exemplo, no gráfico de índice RTS, tudo funciona, mas no gráfico de futuros RTS, há apenas uma linha azul.

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

Peço desculpas, adicionei uma captura de tela.

Por exemplo, tudo funciona no gráfico de índice RTS, mas no gráfico de futuros RTS há apenas uma linha azul.

Está claro que o autor do código definiu os tamanhos do fundo global e do teto muito pequenos no código-fonte. O código será alterado em breve.
//+------------------------------------------------------------------+
//|ATRStops_v1.1_Alert.mq5
//|Direitos autorais © 2006, Forex-TSD.com
//| Escrito por IgorAD,igorad2003@yahoo.co.uk | 
//| http://finance.groups.yahoo.com/group/TrendLaboratory 
//+------------------------------------------------------------------+
//---- indicator authorship
#property copyright "Direitos autorais © 2006, Forex-TSD.com "
//---- link para o site do autor
#property link      "http://www.forex-tsd.com/"
//---- número da versão do indicador
#property version   "1.10"
//---- desenhar indicador na janela principal
#property indicator_chart_window
//---- 4 buffers são usados para cálculo e desenho do indicador
#property indicator_buffers 4
//---- usou 4 construções gráficas
#property indicator_plots   4
//+----------------------------------------------+
//|| Parâmetros de desenho do indicador de alta
//+----------------------------------------------+
//---- desenho do indicador 1 como uma linha
#property  indicator_type1   DRAW_LINE
//---- cor azul é usada como cor da linha indicadora
#property  indicator_color1  clrBlue
//---- linha do indicador 1 - sólida
#property  indicator_style1  STYLE_SOLID
//---- indicador 1 espessura da linha é 2
#property  indicator_width1  2
//---- indicador de exibição marcador de linha
#property  indicator_label1  "Upper ATRStops_v1.1"
//+----------------------------------------------+
//|| Parâmetros de renderização do indicador de baixa
//+----------------------------------------------+
//---- desenho do indicador 2 como uma linha
#property  indicator_type2   DRAW_LINE
//---- A cor IndianRed é usada como cor da linha indicadora
#property  indicator_color2  clrIndianRed
//---- linha do indicador 2 - sólida
#property  indicator_style2  STYLE_SOLID
//---- indicador 2 espessura da linha é 2
#property  indicator_width2  2
//---- indicador de exibição marcador de linha
#property  indicator_label2  "Lower ATRStops_v1.1"
//+----------------------------------------------+
//|| Parâmetros de desenho do indicador de alta
//+----------------------------------------------+
//---- desenho do indicador 3 como um ícone
#property  indicator_type3   DRAW_ARROW
//---- cor O azul é usado como cor indicadora
#property  indicator_color3  clrBlue
//---- espessura do indicador 3 é 4
#property  indicator_width3  4
//---- etiqueta do indicador do visor
#property  indicator_label3  "Buy ATRStops_v1.1"
//+----------------------------------------------+
//|| Parâmetros de renderização do indicador de baixa
//+----------------------------------------------+
//---- desenho do indicador 4 como um ícone
#property  indicator_type4   DRAW_ARROW
//---- a cor vermelha é usada como cor indicadora
#property  indicator_color4  clrRed
//---- espessura do indicador 4 é 4
#property  indicator_width4  4
//---- etiqueta do indicador do visor
#property  indicator_label4  "Sell ATRStops_v1.1"
//+----------------------------------------------+
//|| Parâmetros de entrada do indicador
//+----------------------------------------------+
input uint   Length=10;           // Período do código
input uint   ATRPeriod=5;         // Período do indicador ATR
input double Kv=2.5;              // Volatilidade ATR
input int    Shift=0;             // Deslocamento do indicador horizontalmente em barras
input uint NumberofBar=1;         // Número da barra para sinalização
input bool SoundON=true;          // Resolução de alerta
input uint NumberofAlerts=2;      // Número de alertas
input bool EMailON=false;         // Ativar o envio do sinal
input bool PushON=false;          // Permitir o envio de um sinal para o telefone celular
//+----------------------------------------------+
//---- declaração de vetores dinâmicos, que são mais
//---- será usado como buffer de indicador
double ExtMapBufferUp[];
double ExtMapBufferDown[];
double ExtMapBufferUp1[];
double ExtMapBufferDown1[];
//---- declaração de variáveis inteiras para alças de indicador
int ATR_Handle;
//---- declaração de variáveis de início de dados inteiros
int min_rates_total;
//+------------------------------------------------------------------+
//| Função de inicialização do indicador personalizado
//+------------------------------------------------------------------+ 
int OnInit()
  {
//---- obter o identificador do indicador ATR
   ATR_Handle=iATR(NULL,0,ATRPeriod);
   if(ATR_Handle==INVALID_HANDLE)
     {
      Print("Falha ao obter a alça do indicador ATR");
      return(1);
     }

//---- inicialização das variáveis de início de dados
   min_rates_total=int(ATRPeriod+Length);

//---- transformando a matriz dinâmica ExtMapBufferUp[] em um buffer indicador
   SetIndexBuffer(0,ExtMapBufferUp,INDICATOR_DATA);
//---- indicador de deslocamento 1 horizontalmente por Shift
   PlotIndexSetInteger(0,PLOT_SHIFT,Shift);
//---- deslocando o início da contagem regressiva do desenho do indicador 1
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,min_rates_total);
//---- indexação de itens em buffers, como em séries temporais 
   ArraySetAsSeries(ExtMapBufferUp,true);
//---- definição de valores de indicadores que não serão visíveis no gráfico
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,EMPTY_VALUE);

//---- transformando a matriz dinâmica ExtMapBufferDown[] em um buffer indicador
   SetIndexBuffer(1,ExtMapBufferDown,INDICATOR_DATA);
//---- indicador de deslocamento 2 horizontalmente por Shift
   PlotIndexSetInteger(1,PLOT_SHIFT,Shift);
//---- deslocando o início da contagem regressiva do desenho do indicador 2
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,min_rates_total);
//---- indexação de itens em buffers, como em séries temporais 
   ArraySetAsSeries(ExtMapBufferDown,true);
//---- definição de valores de indicadores que não serão visíveis no gráfico
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,EMPTY_VALUE);

//---- transformando a matriz dinâmica ExtMapBufferUp1[] em um buffer indicador
   SetIndexBuffer(2,ExtMapBufferUp1,INDICATOR_DATA);
//---- indicador de deslocamento 1 horizontalmente por Shift
   PlotIndexSetInteger(2,PLOT_SHIFT,Shift);
//---- deslocamento do início do desenho do indicador 3
   PlotIndexSetInteger(2,PLOT_DRAW_BEGIN,min_rates_total);
//---- indexação de itens em buffers, como em séries temporais 
   ArraySetAsSeries(ExtMapBufferUp1,true);
//---- definição de valores de indicadores que não serão visíveis no gráfico
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- caractere para indicador
   PlotIndexSetInteger(2,PLOT_ARROW,175);

//---- transformando a matriz dinâmica ExtMapBufferDown1[] em um buffer indicador
   SetIndexBuffer(3,ExtMapBufferDown1,INDICATOR_DATA);
//---- indicador de deslocamento 2 horizontalmente por Shift
   PlotIndexSetInteger(3,PLOT_SHIFT,Shift);
//---- deslocamento do início do desenho do indicador 4
   PlotIndexSetInteger(3,PLOT_DRAW_BEGIN,min_rates_total);
//---- indexação de itens em buffers, como em séries temporais 
   ArraySetAsSeries(ExtMapBufferDown1,true);
//---- definição de valores de indicadores que não serão visíveis no gráfico
   PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,EMPTY_VALUE);
//---- caractere para indicador
   PlotIndexSetInteger(3,PLOT_ARROW,175);

//---- inicialização da variável para o nome curto do indicador
   string shortname;
   StringConcatenate(shortname,"ATRStops_v1.1(",Length,", ",ATRPeriod,", ",DoubleToString(Kv,4),", ",Shift,")");
//--- criação de um nome a ser exibido em uma subjanela e dica de ferramenta separadas
   IndicatorSetString(INDICATOR_SHORTNAME,shortname);
//--- determinar a precisão da exibição dos valores do indicador
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Função de iteração de indicador personalizado
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,    // a quantidade de histórico em barras no tique atual
                const int prev_calculated,// quantidade de histórico em barras no tique anterior
                const datetime &time[],
                const double &open[],
                const double& high[],     // array de preços máximos para o cálculo do indicador
                const double& low[],      // matriz de preços mínimos para o cálculo do indicador
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---- verificar se o número de barras é suficiente para o cálculo
   if(BarsCalculated(ATR_Handle)<rates_total || rates_total<min_rates_total) return(0);

//---- declarações de variáveis locais 
   double ATR[];
   double smin0,smax0;
   int limit,to_copy,bar,trend0;
   static double smin1,smax1;
   static int trend1;

//---- indexação de elementos em matrizes, como em séries temporais 
   ArraySetAsSeries(close,true);
   ArraySetAsSeries(high,true);
   ArraySetAsSeries(low,true);
   ArraySetAsSeries(ATR,true);

//---- calculando o número do limite inicial para o ciclo de recálculo da barra
   if(prev_calculated>rates_total || prev_calculated<=0) // verificar o primeiro início do cálculo do indicador
     {
      limit=rates_total-min_rates_total-1;               // número inicial para o cálculo de todas as barras
      trend1=0;
      smin1=-999999;
      smax1=+999999;
     }
   else
     {
      limit=rates_total-prev_calculated;                 // número inicial para o cálculo de novas barras
     }

   to_copy=int(limit+Length);
//---- copiar os dados recém-aparecidos para as matrizes
   if(CopyBuffer(ATR_Handle,0,0,to_copy,ATR)<=0) return(0);

//---- ciclo de cálculo do 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);
  }
//+------------------------------------------------------------------+
//| Função de sinal de compra|
//+------------------------------------------------------------------+
void BuySignal(string SignalSirname,      // texto do nome do indicador para sinais de correio eletrônico e push
               double &BuyArrow[],        // buffer do indicador com sinais de compra
               const int Rates_total,     // número atual de barras
               const int Prev_calculated, // número de barras no tique anterior
               const double &Close[],     // preço de fechamento
               const int &Spread[])       // propagação
  {
//---
   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);
     }

//---
  }
//+------------------------------------------------------------------+
//| Função de sinal de venda|
//+------------------------------------------------------------------+
void SellSignal(string SignalSirname,      // texto do nome do indicador para sinais de correio eletrônico e push
                double &SellArrow[],       // buffer do indicador com sinais de compra
                const int Rates_total,     // número atual de barras
                const int Prev_calculated, // número de barras no tique anterior
                const double &Close[],     // preço de fechamento
                const int &Spread[])       // propagação
  {
//---
   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);
     }
//---
  }
//+------------------------------------------------------------------+
//| Obter o período de tempo como uma cadeia de caracteres|
//+------------------------------------------------------------------+
string GetStringTimeframe(ENUM_TIMEFRAMES timeframe)
  {
//----
   return(StringSubstr(EnumToString(timeframe),7,-1));
//----
  }
//+------------------------------------------------------------------+
 
Obrigado, funcionou!
 

Hi,

Você pode adicionar o idioma inglês nas propriedades, para que possamos entendê-lo.

Agradecimentos

[Excluído]  
gkb #: Oi, você pode adicionar o idioma inglês nas propriedades, para que possamos entendê-lo. Obrigado

A publicação original foi feita no CodeBase russo em 2017. A MetaQuotes é a única que fez uma tradução da publicação.

Traduzido do russo pela MetaQuotes Ltd.
Código original: https:
//www.mql5.com/ru/code/17881

Portanto, duvido que o autor original faça isso. Você pode usar o Google Tradutor e alterar os comentários do código para o inglês.