Пожалуйста помогите с индикатором

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Serzh_2018
38
Serzh_2018  

Хочу написать индикатор. Написал 0-й уровень который выставляет точки над максимумами и минимумами. Теперь нужно в 1 уровне отфильтровать ненужные максимумы и минимумы. Так чтобы максимумы и минимумы ишли поочередно и чтобы между двумя максимумами был только один минимум и наоборот.

Сейчас в индикаторе точки отображаются так:

График 1

А нужно чтобы отображались так:

График 2

Вото код моего индикатора:

//+---------------------------------------------------------------------------------------------------------+
//|                                                                                        Trend Levels.mq5 |
//|                                                                                                   Serzh |
//+---------------------------------------------------------------------------------------------------------+
#property copyright "Serzh"
#property version   "1.00"

//--------------------------------Входные параметры----------------------------------------------------------

#property indicator_chart_window                 // Индикатор отображается в окне графика
#property indicator_buffers 4                    // К-во индикаторных буферов
#property indicator_plots   2                    // К-во графических серий

//--------------------------------Инициализация графических серий--------------------------------------------

#property indicator_label1  "Максимумы 1-го ровня"         // Название индикаторной серии
#property indicator_type1   DRAW_ARROW                     // Тип линии индикатора
#property indicator_color1  clrDarkGreen                   // Цвет линии индикатора
#property indicator_width1  2                              // Толщина линии индикатора

#property indicator_label2  "Минимумы 1-го ровня"          // Название индикаторной серии
#property indicator_type2   DRAW_ARROW                     // Тип линии индикатора
#property indicator_color2  clrCrimson                     // Цвет линии индикатора
#property indicator_width2  2                              // Толщина линии индикатора

/*
#property indicator_label3  "Максимумы 2-го ровня"         // Название индикаторной серии
#property indicator_type3   DRAW_ARROW                     // Тип линии индикатора
#property indicator_color3  clrDarkGreen                   // Цвет линии индикатора
#property indicator_width3  4                              // Толщина линии индикатора

#property indicator_label4  "Минимумы 2-го ровня"          // Название индикаторной серии
#property indicator_type4   DRAW_ARROW                     // Тип линии индикатора
#property indicator_color4  clrCrimson                     // Цвет линии индикатора
#property indicator_width4  4                              // Толщина линии индикатора

#property indicator_label5  "Максимумы 3-го ровня"         // Название индикаторной серии
#property indicator_type5   DRAW_ARROW                     // Тип линии индикатора
#property indicator_color5  clrDarkGreen                   // Цвет линии индикатора
#property indicator_width5  6                              // Толщина линии индикатора

#property indicator_label6  "Минимумы 3-го ровня"          // Название индикаторной серии
#property indicator_type6   DRAW_ARROW                     // Тип линии индикатора
#property indicator_color6  clrCrimson                     // Цвет линии индикатора
#property indicator_width6  6                              // Толщина линии индикатора
*/

//--------------------------------Инициализация индикаторных массивов----------------------------------------

 double Max_1[],Min_1[]; //Max_2[],Min_2[], Max_3[],Min_3[];         // Индикаторные массивы
 double Max_0[],Min_0[];                                             // Вспомогательные массивы
   
//+---------------------------------------------------------------------------------------------------------+
//|                               Функция обработки события OnInit                                          |
//+---------------------------------------------------------------------------------------------------------+
int OnInit()

  {
  
   EventSetTimer(_Period);                                 // Установка Таймера

//-----------------------------------------------------------------------------------------------------------
   
   SetIndexBuffer(0,Max_1,INDICATOR_DATA);                 // Присвоение индикаторного массива буферу
   SetIndexBuffer(1,Min_1,INDICATOR_DATA);                 // Присвоение индикаторного массива буферу
   
   PlotIndexSetInteger(0,PLOT_ARROW,159);                  // Установка кода символа для PLOT_ARROW
   PlotIndexSetInteger(1,PLOT_ARROW,159);                  // Установка кода символа для PLOT_ARROW
   
   PlotIndexSetInteger(0,PLOT_ARROW_SHIFT,-10);            // Установка сдвига символа в пикселях
   PlotIndexSetInteger(1,PLOT_ARROW_SHIFT,10);             // Установка сдвига символа в пикселях
    
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);               // Установка пустого значения
   PlotIndexSetDouble(1,PLOT_EMPTY_VALUE,0);               // Установка пустого значения

//-----------------------------------------------------------------------------------------------------------
 /*  
   SetIndexBuffer(2,Max_2,INDICATOR_DATA);                 // Присвоение индикаторного массива буферу
   SetIndexBuffer(3,Min_2,INDICATOR_DATA);                 // Присвоение индикаторного массива буферу
   
   PlotIndexSetInteger(2,PLOT_ARROW,108);                  // Установка кода символа для PLOT_ARROW
   PlotIndexSetInteger(3,PLOT_ARROW,108);                  // Установка кода символа для PLOT_ARROW
   
   PlotIndexSetInteger(2,PLOT_ARROW_SHIFT,10);             // Установка сдвига символа в пикселях
   PlotIndexSetInteger(3,PLOT_ARROW_SHIFT,-10);            // Установка сдвига символа в пикселях
    
   PlotIndexSetDouble(2,PLOT_EMPTY_VALUE,0);               // Установка пустого значения
   PlotIndexSetDouble(3,PLOT_EMPTY_VALUE,0);               // Установка пустого значения
   
   ArraySetAsSeries(Max_2,true);                           // Установка индексаци массива как в таймсерии
   ArraySetAsSeries(Min_2,true);                           // Установка индексаци массива как в таймсерии       
   
//-----------------------------------------------------------------------------------------------------------   
   
   SetIndexBuffer(4,Max_3,INDICATOR_DATA);                 // Присвоение индикаторного массива буферу
   SetIndexBuffer(5,Min_3,INDICATOR_DATA);                 // Присвоение индикаторного массива буферу
   
   PlotIndexSetInteger(4,PLOT_ARROW,117);                  // Установка кода символа для PLOT_ARROW
   PlotIndexSetInteger(5,PLOT_ARROW,117);                  // Установка кода символа для PLOT_ARROW
   
   PlotIndexSetInteger(4,PLOT_ARROW_SHIFT,10);             // Установка сдвига символа в пикселях
   PlotIndexSetInteger(5,PLOT_ARROW_SHIFT,-10);            // Установка сдвига символа в пикселях
    
   PlotIndexSetDouble(4,PLOT_EMPTY_VALUE,0);               // Установка пустого значения
   PlotIndexSetDouble(5,PLOT_EMPTY_VALUE,0);               // Установка пустого значения 

   ArraySetAsSeries(Max_3,true);                           // Установка индексаци массива как в таймсерии
   ArraySetAsSeries(Min_3,true);                           // Установка индексаци массива как в таймсерии 
     
 */  
//----------------------------------------------------------------------------------------------------------- 

   SetIndexBuffer(2,Max_0,INDICATOR_CALCULATIONS);                   // Присвоение индикаторного массива буферу
   SetIndexBuffer(3,Min_0,INDICATOR_CALCULATIONS);                   // Присвоение индикаторного массива буферу
   
   ArraySetAsSeries(Max_0,true);                                     // Установка индексаци массива как в таймсерии
   ArraySetAsSeries(Min_0,true);                                     // Установка индексаци массива как в таймсерии
   
//--------------------------------Инициализация массивов-----------------------------------------------------
   
   return(INIT_SUCCEEDED);

  }
//+---------------------------------------------------------------------------------------------------------+
//|                               Функция обработки события OnCalculate                                     |
//+---------------------------------------------------------------------------------------------------------+
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[])                       // Спред
  {
//--------------------------------Объявление переменных------------------------------------------------------

 int i0, i_1max, i_1min, i_1maxH=0, i_1minH=0;                                 // Индексы
 
 int Max_1Index=0, Min_1Index=0;                                               // Индексы максимальных и минимальных баров

 int Step_0, Step_1max, Step_1min;                                             // Шаги циклов
 
 int Start_1max, Start_1min;                                                   // Стартовая позиция
 
 int Stop_1maxA=0, Stop_1minA=0, Stop_1maxB=0, Stop_1minB=0;                   // Ограничитель дальнейших действий
 
 int Shift_max1=0, Shift_min1=0;                                               // Шифты
 
 int TotalMax_0=0, TotalMin_0=0;                                               // Всего баров в нулевых массивах
 int TotalMax_1=0, TotalMin_1=0;                                               // Всего баров в массивах 1-го уровня
 
 int imax_0=0, imin_0=0, imax_1=0, imin_1=0;                                   // Инициализаторы массивов

 
//--------------------------------Расчет 0-го уровня индикатора----------------------------------------------

  if(prev_calculated<4) Step_0=1;                                              // Если расчетов еще небыло Step_0=1
  else Step_0=rates_total-3;                                                   // Если расчеты уже были Step_0=rates_total-3
  
  for(i0=Step_0;i0<rates_total-2;i0++)                                         // Цикл для расчетов
    {
     if (high[i0+1]<high[i0] && high[i0]>=high[i0-1]) Max_0[i0]=high[i0];      // Присвоение значения массиву Max_0
     else Max_0[i0]=0;                                                         // Присвоение 0 значения массиву
     TotalMax_0=ArrayRange(Max_0,imax_0);                                      // Всего баров в массиве Max_0
         
     if (low[i0+1]>low[i0] && low[i0]<=low[i0-1])     Min_0[i0]=low[i0];       // Присвоение значения массиву Min_0
     else Min_0[i0]=0;                                                         // Присвоение 0 значения массиву
     TotalMin_0=ArrayRange(Min_0,imin_0);                                      // Всего баров в массиве Min_0
    }

//--------------------------------Расчет максимума 1-го уровня индикатора------------------------------------

  if (TotalMax_1<2) Step_1max=1;                                               // Если расчетов еще небыло Step_1max=1
  else Step_1max=TotalMax_0-1;                                                 // Если расчеты уже были Step_1max=TotalMax_0-1
  
  for (i_1max=Step_1max;i_1max<TotalMax_0-1;i_1max++)                          // Главный цикл для заполнения массива Max_1
      {
       if (Max_0[i_1max]>Min_0[i_1max] && Stop_1maxA<1)                        // Нахождение ситуации когда Max_0 больше Min_0
          {
           Start_1max=i_1max;                                                  // Определение стартовой позиции
           Stop_1maxA=1;                                                       // Задается значение пераметру Stop_1maxA
           Stop_1minA=0;                                                       // Задается значение пераметру Stop_1minA
           
           for (i_1maxH=i_1max;Max_0[i_1maxH]>=Min_0[i_1maxH];i_1maxH++)       // Цикл для подсчета к-ва баров
           {Shift_max1++;}                                                     // Подсчет к-ва баров для расчета максимального индекса
           Max_1Index=ArrayMaximum(Max_0,Start_1max,Shift_max1);               // Вычисление максимального индекса
          }
       if (Max_0[i_1max]<Min_0[i_1max] && Stop_1minA<1)                        // Нахождение ситуации когда Max_0 меньше Min_0
          {
           Stop_1maxA=0;                                                       // Изменение параметра Stop_1maxA
           Stop_1minA=1;                                                       // Изменение параметра Stop_1minA
          }
       if (i_1max==Max_1Index) Max_1[i_1max]=Max_0[i_1max];                    // Присвоение значения массиву Max_1
       else Max_1[i_1max]=0;                                                   // Присвоение 0 значения массиву Max_1
       TotalMax_1=ArrayRange(Max_1,imax_1);                                    // Всего баров в массиве Max_1
      }

//--------------------------------Расчет минимума 1-го уровня индикатора-------------------------------------

  if (TotalMin_1<2) Step_1min=1;                                               // Если расчетов еще небыло Step_1min=1
  else Step_1min=TotalMin_0-1;                                                 // Если расчеты уже были Step_1min=TotalMin_0-1
  
  for (i_1min=Step_1min;i_1min<TotalMin_0-1;i_1min++)                          // Главный цикл для заполнения массива Min_1
      {
       if (Min_0[i_1min]>Max_0[i_1min] && Stop_1minB<1)                        // Нахождение ситуации когда Min_0 больше Max_0
          {
           Start_1min=i_1min;                                                  // Определение стартовой позиции
           Stop_1minB=1;                                                       // Задается значение пераметру Stop_1minB
           Stop_1maxB=0;                                                       // Задается значение пераметру Stop_1maxB
           
           for (i_1minH=i_1min;Min_0[i_1minH]>=Max_0[i_1minH];i_1minH++)       // Цикл для подсчета к-ва баров
           {Shift_min1++;}                                                     // Подсчет к-ва баров для расчета минимального индекса
           Min_1Index=ArrayMinimum(Min_0,Start_1min,Shift_min1);               // Вычисление максимального индекса
          }
       if (Min_0[i_1min]<Max_0[i_1min] && Stop_1maxB<1)                        // Нахождение ситуации когда Min_0 меньше Max_0
          {
           Stop_1minB=0;                                                       // Изменение параметра Stop_1minB
           Stop_1maxB=1;                                                       // Изменение параметра Stop_1maxB
          }
       if (i_1min==Min_1Index) Min_1[i_1min]=Min_0[i_1min];                    // Присвоение значения массиву Min_1
       else Min_1[i_1min]=0;                                                   // Присвоение 0 значения массиву Min_1
       TotalMin_1=ArrayRange(Min_1,imin_1);                                    // Всего баров в массиве Min_1
      }

//--------------------------------------------------------------   
  return(rates_total);
  }
//+---------------------------------------------------------------------------------------------------------+
//|                               Функция обработки события Таймер                                          |
//+---------------------------------------------------------------------------------------------------------+
   void OnTimer(){}
//+---------------------------------------------------------------------------------------------------------+

//+---------------------------------------------------------------------------------------------------------+
//|                               Функция обработки события OnDeinit                                        |
//+---------------------------------------------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   EventKillTimer();                                                 // Удаление Таймера
   Print(__FUNCTION__,"_Код причины деинициализации = ",reason);     // Причина деинициализации
  }
Alexey Volchanskiy
27264
Alexey Volchanskiy  
Serzh_2018:

Хочу написать индикатор. Написал 0-й уровень который выставляет точки над максимумами и минимумами. Теперь нужно в 1 уровне отфильтровать ненужные максимумы и минимумы. Так чтобы максимумы и минимумы ишли поочередно и чтобы между двумя максимумами был только один минимум и наоборот.

Сейчас в индикаторе точки отображаются так:

А нужно чтобы отображались так:

Вото код моего индикатора:

Код смотреть не стал, ибо нет смысла. Алгоритм же предельно ясен - если нашелся второй максимум больше первого, первый удаляем, второй переименовываем в первый. То же и с минимумами, только наоборот.

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий