Фильтр Ходрика-Прескотта

 

На просторах форума нашел сглаживающий фильтр Ходрика-Прескотта. Вот его код. 

void HPF(int nobs,int period,double &x[],double &y[])
  {
   double a[],b[],c[],H1=0,H2=0,H3=0,H4=0,H5=0,HH1=0,HH2=0,HH3=0,HH5=0,HB=0,HC=0,Z=0;
   int i;
   
   double   lambda = 0.0625 / MathPow(MathSin(M_PI / period), 4);

   ArrayResize(a,nobs);
   ArrayResize(b,nobs);
   ArrayResize(c,nobs);

   ZeroMemory(a);
   ZeroMemory(b);
   ZeroMemory(c);

   a[0] = 1.0 + lambda;
   b[0] = -2.0*lambda;
   c[0] = lambda;
   for(i= 1; i<nobs-2; i++)
     {
      a[i] = 6.0*lambda + 1.0;
      b[i] = -4.0*lambda;
      c[i] = lambda;
     }
   a[1]=5.0*lambda+1;
   a[nobs - 1] = 1.0 + lambda;
   a[nobs - 2] = 5.0*lambda + 1.0;
   b[nobs - 2] = -2.0*lambda;
   b[nobs - 1] = 0.0;
   c[nobs - 2] = 0.0;
   c[nobs - 1] = 0.0;
//--- forward
   for(i=0; i<nobs; i++)
     {
      Z=a[i]-H4*H1-HH5*HH2;
      HB=b[i];
      HH1= H1;
      H1 =(HB-H4*H2)/Z;
      b[i]=H1;
      HC=c[i];
      HH2= H2;
      H2 = HC/Z;
      c[i] = H2;
      a[i] = (x[i] - HH3*HH5 - H3*H4) / Z;
      HH3= H3;
      H3 = a[i];
      H4 = HB - H5*HH1;
      HH5= H5; H5 = HC;
     }
//Backward 
   H2 = 0;
   H1 = a[nobs - 1];
   y[nobs-1]=H1;
   for(i=nobs-2; i>=0; i--)
     {
      y[i]=a[i]-b[i] *H1-c[i] *H2;
      H2 = H1;
      H1 = y[i];
     }
  }

Этот код  рассчитывает значения для периода с 0-го бара и до переменной nobs. Как его переделать, для получения значения n баров назад, без учета последних n баров? Т.е. для диапазона n-nobs.

 
Александр:

На просторах форума нашел сглаживающий фильтр Ходрика-Прескотта. Вот его код. 

Этот код  рассчитывает значения для периода с 0-го бара и до переменной nobs. Как его переделать, для получения значения n баров назад, без учета последних n баров? Т.е. для диапазона n-nobs.

Александр:

На просторах форума нашел сглаживающий фильтр Ходрика-Прескотта. Вот его код. 

Этот код  рассчитывает значения для периода с 0-го бара и до переменной nobs. Как его переделать, для получения значения n баров назад, без учета последних n баров? Т.е. для диапазона n-nobs.

Попробуйте массивы сделать побольше, чем

   ArrayResize(a,nobs);
   ArrayResize(b,nobs);
   ArrayResize(c,nobs);

и в циклах for поиграться с индексами. Вот тут есть канал HP для МТ4 и там же ссылка на вариант для МТ5.

Но если надо сглаживать на истории без задержки, как у МА, это плохая идея. HP предназначен именно для работы на текущих котировках. Для сглаживания на истории надо использовать 2-х проходный FIR фильтр. Сначала фильтруете данные n...n+m, а получившуюся последовательность прогоняете через тот же фильтр, но задом наперед. Получится идеальное сглаживание на истории.

 
Alexey Volchanskiy:

Попробуйте массивы сделать побольше, чем

и в циклах for поиграться с индексами. Вот тут есть канал HP для МТ4 и там же ссылка на вариант для МТ5.

Но если надо сглаживать на истории без задержки, как у МА, это плохая идея. HP предназначен именно для работы на текущих котировках. Для сглаживания на истории надо использовать 2-х проходный FIR фильтр. Сначала фильтруете данные n...n+m, а получившуюся последовательность прогоняете через тот же фильтр, но задом наперед. Получится идеальное сглаживание на истории.

Пробовал вариации и с массивами и с циклами - безуспешно.

Задача сглаживания истории не стоит. Цель - отследить перерисовку.

 
Александр:

Пробовал вариации и с массивами и с циклами - безуспешно.

Задача сглаживания истории не стоит. Цель - отследить перерисовку.

Если поставить канал, на который я дал ссылку, на график и подержать его денек, увидите, какой рваный хвост он оставляет за собой. Может это надо? Можно еще в тестере попробовать прогнать в визуальном режиме. Все фильтры без задержек перерисовываются, природу не обманешь.

 
Alexey Volchanskiy:

Если поставить канал, на который я дал ссылку, на график и подержать его денек, увидите, какой рваный хвост он оставляет за собой. Может это надо? Можно еще в тестере попробовать прогнать в визуальном режиме. Все фильтры без задержек перерисовываются, природу не обманешь.

Это конечно так. И в тестере все работает как надо. Но, хочется иметь значения сразу после установки индикатора на график для любого интересующего периода, а не спустя какое-то время.

Обманывать никого не собираюсь, просто хочу рассчитать интересующие меня значения.

 

Попробовал в качестве входного массива значений x[] подать предварительно "обрезанный" до нужного элемента массив x1[] и тоже ничего не получается ((.

Линия просто пропадает с графика.

В чем прикол?

 

Получилось.

Если кому-то пригодиться, можете пользоваться.

Файлы:
HP_Line.mq4  10 kb
 
Александр:

На просторах форума нашел сглаживающий фильтр Ходрика-Прескотта. Вот его код. 

Никогда о таковом не слышал.) Благодаря Вам и Гуглу познакомился поближе. Имхо, не лучше и не хуже других методов сглаживания и выявления тенденций. Каких либо преимуществ не имеет. Полиномиальная регрессия предпочтительней.

 

Привет!

в век электронных торгов - "сглаживание" - это с дубинками идти в бой против танков.

Рынок нынче фрагментирован, поэтому лучше наоборот искать методы -"де-сглаживания".

 
Alexander Ivanov:

Привет!

в век электронных торгов - "сглаживание" - это с дубинками идти в бой против танков.

Рынок нынче фрагментирован, поэтому лучше наоборот искать методы -"де-сглаживания".

Давай, привели пример вычисления скорости изменения цены "методом де-сглаживания". А потом и ускорения. Языком важно звиздеть - не мешки ворочать ))

 
вам дал общую философию тенденции.

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