Помогите нормировать индикатор?!

 

Есть индикатор с непостоянными значениями минимума и максимума. Хочу его нормировать от 0 до 1 по следующей схеме: Новое значение = (Текущее - Минимум за Х баров) / (Максимум за Х баров - Минимум за Х баров).

В языке только начинаю разбираться и пока что не удаётся решить эту задачу.


В конце кода есть такая конструкция:


for(i = limit; i >= 0; i--)

{

sc = MathAbs(...);


if( Bars - i <= RTHGPeriod)

RTHG[i] = Close[i];

else

RTHG[i] =RTHG[i] + sc * MathAbs(...);

}


return(0);

}


Как правильно прописать операцию нормирования?

 

Вот функция для нормирования. Ваш индикатор должен быть занесен в индикаторный буфер Ind[]. Чтоб не рисовался, поставьте стиль DRAW_NONE. А результат функции выводите в др. индикаторный буфер, например, так:

IndNorm[i]=Norm(norm,i);

Сама ф-я:

// нормирование
/*
norm     ширина окна нормирования в барах
i        индекс бара
Ind[]    индикаторный буфер со значения того, чего будет нормироваться
*/
double Norm(int norm, int i) {
   // экстремумы
   double max=Ind[ArrayMaximum(Ind,norm,i)];
   double min=Ind[ArrayMinimum(Ind,norm,i)];
   // вычисление осциллятора
   double delta=max-min; // размах
   if(delta==0) return(1);
   else return((Ind[i]-min)/delta);
  }
 
Svinozavr >>:

Пётр, гляньте в личку.

 
vasya_vasya >>:

Может я чего то не понял, но разве не достаточно убрать галочки

Ага. А стохастик вы тоже так считать собрались?))) Это формула стохастика: (цена-минимум)/(максимум - минимум). А, ну да - еще на 100 умножить. Топикстартер хочет вместо цены - любой инд.массив значений.


Не поняли. Картинку? ок. Вот стандартная девиация, а ниже она же, но нормированная по 40 барам в диапазон от 0 до 1.


 

Блин, что-то я запутался с буферами, не выводит ничего. Можно на примере обычного Моментума - как его нормировать?

//+------------------------------------------------------------------+
//|                                                     Momentum.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_separate_window
#property indicator_buffers 1
#property indicator_color1 DodgerBlue
//---- input parameters
extern int MomPeriod=14;
//---- buffers
double MomBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- indicator line
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,MomBuffer);
//---- name for DataWindow and indicator subwindow label
   short_name="Mom("+MomPeriod+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);
//----
   SetIndexDrawBegin(0,MomPeriod);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Momentum                                                         |
//+------------------------------------------------------------------+
int start()
  {
   int i,counted_bars=IndicatorCounted();
//----
   if(Bars<=MomPeriod) return(0);
//---- initial zero
   if(counted_bars<1)
      for(i=1;i<=MomPeriod;i++) MomBuffer[Bars-i]=0.0;
//----
   i=Bars-MomPeriod-1;
   if(counted_bars>=MomPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {
      MomBuffer[i]=Close[i]*100/Close[i+MomPeriod];
      i--;
     }
   return(0);
  }
//+------------------------------------------------------------------+

Заранее большое спасибо!

 

Блин. Ну, извольте:

//+------------------------------------------------------------------+
//|                                                     Momentum.mq4 |
//|                      Copyright © 2004, MetaQuotes Software Corp. |
//|                                       http://www.metaquotes.net/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2004, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 DodgerBlue
#property indicator_maximum 1
#property indicator_minimum 0

//---- input parameters
extern int MomPeriod=14;
extern int WindowOfNorm=44; // ширина окна нормирования в барах
//---- buffers
double NormBuffer[],MomBuffer[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
   string short_name;
//---- indicator line
   SetIndexStyle(0,DRAW_LINE);
   SetIndexBuffer(0,NormBuffer);

   SetIndexStyle(1,DRAW_NONE);
   SetIndexBuffer(1,MomBuffer);
//---- name for DataWindow and indicator subwindow label
   short_name="Mom("+MomPeriod+"/"+WindowOfNorm+")";
   IndicatorShortName(short_name);
   SetIndexLabel(0,short_name);
//----
   SetIndexDrawBegin(0,MomPeriod);
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| Momentum                                                         |
//+------------------------------------------------------------------+
int start()
  {
   int i,counted_bars=IndicatorCounted();
//----
   if(Bars<=MomPeriod) return(0);
//---- initial zero
   if(counted_bars<1)
      for(i=1;i<=MomPeriod;i++) MomBuffer[Bars-i]=0.0;
//----
   i=Bars-MomPeriod-1;
   if(counted_bars>=MomPeriod) i=Bars-counted_bars-1;
   while(i>=0)
     {
      MomBuffer[i]=Close[i]*100/Close[i+MomPeriod];

      // нормирование
      NormBuffer[i]=Norm(WindowOfNorm,i);
      //-----
      
      i--;
     }
   return(0);
  }
//+------------------------------------------------------------------+

// нормирование
/*
norm     ширина окна нормирования в барах
i        индекс бара
MomBuffer[]    индикаторный буфер со значения того, чего будет нормироваться
*/
double Norm(int norm, int i) {
   // экстремумы
   double max=MomBuffer[ArrayMaximum(MomBuffer,norm,i)];
   double min=MomBuffer[ArrayMinimum(MomBuffer,norm,i)];
   // вычисление осциллятора
   double delta=max-min; // размах
   if(delta==0) return(1);
   else return((MomBuffer[i]-min)/delta);
  }
Файлы:
 
Спасибо большое. Понял, в чём был косяк. Теперь нормально рисуется!!!
 
CanisLC >>:
Спасибо большое. Понял, в чём был косяк. Теперь нормально рисуется!!!

Ну и в чем, если не секрет? (Просто хочу понять, чего я непонятно сказал.)

 

Косяк в том, что руководство у меня нет времени нормально сесть и почитать :)

На примере разобрался.

 
Вопросец в догонку. А можно запретить вывод в окне индикатора его значений после имени. Дело в том, что в одном окне у меня три нормированных от 0 до 1 индикатора - по два значения для каждого (для обоих буферов). Получает вверху окна три имени + шесть значений - слишком длинная строка, трудно ориентировать, когда индикатор достигает 1. Как бы запретить выводить значение буфера, который всё равно DRAW_NONE?
 
CanisLC >>:
Вопросец в догонку. А можно запретить вывод в окне индикатора его значений после имени. Дело в том, что в одном окне у меня три нормированных от 0 до 1 индикатора - по два значения для каждого (для обоих буферов). Получает вверху окна три имени + шесть значений - слишком длинная строка, трудно ориентировать, когда индикатор достигает 1. Как бы запретить выводить значение буфера, который всё равно DRAW_NONE?

SetIndexLabel(n, NULL);
где n - номер буфера, значение которого выводить не нужно.

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