Получить Максимум и Минимум на текущей свече

 

Здравствуйте.
Столкнулась не с проблемой, а просто с чем-то для себя новым.
Уверена, что ответы есть, но как задать правильно вопрос....

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


Так вот задача по сути не сложная (для тех у кого есть больше практики и опыта чем у меня)
есть индикатор (подвальный) показывает линию (производная из нескольких МА деленное само на себя и т.д.) но уровень Максимум и Минимум постоянно меняется.
И поэтому не получается установить уровень для того, что бы отследить его переход.


Хотелось бы понять как я могу получить на 1 свече  (на на текущей 0) получить максимальное и минимальное значение.

Пыталась изучить функцию

ArrayMaximum(

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

extern int Period1 = 44;
extern int Period2 = 22;
extern int Period3 = 66;
extern int Period4 = 33;
extern int Period5 = 29;
extern int Period6 = 14;
extern int Price   = PRICE_CLOSE;

double Map[];
double prices[];
int    maxPeriod;


int init()
  {
   IndicatorBuffers(2);
   SetIndexBuffer(0,Map);
   SetIndexBuffer(1,prices);
   IndicatorShortName("DCE"+Period1+","+Period2);
   maxPeriod = MathMax(Period1,Period2);
   maxPeriod = MathMax(Period3,maxPeriod);
   maxPeriod = MathMax(Period4,maxPeriod);
   maxPeriod = MathMax(Period5,maxPeriod);
   maxPeriod = MathMax(Period6,maxPeriod);

   
   return(0);
  }


int start()
  {
   int i,count,counted_bars=IndicatorCounted();
   if(counted_bars < 0)
      return(-1);
   if(counted_bars>0)
      counted_bars--;
   int limit = MathMin(MathMax(Bars-counted_bars,maxPeriod),Bars-1);
   
   for(i=limit; i>=0; i--)
      prices[i] = iMA(NULL,0,1,0,MODE_SMA,Price,i);
   for(i=limit; i>=0; i--)
     {
      Map[i] = icTma(Period2,i)-icTma(Period1,i)+icTma(Period4,i)-icTma(Period3,i)+icTma(Period6,i)-icTma(Period5,i);
      
     }
   return(0);
  }


double icTma(int period, int i)
  {
   int j,k;
   double sum  = (period+1)*prices[i];
   double sumw = (period+1);

   for(j=1, k=period; j<period; j++,k--)
     {
      sum  += prices[i+j]*k;
      sumw += k;
      
      if(j<=i)
        {
         sum  += prices[i-j]*k;
         sumw += k;
        }
     }
   return(sum/sumw);
  }
Максимум и минимум
Документация по MQL5: Операции с массивами / ArrayMaximum
Документация по MQL5: Операции с массивами / ArrayMaximum
  • www.mql5.com
ArrayMaximum - Операции с массивами - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Natalya Smirnova:

Здравствуйте.
Столкнулась не с проблемой, а просто с чем-то для себя новым.
Уверена, что ответы есть, но как задать правильно вопрос....

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


Так вот задача по сути не сложная (для тех у кого есть больше практики и опыта чем у меня)
есть индикатор (подвальный) показывает линию (производная из нескольких МА деленное само на себя и т.д.) но уровень Максимум и Минимум постоянно меняется.
И поэтому не получается установить уровень для того, что бы отследить его переход.


Хотелось бы понять как я могу получить на 1 свече  (на на текущей 0) получить максимальное и минимальное значение.

Пыталась изучить функцию

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

Это функция из документации

//+------------------------------------------------------------------+ 
//| Функция получает значение минимума графика в главном окне или    | 
//| подокне.                                                         | 
//+------------------------------------------------------------------+ 
double ChartPriceMin(const long chart_ID=0,const int sub_window=0) 
  { 
//--- подготовим переменную для получения результата 
   double result=EMPTY_VALUE; 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- получим значение свойства 
   if(!ChartGetDouble(chart_ID,CHART_PRICE_MIN,sub_window,result)) 
     { 
      //--- выведем сообщение об ошибке в журнал "Эксперты" 
      Print(__FUNCTION__+", Error Code = ",GetLastError()); 
     } 
//--- вернем значение свойства графика 
   return(result); 
  }

Так-же и максимум.

 
Alexey Viktorov #:

Это функция из документации

Так-же и максимум.

К сожалению показывает и максимум и минимум 0


extern int Period1 = 44;
extern int Period2 = 22;
extern int Period3 = 66;
extern int Period4 = 33;
extern int Period5 = 29;
extern int Period6 = 14;
extern int Price   = PRICE_CLOSE;

double Map[];
double prices[];
int    maxPeriod;

double result=0;
double result2=0;

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorBuffers(2);
   SetIndexBuffer(0,Map);
   SetIndexBuffer(1,prices);
   IndicatorShortName("DCE"+Period1+","+Period2);
   maxPeriod = MathMax(Period1,Period2);
   maxPeriod = MathMax(Period3,maxPeriod);
   maxPeriod = MathMax(Period4,maxPeriod);
   maxPeriod = MathMax(Period5,maxPeriod);
   maxPeriod = MathMax(Period6,maxPeriod);
   SetIndexStyle(0,DRAW_LINE,0,2,Aqua);
   SetIndexStyle(1,DRAW_LINE,0,2,Green);

   return(0);
  }


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   int i,count,counted_bars,y=IndicatorCounted();
   if(counted_bars < 0)
      return(-1);
   if(counted_bars>0)
      counted_bars--;
   int limit = MathMin(MathMax(Bars-counted_bars,maxPeriod),Bars-1);

   for(i=limit; i>=0; i--)
      prices[i] = (iMA(NULL,0,1,0,MODE_SMA,Price,i));
  
   for(i=limit; i>=0; i--)
     {
      Map[i] = (icTma(Period2,i)-icTma(Period1,i)+icTma(Period4,i)-icTma(Period3,i)+icTma(Period6,i)-icTma(Period5,i))*1000;

     }
  
      Print(result + "  " + result2);

   return(0);
  }


//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double icTma(int period, int i)
  {
   int j,k;
   double sum  = (period+1)*prices[i];
   double sumw = (period+1);

   for(j=1, k=period; j<period; j++,k--)
     {
      sum  += prices[i+j]*k;
      sumw += k;

      if(j<=i)
        {
         sum  += prices[i-j]*k;
         sumw += k;
        }
     }
   return(sum/sumw);
  }
//+------------------------------------------------------------------+
double ChartPriceMin(const long chart_ID=0,const int sub_window = 0) 
  { 
//--- подготовим переменную для получения результата 
   result=EMPTY_VALUE; 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- получим значение свойства 
   if(!ChartGetDouble(chart_ID,CHART_PRICE_MIN,sub_window,result)) 
     { 
      //--- выведем сообщение об ошибке в журнал "Эксперты" 
      Print(__FUNCTION__+", Error Code = ",GetLastError()); 
     }
    
//--- вернем значение свойства графика 
   return(result); 
  }
  
 
  double ChartPriceMax(const long chart_ID=0,const int sub_window = 0) 
  { 
//--- подготовим переменную для получения результата 
   result2=EMPTY_VALUE; 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- получим значение свойства 
   if(!ChartGetDouble(chart_ID,CHART_PRICE_MAX,sub_window,result2)) 
     { 
      //--- выведем сообщение об ошибке в журнал "Эксперты" 
      Print(__FUNCTION__+", Error Code = ",GetLastError()); 
     }
    
//--- вернем значение свойства графика 
   return(result2); 
  }
Хотя я полагаю, здесь моя ошибка в применении функции... 
 
Natalya Smirnova #:

К сожалению показывает и максимум и минимум 0


Хотя я полагаю, здесь моя ошибка в применении функции... 

Покажите, как применяете эти функции. Ведь в приведенном коде нет их использования. Есть только непосредственно реализация.

 
Ihor Herasko #:

Покажите, как применяете эти функции. Ведь в приведенном коде нет их использования. Есть только непосредственно реализация.

Напишу простыми словами
Сейчас индикатор показывает на графике максимальное значение, минимальное значение и текущее.


Мне необходимо получить верх и низ
что бы задать условие относительно текущей точки.
А так как верх и низ изменяется на каждой свече и у меня нет этих значений, я не могу оперировать значениями.

В дальнейшем я хочу сделать своего рода условные уровень (80% и 20%) при пересечении которого срабатывает уведомление.


Из преведенного ранее ответа

//+------------------------------------------------------------------+ 
//| Функция получает значение минимума графика в главном окне или    | 
//| подокне.                                                         | 
//+------------------------------------------------------------------+ 
double ChartPriceMin(const long chart_ID=0,const int sub_window=0) 
  { 
//--- подготовим переменную для получения результата 
   double result=EMPTY_VALUE; 
//--- сбросим значение ошибки 
   ResetLastError(); 
//--- получим значение свойства 
   if(!ChartGetDouble(chart_ID,CHART_PRICE_MIN,sub_window,result)) 
     { 
      //--- выведем сообщение об ошибке в журнал "Эксперты" 
      Print(__FUNCTION__+", Error Code = ",GetLastError()); 
     } 
//--- вернем значение свойства графика 
   return(result); 
  }
я получаю значения но оно постоянно = 0
Поэтому я и уточнила что я не верно сделала используя данный ответ. (Т.е. где я не верно применила функцию, что не указала)
 
Natalya Smirnova #:

Напишу простыми словами
Сейчас индикатор показывает на графике максимальное значение, минимальное значение и текущее.


Мне необходимо получить верх и низ
что бы задать условие относительно текущей точки.
А так как верх и низ изменяется на каждой свече и у меня нет этих значений, я не могу оперировать значениями.

В дальнейшем я хочу сделать своего рода условные уровень (80% и 20%) при пересечении которого срабатывает уведомление.


Из преведенного ранее ответа

я получаю значения но оно постоянно = 0
Поэтому я и уточнила что я не верно сделала используя данный ответ. (Т.е. где я не верно применила функцию, что не указала)

Перед принтом, в функции     int start() 

вставьте это

 ChartPriceMin(0,ChartWindowFind(0,"DCE"+Period1+","+Period2));
 ChartPriceMax(0,ChartWindowFind(0,"DCE"+Period1+","+Period2));
 
Alekseu Fedotov #:

Перед принтом, в функции     int start() 

вставьте это

Вот точно !!!!
Работает прекрасно!
Спасибо большое!!!!
 
Natalya Smirnova #:

В дальнейшем я хочу сделать своего рода условные уровень (80% и 20%) при пересечении которого срабатывает уведомление.

Так неправильно делать. Мин/Макс будет изменяться в зависимости от текущего размера подокна, в зависимости от данных в окне и от разрешения экрана.
Растянете окно влево/вправо и пересечения "поедут", нажмете +/- и пересечения "поедут", откроете чарт на другом компьютере (с большим/меньшим разрешением) и пересечения "поедут", появится новый мин/макс и снова всё "поедет".

Нет смысла в таких сигналах.

 
Taras Slobodyanik #:

Так неправильно делать. Мин/Макс будет изменяться в зависимости от текущего размера подокна, в зависимости от данных в окне и от разрешения экрана.
Растянете окно влево/вправо и пересечения "поедут", нажмете +/- и пересечения "поедут", откроете чарт на другом компьютере (с большим/меньшим разрешением) и пересечения "поедут", появится новый мин/макс и снова всё "поедет".

Нет смысла в таких сигналах.

А как это избежать?

Как сделать то, что я хочу?
Т.е. получить сигнал текущая точка опустилась ниже моего уровня?

 
Natalya Smirnova #:

А как это избежать?

Как сделать то, что я хочу?
Т.е. получить сигнал текущая точка опустилась ниже моего уровня?

По моему вы уже сделали всё что хотели. Советы не всегда бывают правильными. Для того чтобы в этом убедиться, увеличьте размер окна по вертикали

Как видите значения не меняются. Изменения будут только в случае изменения максимального и минимального значений индикатора на видимом участке графика.

Но и в таком положении индикатора предложенный код получит правильные, текущие значения.

 
Natalya Smirnova:

Пыталась изучить функцию

но не получается. Выдает неизвестные мне числа. 

Внимательно прочитайте документацию. 
Функции ArrayMaximum и ArrayMinimum возвращают индекс элемента массива, а не само значение.
Для получения значения используйте:
arr[ArrayMaximum(arr)]

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