Индикатор для вычисления High

 

Добрый день, в программировании новичек (1й день пытаюсь что-то сделать), хотел бы создать индикатор, который бы вычислял самый максимальный High свечи в промежутке +/- n свечей от анализируемой. Вроде написал, вроде верно, но считает не правильно, подскажите пожалуйста в чем причина, текст индикатора вот такой:

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Red
#property indicator_color2 Blue
input int      number=0;
//---- input parameters

//---- buffers
double ExtUpFractalsBuffer[];
double ExtDownFractalsBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicator buffers mapping  
    SetIndexBuffer(0,ExtUpFractalsBuffer);
    SetIndexBuffer(1,ExtDownFractalsBuffer);   
//---- drawing settings
    SetIndexStyle(0,DRAW_ARROW);
    SetIndexArrow(0,217);
    SetIndexStyle(1,DRAW_ARROW);
    SetIndexArrow(1,218);
//----
    SetIndexEmptyValue(0,0.0);
    SetIndexEmptyValue(1,0.0);
//---- name for DataWindow
    SetIndexLabel(0,"Fractal Up");
    SetIndexLabel(1,"Fractal Down");
//---- initialization done   
   return(0);
  }
//+------------------------------------------------------------------+
//| Custor indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
//---- TODO: add your code here
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   int    i,nCountedBars,n,k,b;
   double dCurrent;
   nCountedBars=IndicatorCounted();
   n=number;
   i=Bars-nCountedBars-n*2;

//----Up and Down Fractals
   while(i>=n)
     {
      //----Fractals up
      dCurrent=High[i];
      b=1;
      for(k=0;k<n;k++)
         {
      if(dCurrent>High[i+k+1] && dCurrent>High[i-k-1])
        {
         b++;
        }  
         }
      if(b==n)
      {  
         ExtUpFractalsBuffer[i]=dCurrent;
      }
                 
      i--;
     }
//----
   return(0);
  }

 Помогите пожалуйста разобраться в чем причина, ума не приложу, где ошибка.

 

Проще использовать такое (поскольку код выше на MQL4)

https://docs.mql4.com/ru/series/ihighest

iHighest - Документация на MQL4
  • docs.mql4.com
iHighest - Документация на MQL4
 
Или CopyHigh
CopyHigh - Документация на MQL4
  • docs.mql4.com
CopyHigh - Документация на MQL4
 
_new-rena:

Проще использовать такое (поскольку код выше на MQL4)

https://docs.mql4.com/ru/series/ihighest

Или по старинке методом сравнения :)
 
Alexey:
Или по старинке методом сравнения :)
по разному можно. код у человека слишком крут для решения элементарной задачи, вот и советуем...
 
_new-rena:
по разному можно. код у человека слишком крут для решения элементарной задачи, вот и советуем...
Тогда надо было посоветовать, чтобы хотя бы недельку подумал и попытался сам разобраться. Это бы пошло на пользу!
 
MaaForex:

Добрый день, в программировании новичек (1й день пытаюсь что-то сделать), хотел бы создать индикатор, который бы вычислял самый максимальный High свечи в промежутке +/- n свечей от анализируемой. Вроде написал, вроде верно, но считает не правильно, подскажите пожалуйста в чем причина, текст индикатора вот такой:

 Помогите пожалуйста разобраться в чем причина, ума не приложу, где ошибка.

Сегодня, как раз, что-то подобное делал. Получилось не совсем, что предполагал увидеть. Видно, что когда сдвигается индекс бара, находится экстремум совсем рядом, меньше или больше предшествующего.

#property indicator_chart_window
#property indicator_buffers 2
#property indicator_color1 Magenta
#property indicator_color2 Aqua
//--- input parameters
extern int       istart       =0;//откуда начинается поиск минимума цены
extern int       q            =49;//кол-во элементов для поиска
//--- buffers
double Max[];
double Min[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- indicators
   IndicatorBuffers(2);
   SetIndexBuffer(1,Min);
   SetIndexStyle(1,DRAW_ARROW);
   SetIndexArrow(1,116);
   SetIndexEmptyValue(1,0.0);
   SetIndexBuffer(0,Max);
   SetIndexStyle(0,DRAW_ARROW);
   SetIndexArrow(0,116);
   SetIndexEmptyValue(0,0.0);
   IndicatorDigits(Digits+1);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
int deinit()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
    int counted_bars=IndicatorCounted(),limit, i,minbar,maxbar;
   if(counted_bars>0)
      counted_bars--;  
   limit=Bars-counted_bars-1;
   for(i=0;i<limit;i++)
   {
   double Low_[];
   double High_[];
   ArraySetAsSeries(Low_,true);
   ArraySetAsSeries(High_,true);
   int start_=istart ;//откуда ищем 
   CopyLow(_Symbol,_Period,i+start_,q,Low_); 
   CopyHigh(_Symbol,_Period,i+start_,q,High_); 
   minbar=ArrayMinimum(Low_)+start_;          
   maxbar=ArrayMaximum(High_)+start_;
   Max[i+maxbar]=High[i+maxbar];
   Min[i+minbar]=Low[i+minbar];
   }
   return(0);
  }
//+------------------------------------------------------------------+
можно вывести эти строки за пределы цикла, тогда будет находится текущие экстремумы
Max[i+maxbar]=High[i+maxbar];
Min[i+minbar]=Low[i+minbar];
 
Проще всего использовать iHighest - ничего сложного
Причина обращения: