Indicadores: ATR Probability Levels

 

ATR Probability Levels:

Níveis probabilísticos baseados em ATR. A "probabilidade" é calculada com base na média projetada do ATR e no preço Close do período anterior.


Autor: Mladen Rakic

 

Ótimo indicador! Criei o mesmo usando buffers. Alguma ideia de como plotar os níveis de suporte e resistência para cada dia, em vez de ter apenas o dia atual?


Esta é a minha versão até o momento. Mas não consigo encontrar uma maneira de obter 10 dias de barras diárias para cada barrade "timeframe atual"...

//+------------------------------------------------------------------+
//|B_ATR_Levels.mq5 |
//+------------------------------------------------------------------+
#property copyright "Skullnick"
#property link      "https://www.mql5.com"
#property version   "1.00"

//--- Configurações de plotagem do indicador
#property indicator_chart_window
#property indicator_buffers 6
#property indicator_plots   6

#property indicator_type1   DRAW_LINE 
#property indicator_color1  clrDeepSkyBlue
#property indicator_width1  1
#property indicator_label1  "Resistance 1"
#property indicator_style1  STYLE_DASH

#property indicator_type2   DRAW_LINE
#property indicator_color2  clrDeepSkyBlue
#property indicator_width2  1
#property indicator_label2  "Resistance 2"
#property indicator_style2  STYLE_DASH

#property indicator_type3   DRAW_LINE
#property indicator_color3  clrDeepSkyBlue
#property indicator_width3  1
#property indicator_label3  "Resistance 3"
#property indicator_style3  STYLE_DASH

#property indicator_type4   DRAW_LINE
#property indicator_color4  clrOrangeRed
#property indicator_width4  1
#property indicator_label4  "Support 1"
#property indicator_style4  STYLE_DASH

#property indicator_type5   DRAW_LINE
#property indicator_color5  clrOrangeRed
#property indicator_width5  1
#property indicator_label5  "Support 2"
#property indicator_style5  STYLE_DASH

#property indicator_type6   DRAW_LINE
#property indicator_color6  clrOrangeRed
#property indicator_width6  1
#property indicator_label6  "Support 3"
#property indicator_style6  STYLE_DASH

//--- Entradas
input int             inpAtrPeriod   = 21;             // Período ATR

//--- Buffers de indicadores
double ExtR1Buffer[];
double ExtR2Buffer[];
double ExtR3Buffer[];
double ExtS1Buffer[];
double ExtS2Buffer[];
double ExtS3Buffer[];

// Pesos para o Average True Range
double dWeights[];

// Variável global
double dATR           = 0;
double dPreviousClose = 0;
  
//+------------------------------------------------------------------+
//| Função de inicialização do indicador personalizado
//+------------------------------------------------------------------+
int OnInit()
  {
//--- mapeamento de buffers de indicadores
   SetIndexBuffer(0,ExtR1Buffer,   INDICATOR_DATA);         // Nível de resistência 1
   SetIndexBuffer(1,ExtR2Buffer,   INDICATOR_DATA);         // Nível de resistência 2
   SetIndexBuffer(2,ExtR3Buffer,   INDICATOR_DATA);         // Nível de resistência 3
   SetIndexBuffer(3,ExtS1Buffer,   INDICATOR_DATA);         // Nível de suporte 1
   SetIndexBuffer(4,ExtS2Buffer,   INDICATOR_DATA);         // Nível de suporte 2
   SetIndexBuffer(5,ExtS3Buffer,   INDICATOR_DATA);         // Nível de suporte 3
   
   ArraySetAsSeries(ExtR1Buffer,    true);
   ArraySetAsSeries(ExtR2Buffer,    true);
   ArraySetAsSeries(ExtR3Buffer,    true);
   ArraySetAsSeries(ExtS1Buffer,    true);
   ArraySetAsSeries(ExtS2Buffer,    true);
   ArraySetAsSeries(ExtS3Buffer,    true);
   
   // Redimensionar pesos
   ArrayResize(dWeights, inpAtrPeriod);
 
   // Definir suavização
   double dSmoothing = 2.0 / (ArraySize(dWeights) + 1);
   
   // Cálculo de pesos
   for(int i = 0; i < ArraySize(dWeights); i++)  
      dWeights[i] = dSmoothing * MathPow(1 - dSmoothing, i);   
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Função de iteração de indicador personalizado|
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
    
   // Obter dados diários e verificar se há dados suficientes
   MqlRates oDailyRates[];
   ArraySetAsSeries(oDailyRates, true);
     
   int iLast = 0;
   
   if(prev_calculated == 0)  
      iLast  = rates_total - 1;  
   else 
      iLast  = rates_total - prev_calculated;
   
   //--- Calcular níveis
   for(int i = iLast; i >= 0 && !IsStopped();i--)
   {
      
      int iNumDaysCopied = CopyRates(_Symbol, PERIOD_D1, 1, inpAtrPeriod + 1, oDailyRates);
      if(iNumDaysCopied >= (inpAtrPeriod+1) && bIsNewDay() == true)
      {
        // Calcular o ATR para o dia
          dATR            = dCalculateATR(oDailyRates);
          dPreviousClose  = oDailyRates[0].close;        
      }
      
      ExtR1Buffer[i] = dPreviousClose + 0.5  * dATR;
      ExtR2Buffer[i] = dPreviousClose + 0.75 * dATR;
      ExtR3Buffer[i] = dPreviousClose + 1.0  * dATR;
      ExtS1Buffer[i] = dPreviousClose - 0.5  * dATR;
      ExtS2Buffer[i] = dPreviousClose - 0.75 * dATR;
      ExtS3Buffer[i] = dPreviousClose - 1.0  * dATR;
   }

//--- valor de retorno de prev_calculated para a próxima chamada
   return(rates_total);
  }
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| Calcular ATR|
//+------------------------------------------------------------------+
double dCalculateATR(const MqlRates &oRates[])
{
    double dValue = 0;
    int iIndex    = 0;
    
    for (int i = 0; i < ArraySize(dWeights); i++)
    {
       double dHL   = oRates[i].high - oRates[i].low;
       double dHCp  = MathAbs(oRates[i].high - oRates[i+1].close);
       double dLCp  = MathAbs(oRates[i].low - oRates[i+1].close);
       double dTR   = MathMax(MathMax(dHL, dHCp),dLCp);
       
       dValue +=  dTR * dWeights[iIndex];      
       iIndex++;
    }   
    return dValue;
}

//-----------------------------
// -- Check New Day
//-----------------------------
bool bIsNewDay(void)
{
   bool bNewDay  = false;
   
   static datetime oDateOld;  
   datetime        oDateNew[1];
   
   MqlDateTime oStructDateOld;
   MqlDateTime oStructDateNew;

   // Copiar matriz da hora atual para New_Time
   int iCopyHandle = CopyTime(_Symbol, PERIOD_D1, 0, 1, oDateNew);
   
   TimeToStruct(oDateNew[0] , oStructDateNew);
   TimeToStruct(oDateOld    , oStructDateOld);
   
   // Se a cópia for bem-sucedida
   if(iCopyHandle>0)
   {
      // If New Day
      if(oStructDateNew.day != oStructDateOld.day)
      {
         bNewDay  =  true;   
         oDateOld =  oDateNew[0];        
      }
   }      
   return bNewDay;     
}
 
Gostaria de ter uma versão para o MT4, por favor.
 
Como alterar a linha horizontal do indicador para uma linha horizontal curta, mostrando apenas o lado direito.
 
xy618z linha horizontal do indicador para uma linha horizontal curta, mostrando apenas o lado direito.

Hi

você pode tentar criar uma linha horizontal usando

   ObjectCreate(0,_name,OBJ_HLINE,0,0,0);

e a hora de início + 'n' períodos como hora de parada.

 
Anil Varma #:

Hi

Você pode tentar criar uma linha horizontal usando

e a hora de início + 'n' períodos como hora de parada.

A linha horizontal sempre se expande em todo o gráfico - você não pode limitá-la pelo parâmetro de tempo: https: //www.mql5.com/en/docs/constants/objectconstants/enum_object/obj_hline

Documentation on MQL5: Constants, Enumerations and Structures / Objects Constants / Object Types / OBJ_HLINE
Documentation on MQL5: Constants, Enumerations and Structures / Objects Constants / Object Types / OBJ_HLINE
  • www.mql5.com
OBJ_HLINE - Object Types - Objects Constants - Constants, Enumerations and Structures - MQL5 Reference - Reference on algorithmic/automated trading language for MetaTrader 5
 
Obrigado.
 
Cannot compile tem 4 erros
 
merky16 # Cannot compile tem 4 erros
Publicado em 2018, o código evoluiu desde então. O autor pode ou não atualizá-lo, quem sabe.

Isenção de responsabilidade: estou presumindo, como você disse, que ele contém erros; eu mesmo não o compilei.
 
merky16 #:
Cannot compile tem 4 erros

Não há erros de compilação