Обобщенный мувинг - для разработчиков

 
Так как на mql4.com у меня ничего не отправляется, дублирую здесь свой вопрос:

Трудно ли сделать МА "в общем виде" - с самыми общими весовыми коэффициентами, заданными, скажем, некоторым массивом как параметр функции? Это что-то типа

double iCommonMA(string symbol, int timeframe, double weights[], int ma_shift, int applied_price, int shift)

Здесь массив weights[] - это заранее формируемый числовой массив, типа weights[8]={64/204, 49/204, 36/204, 25/204, 16/204, 9/204, 4/204, 1/204}. Это квадратично взвешенный мувинг. Ненужные параметры - period и ma_method - я уже убрал. Количество элементов массива автоматически определяет период.

Ну и аналогичная функция - для произвольного массива:

double iCommonMAOnArray(double array[], double weights[], int total, int ma_shift, int shift)

Дальнейшее развитие идеи - линейный фильтр в общем виде.
 
В МТ4 уже не получится, к сожалению. А в будущем посмотрим.
 
Тогда вопрос на засыпку :) :
Как будет выглядеть матрица для EMA и SMMA сглаживания?
 
Хорошие вопросы, Rosh, но не на засыпку.

Во-первых, обратная совместимость софта требует сохранения прежних функций мувингов. Иначе 90% трейдеров съедят метаквоты с потрохами из-за необходимости снова переделывать советники с iMA().

Во-вторых, если тебе действительно интересны векторы весов для этих МА (ради прикола), то подход может быть таким:

Если параметр затухания в экспоненциальном существенно меньше единицы, то вполне можно ограничиться несколькими старшими весами. При затухании 0.6 будет так: weights[] = { 0.4, 0.4*0.6, 0.4*0.6^2, 0.4*0.6^3, ... } . Достаточно остановиться на 19-й степени, чтобы остаток ряда был меньше 10^(-4). Да, многовато, конечно. Ну а если параметр совсем близок к 1 (скажем, 0.9), то можно вызвать и стандартную функцию.

Для SMMA немного сложнее, так как я пока не разбирался в алгоритме этого мувинга. Но, кажется, там все равно используется конечное число баров, так ведь? Значит, и массив weights[] тоже будет конечным. SMMA - это не то же самое, что мувинг от мувинга?

Эти две функции я предложил только в качестве дополнения к имеющимся, а не их замены. Очевидно, что можно придумать миллион линейных фильтров, не сводимых к стандартным метаквотовским. Понятно, что предлагаемая функция не будет оптимизирована по вычислениям, так как в ней не заложена рекуррентная структура вычислений, которая видна в коде индюкатора Moving Averages.
 
Я так и предполагал, что будет предложено ограничиться конечным числом весов. Но предварительно придется провести доказательство о достаточности для мувинга EMA(12) массива весов с 18 коэффициентами, а остальными пренебречь. В общем, как задачка для по математике хорошо, но практически я все равно буду пользоваться страрым проверенным алгоритмом. :)
 
Для SMMA немного сложнее, так как я пока не разбирался в алгоритме этого мувинга. Но, кажется, там все равно используется конечное число баров, так ведь? Значит, и массив weights[] тоже будет конечным. SMMA - это не то же самое, что мувинг от мувинга?


Это сглаженная скользящая средняя, предложенная 30 лет назад Wilder'ом в книге "Новые концепции ...." . Зачастую между EMA и SMMA ставят знак равенства, то есть, говорять, что используют экспоненциальное сглаживание, а на деле применяют SMMA . Я это объясняю для себя тем, что этим авторам оба алгоритма кажутся одинаково сложны и не понятны, и поэтому "если нет никакой разницы - зачем называть по другому?" :)
 
практически я все равно буду пользоваться страрым проверенным алгоритмом. :)

Ну конечно, индюкатор-то все равно останется.

А доказательство для EMA несложное: если p[0], p[1], p[2], ... p[N] - цены, взятые для вычисления ЕМА, то достаточно, чтобы весь кусок бесконечного ряда, начиная с p[N+1], был ограничен, скажем, 0.0001 для EURUSD. Но этот кусок сверху оценивается как pmax * (1-alpha) * (alpha^(N+1) + alpha^(N+2) + alpha^(N+3) +...) = pmax * alpha^(N+1). Здесь pmax - максимальная историческая цена, а alpha - затухание.

И еще, Rosh: правда ли, что SMMA - это мувинг от мувинга?

P.S. ОК, попытаюсь разобраться. Основная идея все равно была очень простой, просто за формулами ее не видно...

P.P.S. Я потрясен: для проверенных мной N SMMA(N) и EMA(2*N-1) идентичны, не считая начальных исторических баров. Во всяком случае, на чартах это так. Осталось только провести строгое доказательство :)
 
Нет, SMMA - это не мувинг от мувинга. Элдер пишет (а может и Найман. не помню)
, что главный недостаток простого мувинга - собака лает дважды. Например, имеем простую скользящую с периодом 10. Предположим, что бар с индексом 9 имеет какое-то экстремальное значение, которое сильно отличается от остальных 9-ти (High[8], High[7]...High[1] и High[0]) . Когда к нам приходит новый бар, который также не сильно отличается от этих девяти баров, последний экстремальный бар вылетает из расчетов, и мувинг ни стого ни с чего резко дергается. Это на расчет простой скользящей повлияло выбывание из расчета экстремального значения.

Теперь SMMA (сглаженная скользящая средняя - https://www.metatrader5.com/ru/terminal/help/indicators/trend_indicators/ma) . Предположим, что у нас уже есть значение этого мувинга на предыдущем баре, SMMA(i+1). Tеперь для нового значения Value[i] необходимо вычислить SMMA(i) . Для этого мы вычисляем средний вклад каждого бара (пусть мы опять расчитываем 10-ти периодный мувинг) равный SMMA(i+1)/10 и выбрасываем его из предыдущего значения чтобы получить сумму без него - (Period-1)*SMMA(i+1) = (Period-1)*SMMA(i+1). К этому остатку прибавим новое значение и от этой суммы возбмем среднее : SMMA(i)=[(Period-1)*SMMA(i+1)+Value(i)]/Period.

Остался пустяк - найти значения SMMA для первых Period значений. Но это такая же задача, что и для запуска расчета EMA :)
 


P.P.S. Я потрясен: для проверенных мной N SMMA(N) и EMA(2*N-1) идентичны, не считая начальных исторических баров. Во всяком случае, на чартах это так.


"И гений - парадоксов друг" (с) :)

http://forum.alpari-idc.ru/showthread.php?t=25916&highlight=%E4%E2%F3%F5+%EC%F3%E2%E8%ED%E3%E0%F5
 
Yesssss! Rosh, я строго доказал идентичность рекуррентных формул именно при таких соотношениях периодов! Сравни ( i-й - это следующий исторический бар после (i-1)-го, а не предыдущий! ):

smma[ i ] = ( 1 - 1 / SMMAPeriod ) * smma[ i - 1 ] + 1 / SMMAPeriod * Close[ i ]
ema[ i ]  = ( 1 - alpha ) * ema[ i - 1 ] + alpha * Close[ i ]


Здесь alpha = 2 / ( EMAPeriod + 1 )

Отсюда обе формулы получаются идентичными, если EMAPeriod = 2 * SMMAPeriod - 1.

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


 
Yesssss! Rosh, я строго доказал идентичность рекуррентных формул именно при таких соотношениях периодов! Сравни ( i-й - это следующий исторический бар после (i-1)-го, а не предыдущий! ):

smma[ i ] = ( 1 - 1 / SMMAPeriod ) * smma[ i - 1 ] + 1 / SMMAPeriod * Close[ i ]
ema[ i ]  = ( 1 - alpha ) * ema[ i - 1 ] + alpha * Close[ i ]


Здесь alpha = 2 / ( EMAPeriod + 1 )

Отсюда обе формулы получаются идентичными, если EMAPeriod = 2 * SMMAPeriod - 1.

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



Да, я сразу увидел по твоему посту связь между EMA(10) и SSMA(2*10-1). А если еще и математика подтвердила - то все равно удивительно малое число ложных входов :) [Правда я проверял только частный случай].
Причина обращения: