Нужна помощь в нахождении Максимума и Минимума в индикаторе

 

Здрасте всем.


Имеется индикатор, который вычисляет и заполняет буффер индикатора в определенное время. Время его работы укаывается вручную. В промежутках нулевые значения.

Подскажите кто может как найти Максимум\Минимум именно в промежутках работы индикатора. Я понимаю, что нужно использовать функцию ArrayMaximum/ArrayMinimum. но не пойму как задать индексы, точнее привязать их к начальной точке отсчета.

Заранее спасибо.

Файлы:
MAX_MIN_01.png  49 kb
 
Gerkl:

Здрасте всем.


Имеется индикатор, который вычисляет и заполняет буффер индикатора в определенное время. Время его работы укаывается вручную. В промежутках нулевые значения.

Подскажите кто может как найти Максимум\Минимум именно в промежутках работы индикатора. Я понимаю, что нужно использовать функцию ArrayMaximum/ArrayMinimum. но не пойму как задать индексы, точнее привязать их к начальной точке отсчета.

Заранее спасибо.

Документацию почитать не пробовали?
Документация по MQL5: Доступ к таймсериям и индикаторам / iBarShift
Документация по MQL5: Доступ к таймсериям и индикаторам / iBarShift
  • www.mql5.com
//| Script program start function                                    | //| Возвращает название дня недели                                   |
 
Gerkl:

Я понимаю, что нужно использовать функцию ArrayMaximum/ArrayMinimum. но не пойму как задать индексы, точнее привязать их к начальной точке отсчета.

чтобы использовать ArrayMaximum() Вам придется с начальной точки отсчета скопировать данные в новый массив, размер которого будет равен скопированным данным и тогда Вы сможете корректно применить ArrayMaximum()

сделайте проще, один цикл от начала - точка отсчета и до точки окончания - Ваш скрин квадрат, в этом цикле и находите макс и мин значения

для МТ4 примерно такой код:

#property strict
#property show_inputs
input datetime   StartTime = D'2018.06.01';
input datetime   EndTime   = D'2018.10.01';
//+------------------------------------------------------------------+
void OnStart()
  {
   int st,end;
   double ind,min,max;
   min = DBL_MAX;
   max = 0.0;
   st  = iBarShift(NULL,0,StartTime);
   end = iBarShift(NULL,0,EndTime);
   while(st>=end){
      ind = iCustom(NULL,0,"MyIndicator",0,st);
      if(ind!=EMPTY_VALUE){
         if(ind>max) max=ind;
         if(ind<min) min=ind;
      }
   st--;
   }
   Print("max = ",max," , min = ",min);
  }
//+------------------------------------------------------------------+
 
Alexey Viktorov:
Документацию почитать не пробовали?

Пробовал читать и документацию, и форум облазил и в Google-e искал. А спрашиваю потому что все равно не понял как сделать, никогда раньше не делал и со многими функциями просто не знаком.

 
Igor Makanu:

чтобы использовать ArrayMaximum() Вам придется с начальной точки отсчета скопировать данные в новый массив, размер которого будет равен скопированным данным и тогда Вы сможете корректно применить ArrayMaximum()

сделайте проще, один цикл от начала - точка отсчета и до точки окончания - Ваш скрин квадрат, в этом цикле и находите макс и мин значения

для МТ4 примерно такой код:

Спасибо. Попробую разобраться. Не совсем понял зачем использовать iCustom? Попробую добавить эти расчеты в имеющийся индикатор.

 
Gerkl:

Пробовал читать и документацию, и форум облазил и в Google-e искал. А спрашиваю потому что все равно не понял как сделать, никогда раньше не делал и со многими функциями просто не знаком.

На вопрос, или уточнение в чём собственно проблема

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Нужна помощь в нахождении Максимума и Минимума в индикаторе

Gerkl, 2018.12.11 03:39

Здрасте всем.


Имеется индикатор, который вычисляет и заполняет буффер индикатора в определенное время. Время его работы укаывается вручную. В промежутках нулевые значения.

Подскажите кто может как найти Максимум\Минимум именно в промежутках работы индикатора. Я понимаю, что нужно использовать функцию ArrayMaximum/ArrayMinimum. но не пойму как задать индексы, точнее привязать их к начальной точке отсчета.

Заранее спасибо.

я дал ссылку на функцию определения индекса бара по указанному времени.

А дальше или как в примере Igor Makanu тупым перебором в цикле, или как в документации.

int  ArrayMaximum(
   const void&   array[],             // массив для поиска
   int           start=0,             // с какого индекса начинаем поиск
   int           count=WHOLE_ARRAY    // количество проверяемых
   );


 
Gerkl:

 Попробую добавить эти расчеты в имеющийся индикатор.

не прокатит, это скрипт, Вам все равно придется самостоятельно читать документацию

Alexey Viktorov:

А дальше или как в примере Igor Makanu тупым перебором в цикле, или как в документации.

баги могут быть, если индикаторные буфера которые не отображены, не нулем заполнены, мой пример тож не защищен от этого недостатка, но топикстартеру, по моему, это не поможет )))

 
Igor Makanu:

не прокатит, это скрипт, Вам все равно придется самостоятельно читать документацию

баги могут быть, если индикаторные буфера которые не отображены, не нулем заполнены, мой пример тож не защищен от этого недостатка, но топикстартеру, по моему, это не поможет )))

Судя по картинке не отображаемые значения отсутствуют. Ну, а если получился 0 и это будет минимальным значением, то так тому и быть.

Далеко не всегда полезны функции "на все случаи жизни".

 
Когда буферы заполняете, за одно и максимум с минимумом ищите.
 

Всем спасибо за помощь, идеи и советы. Данную задачу выполнил в виде отдельной функции. Проверил на чарте, вроде работает правильно. дальнейшее тестирование выявит ошибки, если такое будут.

Выкладываю код, если кому интересно.

void MaxMin(int i)
  {
   int st,end,cur;
   int maxValueIdx,minValueIdx,count;
   double maxValue,minValue;
   datetime startTime  = StringToTime(TimeToString(Time[i],TIME_DATE)+" "+StartTime);
   datetime endTime    = StringToTime(TimeToString(Time[i],TIME_DATE)+" "+EndTime);
   datetime currentTime=StringToTime(TimeToString(Time[i],TIME_DATE)+" "+TimeToString(Time[i],TIME_MINUTES));
   st=iBarShift(NULL,0,startTime);
   end=iBarShift(NULL,0,endTime);
   cur= iBarShift(NULL,0,currentTime);
  
      if(end<=cur)
        {
         end=cur;
         count=(st-end);
         maxValueIdx=ArrayMaximum(MainBuffer,count,end);
         maxValue=MainBuffer[maxValueIdx];
         MaxBuffer[i]= maxValue;
         minValueIdx = ArrayMinimum(MainBuffer,count,end);
         minValue=MainBuffer[minValueIdx];
         MinBuffer[i]=minValue;

        }
  }
Причина обращения: