Индикаторы: ATR Probability Levels

 

ATR Probability Levels:

Вероятностные уровни на основе ATR. "Вероятность" рассчитывается на основе прогнозируемого среднего значения ATR и цены Close предыдущего периода.


Автор: Mladen Rakic

 

Отличный индикатор! Я создал такой же, используя буферы, есть идеи, как построить уровни поддержки и сопротивления для каждого дня, а не только для текущего дня?


Вот моя версия на данный момент. Но я не могу найти способ получить 10 дней дневных баров для каждого бара"текущего таймфрейма"...

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

//--- Настройки индикаторного графика
#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

//--- Входы
input int             inpAtrPeriod   = 21;             // Период ATR

//--- Буферы индикаторов
double ExtR1Buffer[];
double ExtR2Buffer[];
double ExtR3Buffer[];
double ExtS1Buffer[];
double ExtS2Buffer[];
double ExtS3Buffer[];

// Веса для среднего истинного диапазона
double dWeights[];

// Глобальная переменная
double dATR           = 0;
double dPreviousClose = 0;
  
//+------------------------------------------------------------------+
//| Пользовательская функция инициализации индикатора |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- отображение индикаторных буферов
   SetIndexBuffer(0,ExtR1Buffer,   INDICATOR_DATA);         // Уровень сопротивления 1
   SetIndexBuffer(1,ExtR2Buffer,   INDICATOR_DATA);         // Уровень сопротивления 2
   SetIndexBuffer(2,ExtR3Buffer,   INDICATOR_DATA);         // Уровень сопротивления 3
   SetIndexBuffer(3,ExtS1Buffer,   INDICATOR_DATA);         // Уровень поддержки 1
   SetIndexBuffer(4,ExtS2Buffer,   INDICATOR_DATA);         // Уровень поддержки 2
   SetIndexBuffer(5,ExtS3Buffer,   INDICATOR_DATA);         // Уровень поддержки 3
   
   ArraySetAsSeries(ExtR1Buffer,    true);
   ArraySetAsSeries(ExtR2Buffer,    true);
   ArraySetAsSeries(ExtR3Buffer,    true);
   ArraySetAsSeries(ExtS1Buffer,    true);
   ArraySetAsSeries(ExtS2Buffer,    true);
   ArraySetAsSeries(ExtS3Buffer,    true);
   
   // Изменение размеров весов
   ArrayResize(dWeights, inpAtrPeriod);
 
   // Установить сглаживание
   double dSmoothing = 2.0 / (ArraySize(dWeights) + 1);
   
   // Расчет веса
   for(int i = 0; i < ArraySize(dWeights); i++)  
      dWeights[i] = dSmoothing * MathPow(1 - dSmoothing, i);   
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Пользовательская функция итерации индикатора|
//+------------------------------------------------------------------+
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[])
  {
//---
    
   // Получение ежедневных данных и проверка их достаточности
   MqlRates oDailyRates[];
   ArraySetAsSeries(oDailyRates, true);
     
   int iLast = 0;
   
   if(prev_calculated == 0)  
      iLast  = rates_total - 1;  
   else 
      iLast  = rates_total - prev_calculated;
   
   //--- Вычислить уровни
   for(int i = iLast; i >= 0 && !IsStopped();i--)
   {
      
      int iNumDaysCopied = CopyRates(_Symbol, PERIOD_D1, 1, inpAtrPeriod + 1, oDailyRates);
      if(iNumDaysCopied >= (inpAtrPeriod+1) && bIsNewDay() == true)
      {
        // Рассчитайте ATR за день
          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;
   }

//--- возвращаем значение prev_calculated для следующего вызова
   return(rates_total);
  }
//+------------------------------------------------------------------+


//+------------------------------------------------------------------+
//| Рассчитать 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;
}

//-----------------------------
// -- Проверь Новый День
//-----------------------------
bool bIsNewDay(void)
{
   bool bNewDay  = false;
   
   static datetime oDateOld;  
   datetime        oDateNew[1];
   
   MqlDateTime oStructDateOld;
   MqlDateTime oStructDateNew;

   // Копируем массив текущего времени в New_Time
   int iCopyHandle = CopyTime(_Symbol, PERIOD_D1, 0, 1, oDateNew);
   
   TimeToStruct(oDateNew[0] , oStructDateNew);
   TimeToStruct(oDateOld    , oStructDateOld);
   
   // При успешном копировании
   if(iCopyHandle>0)
   {
      // Если новый день
      if(oStructDateNew.day != oStructDateOld.day)
      {
         bNewDay  =  true;   
         oDateOld =  oDateNew[0];        
      }
   }      
   return bNewDay;     
}
 
Я хотел бы получить версию для mt4, пожалуйста.
 
Как изменить горизонтальную линию индикатора на короткую горизонтальную линию, показывающую только правую сторону.
 
xy618z горизонтальную линию индикатора на короткую горизонтальную линию, показывающую только правую сторону.

Здравствуйте

Вы можете попробовать создать горизонтальную линию, используя

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

и время начала + 'n' периодов в качестве времени остановки.

 
Anil Varma #:

Привет

Вы можете попробовать создать горизонтальную линию с помощью

и время начала + 'n' периодов в качестве времени остановки.

Горизонтальная линия всегда расширяется на весь график - вы не можете ограничить ее временным параметром: 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
 
Спасибо.
 
Невозможно скомпилировать - 4 ошибки
 
merky16 # Невозможно скомпилировать - 4 ошибки
Опубликовано в 2018 году, код с тех пор изменился. Автор может обновить его, а может и нет, кто знает.

Disclaimer: Я предполагаю, как вы сказали, что он содержит ошибки; я не компилировал его сам.
 
merky16 #:
Невозможно скомпилировать - 4 ошибки

Ошибок компиляции нет