Алгоритм работы EMA и SMMA - страница 2

 

Mathemat

Практически все источники в интернете указывают следующий алгоритм:

1. Берется цена первого* бара (с учетом периода).

2. А уже последующие* элементы расчитываются от него (бар+период).

Если источники неверны или я ошибся в интерпритации, объясните, пожалуйста, правильный алгоритм вычисления.

И остановитесь подробнее, для чего тогда вообще нужен параметр Период, если расчет будет вестись с нулевого бара всей истории.

И кстати, как расчитывается первый бар истории в правильном алгоритме.

Спасибо.

 

есть подозрение, что встроенная ема считаецо как-то так:

double EMA(int N,int Bar)
   {
   double EMA=0.0,summ=0.0,k=2.0/(N+1),kk=(N-1.0)/(N+1);
   for(int i=0;i<Bars-Bar-1;i++)
      {
      EMA+=k*Close[Bar+i];
      summ+=k;
      k*=kk;
      if(1.0-summ<0.00000001) break;
      }
   if(1.0-summ>0.00000001) EMA+=(1.0-summ)*Close[Bars-1];
   return(EMA);
   }
 

Swan

Огромное вам спасибо!

Выборочно потестил на результатах... 100% совпадение на 0-14 периодах + все таймфреймы.

Применять уже сейчас смогу, остается только "для себя" понять ее принцип. =)

Кстати, вопрос к общественности такой...

Нахожусь в процессе написания МТС на основе пересечения двух машек.

Примитивное тело с сигналами на пересечение уже готово.

Осталось провести анализ сочетаний быстрой и медленной скользящих.

Для этой цели написал многопоточное приложение по перебору комбинаций с моделирование на истории каждой пары на предмет двух составляющих:

1. коэффициент "общее кол-во сделок к профитным"

2. общий профит.

Не подскажете, какие взять параметры, чтобы было, так сказать, с запасом?

Пока склоняюсь к следующим условиям:

1. Период 1 - 14 (минимальное сближение быстрой и медленной - 4).

2. Три метода - SMA/EMA/LWMA.

3. Семь цен - close, open...

4. Сдвиг 0 -14.

5. Люфт (допуск пересечения до разворота тренда) 0-20.

Может, какой диапазон расширить?

И еще вопрос, есть ли интересные идеи относительно расчета динамического люфта (как мне думается, в зависимости от волатильности)?

 
зы: исправил чуть-чуть, а то в начале графика было не правильно.
 

Картинка для ЕМА, рассчитываемой, начиная с 300-ого бара

Видно, что сначала отличие большое, потом оно все меньше и меньше.

На этой картинке- две машки периода 13.

Видно, что для визуального совпадения нужно, чтобы расчет

происходил хотя бы на ~60 барах.

.

В приложении - индикатор машка на скорую руку, позволяющий считать

начиная с бара Bars (поставьте WantBars=0) либо с бара № 300 (WantBars=300).

На картинке именно эти два индикатора. Период = 13.

.

.

Был вопрос про кол-во баров (почему надо в разы больше, чем период машки).

Вот, собственно, ответ.

.

Т.е. в общем случае для ЕМА, чтобы получить значение на конкретном баре,

нужно считать полностью весь буфер индикатора.

.

Файлы:
 

jartmailru

Спасибо за пояснение.

Это ж какие накладные расходы - при каждом вызове iMA(EMA) пересчитывать всю историю!

Swan

Прогнал скриптик по всем таймфреймам:

M1: Bar count = '65002', delta_new = '96', delta_old = '188'.
M5: Bar count = '65000', delta_new = '69', delta_old = '159'.
M15: Bar count = '65000', delta_new = '87', delta_old = '173'.
M30: Bar count = '65000', delta_new = '77', delta_old = '166'.
H1: Bar count = '63787', delta_new = '74', delta_old = '161'.
H4: Bar count = '16041', delta_new = '18', delta_old = '105'.
Daily: Bar count = '2679', delta_new = '2', delta_old = '84'.
Weekly: Bar count = '538', delta_new = '0', delta_old = '84'.
Monthly: Bar count = '250', delta_new = '0', delta_old = '84'.

где "Bar count" - количество баров истории, на которых проводился тест.

"delta_new" - количество баров, на которых значения вашего кода (версия 2.0) не сошлись со значениями iMA(EMA).

"delta_old" - количество баров, на которых значения вашего кода (версия 1.0) не сошлись со значениями iMA(EMA).

Визуально, расхождения не превышают один пункт (=1*Point).


Еще раз выражаю вам огроменную благодарность за код!

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