Отличный индикатор! Я создал такой же, используя буферы, есть идеи, как построить уровни поддержки и сопротивления для каждого дня, а не только для текущего дня?
Вот моя версия на данный момент. Но я не могу найти способ получить 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; }
Здравствуйте
Вы можете попробовать создать горизонтальную линию, используя
ObjectCreate(0,_name,OBJ_HLINE,0,0,0);
и время начала + 'n' периодов в качестве времени остановки.
Привет
Вы можете попробовать создать горизонтальную линию с помощью
и время начала + 'n' периодов в качестве времени остановки.
Горизонтальная линия всегда расширяется на весь график - вы не можете ограничить ее временным параметром: https: //www.mql5.com/en/docs/constants/objectconstants/enum_object/obj_hline
- www.mql5.com
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования

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