Не вижу запаздывания у мувинга. Это значит, автор не понимает, что выставил, или в алгоритме ошибка и индикатор перерисовывает.
Запаздывания нет, поскольку в общем то это не мувинг. Для заданного ряда решается проблема по минимизации функции. Естественно когда ряд движется, если длинна ряда мала, будет перерисовывать с появлением новой информации, особенно если всплески. Описание фильтра на http://en.wikipedia.org/wiki/Hodrick-Prescott_filter
В принципе данная функция есть в МА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 (нижнее уравнеие):
Получается, что экспоненциальная средняя является самой гладкой из всех возможных мувингов!
Получается, что экспоненциальная средняя является самой гладкой из всех возможных мувингов
Да, есть статья по теме.
Не делал по статье, но, развивая ту же идею гладкости ema, можно получить хорошую гладкость:
Синяя - EMA15 с запаздыванием 5.
Красная - более гладкая MA с тем же запаздыванием.
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Здравствуйте, уважаемые программисты!
Кто возьмется решить, я думаю простенькую задачку по написанию индюка? Необходимо написать индюк, который бы фильтровал ряд фильтром Ходрика-Прескота. В принципе данная функция есть в МАTLAB, если я не ошибаюсь из нее можно сделать DLL, используя матлабовский компилятор. Соответственно, создать индюк, который обращался бы к этой Dll. На вход подавать следующие параметры длинну ряда, параметр сглаживания. На выходе получаем трендовую компоненту (рисуем на графике) и циклическую компоненту (осцилятор).
Сам сделать не могу, потому как и в MATLAB Compiler и MQL4 не разбираюсь.
На графике разложение для евродоллар H4 . Как видно практически на всей истории особенность движения цены заключалась в том, что после пробития тренда, цена двигалась на расстояние, равное разнице между предыдущим экстремумом и трендом, короче амплитуда практически одинакова. Исключение последние данные, но там экстрим. В принципе такой индюк, должен перерисовывать, если количество точек данных мало, однако если их увеличивать скажем до 2000, то проблем с перерисовкой думаю не возникнет.