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

 

Здравствуйте, уважаемые программисты!

Кто возьмется решить, я думаю простенькую задачку по написанию индюка? Необходимо написать индюк, который бы фильтровал ряд фильтром Ходрика-Прескота. В принципе данная функция есть в МАTLAB, если я не ошибаюсь из нее можно сделать DLL, используя матлабовский компилятор. Соответственно, создать индюк, который обращался бы к этой Dll. На вход подавать следующие параметры длинну ряда, параметр сглаживания. На выходе получаем трендовую компоненту (рисуем на графике) и циклическую компоненту (осцилятор).

Сам сделать не могу, потому как и в MATLAB Compiler и MQL4 не разбираюсь.

На графике разложение для евродоллар H4 . Как видно практически на всей истории особенность движения цены заключалась в том, что после пробития тренда, цена двигалась на расстояние, равное разнице между предыдущим экстремумом и трендом, короче амплитуда практически одинакова. Исключение последние данные, но там экстрим. В принципе такой индюк, должен перерисовывать, если количество точек данных мало, однако если их увеличивать скажем до 2000, то проблем с перерисовкой думаю не возникнет.

 
Constantin писал(а) >>

На графике разложение для евродоллар H4 . Как видно практически ...

Не видно. Который тут график ?

 

 
Не вижу запаздывания у мувинга. Это значит, автор не понимает, что выставил, или в алгоритме ошибка и индикатор перерисовывает.
 
Neutron >>:
Не вижу запаздывания у мувинга. Это значит, автор не понимает, что выставил, или в алгоритме ошибка и индикатор перерисовывает.

Запаздывания нет, поскольку в общем то это не мувинг. Для заданного ряда решается проблема по минимизации функции. Естественно когда ряд движется, если длинна ряда мала, будет перерисовывать с появлением новой информации, особенно если всплески. Описание фильтра на http://en.wikipedia.org/wiki/Hodrick-Prescott_filter

 
Constantin писал(а) >>

В принципе данная функция есть в МАTLAB, если я не ошибаюсь из нее можно сделать DLL, используя матлабовский компилятор. Соответственно, создать индюк, который обращался бы к этой Dll.

Я думаю, мир устроен проще чем черех dll.

Вот функцирнал, который необходимо минимизировать для построения этого цифрового фильтра:

Видно, что в такой постановке, фильтр может работать только на исторических данных, т.к. для вычисления значения трендовой линии в текущее время необходимо знание не только предыдущих значений этого тренда, но и одного на шаг вперёд t[i+1]. Такой фильтр на истории покажет точное совпадение гладкой кривой с котиром (то, что топикстартер и привёл в первом посту в качестве демонстрации), а на правом краю котира будет перерисовывать безбожно.

Вот, что ещё нарыл в инете:

Готового рецепта для построения этого фильтра я не смог найти. Собственно, возьмём и построим функционал для правого края ВР сами (верхнее уравнение).

Возьмём от него производную по параметру y[0] - текущее значение и приравняв её к нулю, сразу получим рекурентное выражение для искомого НР-фильтра (нижнее уравнение). Посмотрим, как зависят сглаживающие свойства фильтра от параметра сглаживания w:

Тут, зелёная линия котир, черная - w=0.5 и т.д. Видно, что всё работает правильно - есть неизбежная фазовая задержка, которая тем больше, чем сильнее сглаживание и правый край не перерисовывает. Можно теперь закодить и на MQL.

//+------------------------------------------------------------------+
//| Moving Average HP.mq4 |
//| Code by Neutron |
//+------------------------------------------------------------------+
#property indicator_chart_window
#property indicator_color1 Blue
#property indicator_width1 3
extern double w=0.1;
int Start,i,m;
double MA[5000],Y[5000];
int start()
{
Start=5000;
MA[Start]=Open[Start];
MA[Start-1]=Open[Start-1];
for (i=Start-2;i>=0;i--) MA[i]=w*(Open[i]-2.*MA[i+1]+MA[i+2])+2.*MA[i+1]-MA[i+2];
}
int init()
{
SetIndexStyle(0,DRAW_LINE);
SetIndexBuffer(0,MA);
return(0);
}

Вот как получилось:

Синяя - НР, зелёная - котир, красная - фильтр Ваттероута 2-го порядка (для сравнения).

Действительно, этот фильтр старается честно ловить линейные тренды. По другому и быть не должно, посмотрите на функционал в верху поста, там видно, что помимо требования минимизации отклонения мувинга от котира (первая сумма), накладвается требование на минимизацию второй производной (вторая сумма)! А ведь, вторая производная от линии равна нулю, и требование её минимизации, равносильно требованию максимального стремления к линии тренда для произвольного входного вектора данных. Подход мне понравился.

P.S. Это интересно, если в выражении для функционала потребывать инимизации не второй, а первой производной (верхнее уравнение), то получим рекурентную формулу мувинга для экспоненциальной средней EMA (нижнее уравнеие):

Получается, что экспоненциальная средняя является самой гладкой из всех возможных мувингов!

 

Вот как выглядит осцилятор (синяя линия) на основе этого НР-фильтра (красная):

Уже можно пробывать торговать:-)

Покупаем, когда уровень осцилятора выше нуля, продаём - ниже. Индикатор в Attach.

Файлы:
difhp.mq4  1 kb
 
Neutron писал(а) >>

Получается, что экспоненциальная средняя является самой гладкой из всех возможных мувингов

Да, есть статья по теме.

Не делал по статье, но, развивая ту же идею гладкости ema, можно получить хорошую гладкость:

Синяя - EMA15 с запаздыванием 5.

Красная - более гладкая MA с тем же запаздыванием.

Файлы:
stan.zip  147 kb
 
НР клоуз, УГКОЗН М1,
красная =1600
голубая =100
желтая = ЕМА 14, клоуз.
 
Korey >>:
УГКОЗН

УГКОЗН - это пять! втыкал наверное секунд 10, что это такое. :) ещё вариант - УГКГЫВ

 
дык, JPY- неззя, (на сайте замечены дэвушки)
Причина обращения: