Вот функция для нормирования. Ваш индикатор должен быть занесен в индикаторный буфер 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); }
Ага. А стохастик вы тоже так считать собрались?))) Это формула стохастика: (цена-минимум)/(максимум - минимум). А, ну да - еще на 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); }
Косяк в том, что руководство у меня нет времени нормально сесть и почитать :)
На примере разобрался.
Вопросец в догонку. А можно запретить вывод в окне индикатора его значений после имени. Дело в том, что в одном окне у меня три нормированных от 0 до 1 индикатора - по два значения для каждого (для обоих буферов). Получает вверху окна три имени + шесть значений - слишком длинная строка, трудно ориентировать, когда индикатор достигает 1. Как бы запретить выводить значение буфера, который всё равно DRAW_NONE?
SetIndexLabel(n, NULL);
где n - номер буфера, значение которого выводить не нужно.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Есть индикатор с непостоянными значениями минимума и максимума. Хочу его нормировать от 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);
}
Как правильно прописать операцию нормирования?