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

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

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


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

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

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

Файлы:
Alexey Viktorov
27910
Alexey Viktorov  
Gerkl:

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


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

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

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

Документацию почитать не пробовали?
Документация по MQL5: Доступ к таймсериям и индикаторам / iBarShift
Документация по MQL5: Доступ к таймсериям и индикаторам / iBarShift
  • www.mql5.com
//| Script program start function                                    | //| Возвращает название дня недели                                   |
Igor Makanu
9908
Igor Makanu  
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);
  }
//+------------------------------------------------------------------+
Gerkl
172
Gerkl  
Alexey Viktorov:
Документацию почитать не пробовали?

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

Gerkl
172
Gerkl  
Igor Makanu:

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

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

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

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

Alexey Viktorov
27910
Alexey Viktorov  
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    // количество проверяемых
   );


Igor Makanu
9908
Igor Makanu  
Gerkl:

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

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

Alexey Viktorov:

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

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

Alexey Viktorov
27910
Alexey Viktorov  
Igor Makanu:

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

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

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

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

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

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

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

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;

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