English 中文 Español Deutsch 日本語 Português 한국어 Français Italiano Türkçe
Индикаторы и торговые системы Уильяма Блау на MQL5. Часть 1: Индикаторы

Индикаторы и торговые системы Уильяма Блау на MQL5. Часть 1: Индикаторы

MetaTrader 5Торговые системы | 22 апреля 2011, 11:18
19 012 4
Andrey F. Zelinsky
Andrey F. Zelinsky


Использование технического анализа в биржевой торговле может быть успешным, только если трейдер обладает рядом необходимых качеств.  К таким качествам трейдера я бы отнес: его опыт, трезвый расчет и умение пользоваться математическими методами, реализованными в хорошей компьютерной торговой программе.

Уильям Блау


Введение

Первая часть статьи "Индикаторы и торговые системы Уильяма Блау на MQL5. Часть 1: Индикаторы" - это описание разработанных на MQL5 индикаторов и осцилляторов, которые описаны в книге Уильяма Блау (William Blau) "Моментум, направленность и расхождение".

Описанные в статье индикаторы и осцилляторы приведены в исходном коде на языке MQL5 в прикрепленном к статье архивном файле "Blau_Indicators.zip".

Основные положения анализа по Уильяму Блау

Технический анализ Уильяма Блау состоит из четырех этапов:

  1. По данным ценового ряда (период q) рассчитывается показатель; строится график показателя. График показателя не отражает основную тенденцию ценового движения и не выделяет поворотные точки.
  2. Полученный показатель сглаживается методом EMA один раз (период r), второй (период s), третий (период u); строится график сглаженного показателя. График сглаженного показателя достаточно точно и с минимальным запаздыванием аппроксимирует (воспроизводит) колебания ценовой кривой, выделяет тенденцию ценового движения и поворотные точки, устраняет ценовой шум.
  3. Сглаженный показатель нормируется; строится график нормированного сглаженного показателя (индикатор). Нормировка позволяет значение индикатора интерпретировать как степень перекупленности или перепроданности рынка.
  4. Нормированный сглаженный показатель (индикатор) сглаживается методом EMA один раз (период ul); строится осциллятор - график индикатора и сигнальной линии, добавляются уровни перекупленности и перепроданности рынка. Осциллятор позволяет различать сигналы о перекупленности/перепроданности рынка, об окончании тренда и о развороте ценового движения.

Индикаторы

В статье рассмотрены следующие группы индикаторов:

  1. Индикаторы, основанные на моментуме:
  2. Индикаторы, основанные на стохастике:
  3. Индикаторы, основанные на стохастическом моментуме:
  4. Индикаторы, основанные на отклонении от тенденции развития рынка:
  5. Индикаторы, основанные на схождении/расхождении скользящих средних:
  6. Индикаторы, основанные на моментуме свечи:
  7. Индикаторы, основанные на сложном моментуме по максимумам и минимумам:

По каждой группе индикаторов представлены:

  • Индикатор сглаженного показателя;
  • Индекс нормированного сглаженного показателя;
  • Осциллятор, основанный на индексе нормированного сглаженного показателя.

В разделе "Индекс истинной силы" представлено:

  • Детальный анализ подхода Уильяма Блау в техническом анализе графика цены;
  • Детальное описание алгоритма и программного кода каждого индикатора из группы индикаторов, основанных на моментуме.

В качестве метода сглаживания Уильям Блау использует экспоненциальное скользящее среднее (англ. Exponential Moving Average, EMA). Экспоненциальное скользящее среднее определяется путем добавления к предыдущему значению скользящего среднего определенной доли текущей цены.

При использовании экспоненциальных скользящих средних больший вес имеют последние цены. Функция расчета EMA:

EMA(k,n) = EMA(k-1,n) + 2/(n+1) * (price(k) - EMA(k-1,n))
         = price(k) * 2/(n+1) + EMA(k-1,n) * (1 - 2/(n+1))

где:

  • EMA(k,n) - экспоненциальное скользящее среднее периода n на момент периода k;
  • price(k) - цена на момент периода k.

В "Руководстве пользователю к клиентскому терминалу MetaTrader" в разделе "Аналитика/Технические индикаторы/Трендовые индикаторы/Moving Average" представлено описание четырех видов скользящих средних и методов их использования в техническом анализе (см. также iMA).

Библиотека функций

Библиотека функций для расчета скользящих средних расположена в файле <MovingAverages.mqh>. Нас интересует функция ExponentialMAOnBuffer(), которая заполняет выходной массив buffer[] значениями EMA от входного массива price[]. Однако, представленная в <MovingAverages.mqh> реализация функции ExponentialMAOnBuffer(), имеет тот недостаток, что не работает с периодом n=1.

См. в исходном коде:

if(period<=1 || rates_total-begin<period) return(0);

Однако Уильям Блау в своей книге использует период сглаживания n=1 как отсутствие сглаживания. Поэтому в код функции ExponentialMAOnBuffer() были внесены изменения:

if(period<1 || rates_total-begin<period) return(0);

и получилась функция ExponentialMAOnBufferWB(). Код этой функции расположен в файле "WilliamBlau.mqh".

В файле "WilliamBlau.mqh" также представлены функции:

  • Функция PriceName() возвращает наименование типа цены:
string PriceName(
                 const int applied_price // тип цены
                )
  • Функция CalculatePriceBuffer() рассчитывает массив цен указанного типа цены:
int CalculatePriceBuffer(
                         const int applied_price,   // тип цены
                         const int rates_total,     // размер входных таймсерий
                         const int prev_calculated, // обработано баров на предыдущем вызове
                         const double &Open[],      // массивы Open[]
                         const double &High[],      // High[]
                         const double &Low[],       // Low[]
                         const double &Close[],     // Close[]
                         double &Price[]           // рассчитываемый массив цен
                        )

Ценовая база и временной период ценового графика

Уильям Блау рассматривает цены закрытия и дневной период. Разработанные в рамках статьи индикаторы позволяют выбирать ценовую базу (см. ценовые константы), временной период ценового графика определяется таймфреймом графика (см. периоды графиков).

 

1. Индекс истинной силы

Рассматриваемые индикаторы (см. вложение):

  1. Blau_Mtm.mq5 - индикатор темпа (q-периодный моментум; сглаженный q-периодный моментум);
  2. Blau_TSI.mq5 - индекс истинной силы (нормированный сглаженный q-периодный моментум);
  3. Blau_Ergodic.mq5 - эргодический осциллятор (основан на индексе истинной силы).

1.1. Моментум

В "Руководстве пользователю к клиентскому терминалу MetaTrader" в разделе "Аналитика/Технические индикаторы/Осцилляторы/Momentum" представлено описание встроенного в клиентский терминал MetaTrader 5 технического индикатора темпа (Momentum) и способов его использования в техническом анализе (см. также iMomentum) В отличие от моментума Уильяма Блау, встроенный в терминал индикатор iMomentum рассчитывает моментум как абсолютное изменение цены.

Пример реализации на MQL5 индикатора истинной силы (TSI) Уильяма Блау представлен в статье "Как написать индикатор в MQL5".


1.1.1. Технический анализ с использованием индикатора темпа (моментум)

Объектом технического анализа служит график цены финансового инструмента. Каждый элемент графика - это ценовой бар. Параметры ценового бара: время открытия, цена открытия, максимальная цена, минимальная цена, цена закрытия, торговые объемы и другие. Ценовой бар формируется и отражает поведение цены в течение некоторого дискретного периода времени (таймфрейм графика).

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

Что предложил Уильям Блау. Первое: моментум. Уильям Блау рассчитал моментум как относительное изменение цены [закрытия] за каждый [дневной] период времени; построил индикатор темпа (моментум). С математической точки зрения функция моментума - это первая производная функции цены.

Индикатор темпа (моментум; q-периодный моментум)

Рис. 1.1. Индикатор темпа (моментум; q-периодный моментум)

Моментум отображает однопериодные ценовые колебания, показывает скорость (величину) и направление изменения цены за период, но не отражает основную тенденцию ценового движения и не выделяет поворотные точки.

Второе: сглаживание. Скользящее среднее от моментума (накопленная сумма однопериодных ценовых колебаний) практически точно воспроизводит как основные так и локальные колебания кривой цены. На рис. 1.2(a) в подокнах I, II представлены индикаторы темпа (сглаженный моментум) с периодами скользящего среднего, соответственно 20, 300.

Чем выше период скользящего среднего, тем точнее сглаженный моментум аппроксимирует (воспроизводит) колебания кривой цены. С математической точки зрения функция сглаженного моментума - это интеграл функции моментума, или восстановленная функция цены.

Индикатор темпа (сглаженный q-периодный моментум)

Рис. 1.2(a). Индикатор темпа (сглаженный q-периодный моментум)


Индикатор темпа (сглаженный q-периодный моментум)

Рис. 1.2(b). Индикатор темпа (сглаженный q-периодный моментум)


На рис. 1.2(a) в основном окне представлены индикаторы EMA с периодами 5, 20, 100. Незначительное увеличение периода скользящего среднего порождает запаздывание, и скользящее среднее практически становится неспособным воспроизводить колебания кривой цены.

Третье: повторное сглаживание. Первое сглаживание моментума выделяет основную тенденцию ценового движения, а также поворотные точки, но не устраняет ценовой шум. Для устранения ценового шума необходимо повторное сглаживание с малым периодом скользящего среднего.

На рис. 1.2(b) в подокне I представлен индикатор сглаженного моментума (период скользящего среднего 20); в подокнах II и III представлены индикатор дважды и трижды сглаженного моментума (периоды скользящего среднего 5, 3). Повторное сглаживание устраняет ценовой шум, но добавляет незначительный сдвиг кривой (запаздывание).

Четвертое: расхождение как сигнал о смене тенденции. При сглаживании моментума с малым периодом скользящего среднего может возникнуть расхождение тенденции кривой сглаженного моментума с тенденцией кривой цены.

На рис. 1.2(a) расхождение наблюдается на графике в подокне I, а на рис. 1.2(b) - в подокнах I, II, III (направление изменения цены расходится с направлением изменения сглаженного моментума). Подобные расхождения часто свидетельствуют о смене тенденции. С математической точки зрения расхождение - это функция от периода сглаживания.

Надежность интерпретации расхождения как сигнала о смене тенденции можно повысить, если рассматривать расхождение только в области перекупленности или перепроданности рынка (см. п. 1.2.1).


1.1.2. Определение моментума

Моментум (Momentum) - это относительное однопериодное изменение цены.

Знак моментума показывает направление изменения цены: положительный моментум - цена выросла за период, отрицательный - цена снизилась за период. Величина моментума - это относительная скорость изменения цены (первая производная от цены).

Определение моментума

Рис. 1.3. Определение моментума

Формула моментума:

mtm(price) = price - price[1]

где:

  • price - цена [закрытия] текущего периода;
  • price[1] - цена [закрытия] предыдущего периода.

Уильям Блау рассматривает моментум, как разницу между ценой [закрытия] текущего периода и ценой [закрытия] предыдущего периода. Уильям Блау, при расчете однопериодного моментума использует цены двух периодов (текущего и предыдущего периодов).

Введем в формулу расчета моментума показатель периода q - число временных периодов, участвующих в расчете (по Уильяму Блау q=2).

Формула q-периодного моментума:

mtm(price,q) = price - price[q-1]

где:

  • q - число временных периодов ценового графика, участвующих в расчете моментума;
  • price - цена [закрытия] текущего периода;
  • price[q-1] - цена [закрытия] (q-1) периодов назад.

В полученной формуле двухпериодному нашему моментуму соответствует однопериодный моментум Уильяма Блау.

Формула сглаженного q-периодного моментума:

Mtm(price,q,r,s,u) = EMA(EMA(EMA( mtm(price,q) ,r),s),u)

где:

  • price - цена [закрытия] - ценовая база ценового графика;
  • q - число временных периодов ценового графика, участвующих в расчете моментума;
  • mtm(price,q)=price-price[q-1] - q-периодный моментум;
  • EMA(mtm(price,q),r) - первое сглаживание - экспоненциальная скользящая средняя (экспонента) периода r, примененная к q-периодному моментуму;
  • EMA(EMA(...,r),s) - второе сглаживание - экспонента периода s, примененная к экспоненте периода r;
  • EMA(EMA(EMA(...,r),s),u) - третье сглаживание - экспонента периода u, примененная к результату второго сглаживания.

1.1.3. Mtm(price,q,r,s,u) - индикатор темпа (моментум). Спецификация
  • Имя файла: Blau_Mtm.mq5
  • Наименование: Индикатор темпа (q-периодный моментум; сглаженный q-периодный моментум) по Уильяму Блау.
  • Входные параметры:
    • q - период, по которому вычисляется моментум (по умолчанию q=2);
    • r - период 1-й EMA, применительно к моментуму (по умолчанию r=20);
    • s - период 2-й EMA, применительно к результату первого сглаживания (по умолчанию s=5);
    • u - период 3-й EMA, применительно к результату второго сглаживания (по умолчанию u=3);
    • AppliedPrice - тип цены (по умолчанию AppliedPrice=PRICE_CLOSE).
  • Дополнительно:
    • выводится в отдельном окне;
    • изменить стиль отрисовки графического построения - цвет, толщину, стиль линии (вкладка "Цвета").
  • Ограничения:
    • q>0;
    • r>0, s>0, u>0. Если r, s или u равны 1, то на соответствующем периоде EMA сглаживание не выполняется. Например, если задать Mtm(price,2,20,5,1), то получится дважды сглаженный моментум, а если задать Mtm(price,2,1,1,1), то получится несглаженный моментум;
    • минимальный размер массива цен =(q-1+r+s+u-3+1).

 

1.2. Индекс истинной силы

1.2.1. Технический анализ с использованием индекса истинной силы

Продолжение: начало см. в п. 1.1.1.

Пятое: нормировка. Приведение через нормировку величин сглаженного моментума к единичному масштабу (отображение в интервале [–1,+1]) позволяет определять степень перекупленности или перепроданности рынка. Доумножение величин нормированного сглаженного моментума на коэффициент 100 преобразовывает числовой ряд в процентный ряд (отображение в интервале [–100,+100]).

Индикатор нормированного темпа (нормированный сглаженный моментум)

Рис. 1.4. Индикатор нормированного темпа (нормированный сглаженный моментум)


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


1.2.2. Определение индекса истинной силы

Индекс истинной силы (True Strength Index, TSI) - это индикатор нормированного темпа (нормированный сглаженный q-периодный моментум). Приведение величин сглаженного моментума к единичному масштабу (отображение в интервале [–1,+1]) обеспечивается нормировкой каждой величины сглаженного моментума (накопленная сумма сглаженных q-периодных ценовых колебаний) на величину сглаженного моментума, взятую по абсолютному значению.

Доумножение на коэффициент 100 изменяет интервал отображения [–100,+100] (проценты). Нормировка позволяет значение TSI интерпретировать как степень перекупленности (положительное значение) или перепроданности (отрицательное значение) рынка.

Формула индекса истинной силы:

                     100 * EMA(EMA(EMA( mtm(price,q) ,r),s),u)         100 * Mtm(price,q,r,s,u)
TSI(price,q,r,s,u) = –––––––––––––––––––––––––------–––––––––– = ––––––––––––––––------–––––––––––––––
                       EMA(EMA(EMA( |mtm(price,q)| ,r),s),u)     EMA(EMA(EMA( |mtm(price,q)| ,r),s),u)
если EMA(EMA(EMA(|mtm(price,q)|,r),s),u)=0, то TSI(price,q,r,s,u)=0

где:

  • price - цена [закрытия] - ценовая база ценового графика;
  • q - число временных периодов ценового графика, участвующих в расчете моментума;
  • mtm(price,q)=price-price[q-1] - q-периодный моментум;
  • |mtm(price,q)| - абсолютное значение q-периодного моментума;
  • Mtm(price,q,r,s,u) - трижды сглаженный q-периодный моментум;
  • EMA(...,r) - первое сглаживание - экспоненциальная скользящая средняя (экспонента) периода r, примененная к показателю [соответственно: 1) к q-периодному моментуму и 2) к абсолютному значению q-периодного моментума];
  • EMA(EMA(...,r),s) - второе сглаживание - экспонента периода s, примененная к экспоненте периода r;
  • EMA(EMA(EMA(...,r),s),u) - третье сглаживание - экспонента периода u, примененная к результату второго сглаживания.

1.2.3. TSI(price,q,r,s,u) - индекс истинной силы. Спецификация
  • Имя файла: Blau_TSI.mq5
  • Наименование: Индекс истинной силы (нормированный сглаженный q-периодный моментум) по Уильяму Блау.
  • Входные параметры:
    • q - период, по которому вычисляется моментум (по умолчанию q=2);
    • r - период 1-й EMA, применительно к моментуму (по умолчанию r=20);
    • s - период 2-й EMA, применительно к результату первого сглаживания (по умолчанию s=5);
    • u - период 3-й EMA, применительно к результату второго сглаживания (по умолчанию u=3);
    • AppliedPrice - тип цены (по умолчанию AppliedPrice=PRICE_CLOSE).
  • Дополнительно:
    • выводится в отдельном окне;
    • изменить стиль отрисовки графического построения - цвет, толщину, стиль линии (вкладка "Цвета");
    • (не обязательно) два уровня (по умолчанию –25 и +25) - добавить/удалить уровень; изменить значение, описание уровня; изменить стиль отрисовки уровней (вкладка "Уровни");
    • изменить нижнее (по умолчанию –100) и верхнее (по умолчанию +100) ограничения шкалы отдельного окна индикатора (вкладка "Шкала").
  • Ограничения:
    • q>0;
    • r>0, s>0, u>0. Если r, s или u равны 1, то на соответствующем периоде EMA сглаживание не выполняется;
    • минимальный размер массива цен =(q-1+r+s+u-3+1).

 

1.3. Эргодический осциллятор

1.3.1. Технический анализ с использованием эргодического осциллятора

Продолжение: начало см. в пп. 1.1.1, 1.2.1.

Шестое: области перекупленности и перепроданности рынка. Единичный интервал [–1,+1] или процентный интервал [–100,100] в пределах которого изменяются значения нормированного сглаженного моментума, позволяет выделять области перкупленности (overbought) или перепроданности (oversold) рынка.

Класс индикаторов технического анализа, которые характеризуют состояние перекупленности или перепроданности рынка называют осцилляторы. Для каждого осциллятора определяются уровни, при подходе к которым поступают сигналы о перекупленности или перепроданности рынка. Осцилляторы неэффективны на трендовых рынках, так как рынок в области перекупленности/перепроданности может находиться сколь угодно долго.

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

Восьмое: тенденция ценового движения. Тенденция ценового движения восходящая (повышательный тренд), когда основная линия (эргодика) проходит над сигнальной линией. Тенденция ценового движения нисходящая (понижательный тренд), когда основная линия (эргодика) проходит под сигнальной линией.

Эргодический осциллятор

Рис. 1.5. Эргодический осциллятор


1.3.2. Определение эргодического осциллятора

Ergodic(price,q,r,s,u) = TSI(price,q,r,s,u)
SignalLine(price,q,r,s,u,ul) = EMA( Ergodic(price,q,r,s,u) ,ul)

где:

  • Ergodic() - эргодика - индекс истинной силы TSI(price,q,r,s,u);
  • SignalLine() - сигнальная линия - экспоненциальная скользящая средняя периода ul, примененная к эргодике;
  • ul - период EMA сигнальной линии - по Уильяму Блау значение ul должно быть равно периоду последней значимой (>1) EMA эргодики. Например, если используется двойное сглаживание Ergodic(price,q,r,s,u)=Ergodic(price,2,20,5,1), то по Уильяму Блау ul=s=5.

1.3.3. Ergodic(price,q,r,s,u,ul) - эргодический осциллятор. Спецификация
  • Имя файла: Blau_Ergodic.mq5
  • Наименование: Эргодический осциллятор (основан на индексе истинной силы) по Уильяму Блау.
  • Входные параметры:
    • графическое построение #0 - эргодика (индекс истинной силы):
      • q - период, по которому вычисляется моментум (по умолчанию q=2);
      • r - период 1-й EMA, применительно к моментуму (по умолчанию r=20);
      • s - период 2-й EMA, применительно к результату первого сглаживания (по умолчанию s=5);
      • u - период 3-й EMA, применительно к результату второго сглаживания (по умолчанию u=3);
    • графическое построение #1 - сигнальная линия:
      • ul - период EMA сигнальной линии, применительно к эргодике (по умолчанию ul=3);
    • AppliedPrice - тип цены (по умолчанию AppliedPrice=PRICE_CLOSE).
  • Дополнительно:
    • выводится в отдельном окне;
    • изменить стиль отрисовки каждого графического построения - цвет, толщину, стиль линии (вкладка "Цвета");
    • два уровня (по умолчанию –25 и +25) - добавить/удалить уровень; изменить значение, описание уровня; изменить стиль отрисовки уровней (вкладка "Уровни");
    • изменить нижнее (по умолчанию –100) и верхнее (по умолчанию +100) ограничения шкалы отдельного окна индикатора (вкладка "Шкала").
  • Ограничения:
    • q>0;
    • r>0, s>0, u>0. Если r, s или u равны 1, то на соответствующем периоде EMA сглаживание не выполняется;
    • ul>0. Если ul=1, то сигнальная линия совпадает с эргодикой;
    • минимальный размер массива цен =(q-1+r+s+u+ul-4+1).

1.4. Программный код (детальное описание)

1.4.1. "Blau_Mtm.mq5" - индикатор Mtm(price,q,r,s,u) - моментум

Программный код индикатора Mtm(price,q,r,s,u):

//+------------------------------------------------------------------+
//|                                                     Blau_Mtm.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp." // название компании-производителя
#property link      "https://www.mql5.com"                       // ссылка на сайт компании-производителя
#property description "q-period Momentum (William Blau)"        // краткое описание mql5-программы
#include <WilliamBlau.mqh>              // включаемый файл (поиск в стандартном каталоге)
//--- настройки индикатора
#property indicator_separate_window     // выводить индикатор в отдельное окно
#property indicator_buffers 5           // количество буферов для расчета индикатора
#property indicator_plots   1           // количество графических построений в индикаторе
//--- графическое построение #0 (Main)
#property indicator_label1  "Mtm"       // метка для графического построения #0
#property indicator_type1   DRAW_LINE   // способ отображения: DRAW_LINE - линия
#property indicator_color1  Blue        // цвет для вывода линии: Blue - синий
#property indicator_style1  STYLE_SOLID // стиль линии: STYLE_SOLID - сплошная линия
#property indicator_width1  1           // толщина линии
//--- входные параметры
input int    q=2;  // q - период, по которому вычисляется моментум
input int    r=20; // r - период 1-й EMA, применительно к моментуму
input int    s=5;  // s - период 2-й EMA, применительно к результату первого сглаживания
input int    u=3;  // u - период 3-й EMA, применительно к результату второго сглаживания
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - тип цены
//--- динамические массивы для расчета индикатора
double MainBuffer[];     // u-периодная 3-я EMA (для графического построения #0)
double PriceBuffer[];    // массив цен
double MtmBuffer[];      // q-периодный моментум
double EMA_MtmBuffer[];  // r-периодная 1-я EMA
double DEMA_MtmBuffer[]; // s-периодная 2-я EMA
//--- глобальные переменные
int    begin1, begin2, begin3, begin4; // индекс таймсерии, с которой начинаются значимые данные
int    rates_total_min; // минимальный размер входных таймсерий индикатора
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- связь индикаторных буферов с соответствующими динамическими массивами 
   // значения рассчитанного индикатора; предназначены для отрисовки графических построений
   // графическое построение #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);             // u-периодная 3-я EMA
   // буферы для промежуточных расчетов индикатора; не предназначены для отрисовки
   SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);    // массив цен
   SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);      // q-периодный моментум
   SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);  // r-периодная 1-я EMA
   SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS); // s-периодная 2-я EMA
/*
//--- графическое построение #0 (Main)

   PlotIndexSetString(0,PLOT_LABEL,"Mtm");             // метка для графического построения #0

   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);    // способ отображения: DRAW_LINE - линия
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Blue);        // цвет для вывода линии: Blue - синий
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID); // стиль линии: STYLE_SOLID - сплошная линия
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);           // толщина линии
*/
//--- точность отображения значений индикатора
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);
//---
   begin1=q-1;        //                             - значимые данные: MtmBuffer[]
   begin2=begin1+r-1; // or =(q-1)+(r-1)             - значимые данные: EMA_MtmBuffer[]
   begin3=begin2+s-1; // or =(q-1)+(r-1)+(s-1)       - значимые данные: DEMA_MtmBuffer[]
   begin4=begin3+u-1; // or =(q-1)+(r-1)+(s-1)+(u-1) - значимые данные: MainBuffer[]
   //
   rates_total_min=begin4+1; // минимальный размер входных таймсерий индикатора
//--- количество начальных баров без отрисовки графического построения #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- краткое имя индикатора
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Mtm("+shortname+")");
//--- OnInit done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(
                const int rates_total,     // размер входных таймсерий
                const int prev_calculated, // обработано баров на предыдущем вызове
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
   int i,pos;
//--- достаточно ли данных для расчета индикатора
   if(rates_total<rates_total_min) return(0);
//--- расчет массива цен PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // тип цены
                        rates_total,         // размер входных таймсерий
                        prev_calculated,     // обработано баров на предыдущем вызове
                        Open,High,Low,Close, // массивы Open[], High[], Low[], Close[]
                        PriceBuffer          // рассчитываемый массив цен
                       );
//--- расчет q-периодного моментума
   // определение индекса (pos), с которого начать/продолжить расчет q-периодного моментума
   // обнуление незначимых элементов массива MtmBuffer[]
   if(prev_calculated==0)      // если первый вызов
     {
      pos=begin1;              // то расcчитывать все значения, начиная со значимого индекса
      for(i=0;i<pos;i++)       // до значимого индекса
         MtmBuffer[i]=0.0;     // значения обнулить
     }
   else pos=prev_calculated-1; // иначе рассчитывать только последнее значение
   // расчет значимых элементов массива MtmBuffer[]
   for(i=pos;i<rates_total;i++)
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
//--- сглаживание методом EMA
   // r-периодная 1-я EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // размер входных таймсерий
                           prev_calculated, // обработано баров на предыдущем вызове
                           begin1,          // с какого индекса начинаются значимые данные во входном массиве
                           r,               // период сглаживания
                           MtmBuffer,       // входной массив
                           EMA_MtmBuffer    // выходной массив
                          );
   // s-периодная 2-я EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   // u-периодная 3-я EMA (для графического построения #0)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,MainBuffer);
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Рассмотрим программный код детально.


1.4.1.1. Настройки индикатора Mtm(price,q,r,s,u)

Литература

Что почитать о настройках индикатора в справочнике MQL5:

  1. Раздел "Пользовательские индикаторы".
  2. Связь между свойствами индикатора и соответствующими функциями (в разделе "Пользовательские индикаторы").
  3. Свойства программ (#property) (в разделе "Основы языка / Препроцессор").
  4. Стили рисования (Свойства графических построений) (в разделе "Стандартные константы, перечисления и структуры / Константы индикаторов").
  5. Свойства пользовательских индикаторов (в разделе "Стандартные константы, перечисления и структуры / Константы индикаторов").
Авторское право. Описание индикатора
#property copyright "Copyright 2011, MetaQuotes Software Corp." // название компании-производителя
#property link      "https://www.mql5.com"                       // ссылка на сайт компании-производителя
#property description "q-period Momentum (William Blau)"        // краткое описание mql5-программы

Настройки только через директиву препроцессора #property. Копирайт (параметры copyright и link), версия (параметр version) и описание mql5-программы (параметр description) отображаются в окне "Свойства" индикатора (вкладка "Свойства", блок "Подробности").

Включаемый файл
#include <WilliamBlau.mqh>              // включаемый файл (поиск в стандартном каталоге)

Препроцессор заменяет строку #include <WilliamBlau.mqh> содержимым файла "WilliamBlau.mqh". Угловые скобки обозначают, что файл "WilliamBlau.mqh" будет взят из стандартного каталога. Дополнительно см. включение файлов (#include).

О содержимом файла "WilliamBlau.mqh" см. введение.

Настройки индикатора (общие положения)

Пользовательский индикатор - это несколько графических построений. Графические построения индикатора могут быть отображены либо в основном окне ценового графика, либо в отдельном окне (подокне). Каждое графическое построение имеет некоторый способ отображения, цвет, стиль и толщину линий.

Данные для отрисовки графического построения берутся из индикаторных буферов (каждому графическому построению может соответствовать от одного до пяти индикаторных буферов). В качестве индикаторного буфера назначается индикаторный массив.

Чтобы настроить индикатор необходимо (см. рис. 1.6):

  1. Указать окно для отображения индикатора.
  2. Указать количество графических построений.
  3. Указать количество индикаторных буферов.
  4. Объявить индикаторные массивы.
  5. Установить связь: индикаторный массив –> индикаторный буфер –> графическое построение.
  6. Описать свойства каждого графического построения.
  7. Указать точность отображения значений индикатора.
  8. Указать для каждого графического построения количество начальных баров без отрисовки графического построения.
  9. Установить горизонтальные уровни и описать свойства каждого горизонтального уровня (отсутствует).
  10. Установить ограничения шкалы отдельного окна индикатора (отсутствует).
  11. Указать краткое имя индикатора.

Настройки индикатора Mtm(price,q,r,s,u)

Рис. 1.6. Настройки индикатора Mtm(price,q,r,s,u)


Настройки индикатора выполняются: а) либо через директиву препроцессора #property, б) либо с помощью специальных функций. Дополнительно см. связь между свойствами индикатора и функциями.

Отличие способов настроек индикатора состоит в том, что настройки через директиву #property доступны к изменению до того как индикатор будет прикреплен к ценовому графику; настройки с помощью специальных функций доступны после того как индикатор будет прикреплен к ценовому графику. Изменения настроек выполняются из окна "Свойства" индикатора.

Настройки: Окно для отображения индикатора (1)
#property indicator_separate_window     // выводить индикатор в отдельное окно

Настройка обязательная и возможна только через директиву препроцессора #property. Предусмотрено два варианта отображения индикатора:

  1. В основном окне ценового графика - параметр indicator_chart_window;
  2. В отдельном окне (подокне) - параметр indicator_separate_window.
Настройки: Количество буферов (3) и графических построений (2)
#property indicator_buffers 5           // количество буферов для расчета индикатора
#property indicator_plots   1           // количество графических построений в индикаторе

Настройки обязательные и возможны только через директиву препроцессора #property. Количество индикаторных буферов (параметр indicator_buffers) и количество графических построений (параметр indicator_plots) не ограничено.

Настройки: Индикаторные массивы (4)
//--- динамические массивы для расчета индикатора
double MainBuffer[];     // u-периодная 3-я EMA (для графического построения #0)
double PriceBuffer[];    // массив цен
double MtmBuffer[];      // q-периодный моментум
double EMA_MtmBuffer[];  // r-периодная 1-я EMA
double DEMA_MtmBuffer[]; // s-периодная 2-я EMA

Индикаторные массивы объявляются на глобальном уровне как одномерные динамические массивы типа double.

Настройки: Установка связи (5) между индикаторными массивами, индикаторными буферами и графическими построениями
//--- связь индикаторных буферов с соответствующими динамическими массивами 
   // значения рассчитанного индикатора; предназначены для отрисовки графических построений
   // графическое построение #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);             // u-периодная 3-я EMA
   // буферы для промежуточных расчетов индикатора; не предназначены для отрисовки
   SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);    // массив цен
   SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);      // q-периодный моментум
   SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);  // r-периодная 1-я EMA
   SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS); // s-периодная 2-я EMA

Код записывается в функции OnInit() обработки события Init. Связь индикаторного буфера с соответствующим ему одномерным динамическим массивом устанавливается с помощью функции SetIndexBuffer():

bool SetIndexBuffer(
   int                 index,    // индекс индикаторного буфера (начинается с 0)
   double              buffer[], // динамический массив
   ENUM_INDEXBUFFER_TYPE data_type // тип данных, хранящихся в индикаторном массиве
   );

Индикаторный буфер - это одномерный динамические массивы типа double, размером которого управляет клиентский терминал с тем, чтобы он всегда соответствовал количеству баров, на которых индикатор рассчитывается. Индексация индикаторных буферов начинается с 0.

Индикаторный буфер может хранить три типа данных: INDICATOR_DATA, INDICATOR_COLOR_INDEX, INDICATOR_CALCULATIONS. Каждому графическому построению в зависимости от способа отображения может соответствовать от одного до пяти индикаторных буферов: от одного до четырех индикаторных буферов значений (тип данных INDICATOR_DATA) и один буфер цвета (тип данных INDICATOR_COLOR_INDEX).

Индикаторные буферы с типом данных INDICATOR_CALCULATIONS предназначены для промежуточных вычислений. После связывания индикаторный массив будет иметь индексацию как в обычных массивах (см. ниже в п. 1.4.1.2).

Настройки: Свойства графических построений (6)

Для настройки каждого графического построения указывается:

  1. Метка;
  2. Способ отображения (все 18 способов отображения см. в перечислении ENUM_DRAW_TYPE);
  3. Цвет для вывода линии;
  4. Стиль линии (возможные стили см. в перечислении ENUM_LINE_STYLE);
  5. Толщина линии.

Возможно два способа настройки:

1) Через директиву препроцессора #property (реализован этот способ):

//--- графическое построение #0 (Main)
#property indicator_label1  "Mtm"       // метка для графического построения #0
#property indicator_type1   DRAW_LINE   // способ отображения: DRAW_LINE - линия
#property indicator_color1  Blue        // цвет для вывода линии: Blue - синий
#property indicator_style1  STYLE_SOLID // стиль линии: STYLE_SOLID - сплошная линия
#property indicator_width1  1           // толщина линии

2) С помощью группы функций настройки свойств графических построений PlotIndexSetDouble(), PlotIndexSetInteger(), PlotIndexSetString():

//--- графическое построение #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"Mtm");            // метка для графического построения #0
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);    // способ отображения: DRAW_LINE - линия
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Blue);        // цвет для вывода линии: Blue - синий
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID);  // стиль линии: STYLE_SOLID - сплошная линия
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);           // толщина линии

Код записывается в функции OnInit() обработки события Init. Спецификация группы функций PlotIndexSet*():

bool PlotIndexSetDouble|Integer|String(
   int                             plot_index, // индекс графического построения
   int                             prop_id,    // идентификатор свойства графического построения
   double|int,char,bool,color|string  prop_value  // устанавливаемое значение свойства
   );

Для уточнения отображения выбранного вида графического построения используются идентификаторы свойств графического построения, перечисленные в перечислениях ENUM_PLOT_PROPERTY.

Индексация графических построений начинается с 0. Касательно соображений о предпочтительности настроек через директиву #property см. выше в п. "Настройки индикатора (общие положения)". Некоторые свойства графических построений (цвет, стиль, толщина линий) доступны для изменения из окна "Свойства" (вкладка "Цвета") индикатора.

Настройки: Точность отображения значений индикатора (7)
//--- точность отображения значений индикатора
   IndicatorSetInteger(INDICATOR_DIGITS,_Digits);

Код записывается в функции OnInit() обработки события Init. Спецификация функций настройки свойств индикатора IndicatorSet*():

bool IndicatorSetDouble|Integer|String(
   int                    prop_id,   // идентификатор свойства индикатора
   double|int,color|string  prop_value // устанавливаемое значение свойства
   );

Идентификаторы свойств индикатора перечислены в перечислениях ENUM_CUSTOMIND_PROPERTY.

Точность отображения значений индикатора задается только с помощью функции IndicatorSetInteger(), идентификатор свойства индикатора INDICATOR_DIGITS перечисления ENUM_CUSTOMIND_PROPERTY_INTEGER.

В примере значения индикаторных буферов, которые предназначены для отрисовки, при отображении: рядом с кратким именем индикатора; во всплывающей подсказке, если поднести курсор мыши к линии индикатора, - будут округляться с точностью до _Digits - количества цифр после десятичной точки в цене инструмента, к которому прикреплен индикатор.

Настройки: Количество начальных баров без отрисовки (8)

Данные для отрисовки q-периодного моментума Уильяма Блау формируются за четыре шага:

1-й шаг. На основании данных массива цен PriceBuffer[] рассчитывается моментум (период q). Значения q-периодного моментума помещаются в массив MtmBuffer[]. Поскольку индексация массива цен начинается с 0, значимые данные в массиве цен начинаются также с индекса 0, то значимые данные в массиве MtmBuffer[] начинаются с индекса (q–1).

2-й шаг. Значимые данные массива MtmBuffer[] сглаживаются (период сглаживания r). Значения сглаженного q-периодного моментума помещаются в массив EMA_MtmBuffer[]. Поскольку индексация массива MtmBuffer[] начинается с 0, значимые данные в массиве MtmBuffer[] начинаются с индекса (q–1), то значимые данные в массиве EMA_MtmBuffer[] начинаются с индекса (q–1)+(r–1).

3-й и 4-й шаги. Аналогичные соображения по определению того, с какого бара начинаются значимые данные в массиве DEMA_MtmBuffer[] (период сглаживания s) и в массиве MainBuffer[] (период сглаживания u). См. рис. 1.7.

Значимые данные индикатора Mtm(price,q,r,s,u)

Рис. 1.7. Значимые данные индикатора Mtm(price,q,r,s,u)


На глобальном уровне объявляются переменные:

//--- глобальные переменные
int    begin1, begin2, begin3, begin4; // индекс таймсерии, с которой начинаются значимые данные

Значения переменных - это индекс бара, с которого начинаются значимые данные в соответствующем переменной индикаторном массиве. Значения переменных рассчитываются в функции OnInit() обработки события Init и будут использоваться в функции OnCalculate() обработки события Calculate.

//---
   begin1=q-1;        //                             - значимые данные: MtmBuffer[]
   begin2=begin1+r-1; // or =(q-1)+(r-1)             - значимые данные: EMA_MtmBuffer[]
   begin3=begin2+s-1; // or =(q-1)+(r-1)+(s-1)       - значимые данные: DEMA_MtmBuffer[]
   begin4=begin3+u-1; // or =(q-1)+(r-1)+(s-1)+(u-1) - значимые данные: MainBuffer[]
//--- количество начальных баров без отрисовки графического построения #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);

Количество начальных баров без отрисовки графического построения задается только с помощью функции PlotIndexSetInteger(), идентификатор свойства индикатора PLOT_DRAW_BEGIN перечисления ENUM_PLOT_PROPERTY_INTEGER.

Настройки: Краткое имя индикатора (11)
//--- краткое имя индикатора
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Mtm("+shortname+")");

Код записывается в функции OnInit() обработки события Init. Краткое имя индикатора задается только с помощью функции IndicatorSetString(), идентификатор свойства индикатора INDICATOR_SHORTNAME перечисления ENUM_CUSTOMIND_PROPERTY_STRING. Функция PriceName() возвращает наименование типа цены в зависимости от значения входного параметра AppliedPrice. Код функции PriceName() расположен в файле "WilliamBlau.mqh" (см. введение).

Входные параметры
//--- входные параметры
input int    q=2;  // q - период, по которому вычисляется моментум
input int    r=20; // r - период 1-й EMA, применительно к моментуму
input int    s=5;  // s - период 2-й EMA, применительно к результату первого сглаживания
input int    u=3;  // u - период 3-й EMA, применительно к результату второго сглаживания
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - тип цены

Дополнительно см. input переменные. Входные параметры доступны для изменения из окна "Свойства" (вкладка "Входные параметры") индикатора.

1.4.1.2. Расчет индикатора Mtm(price,q,r,s,u)

Расчет: Алгоритм

Алгоритм расчета индикатора Mtm(price,q,r,s,u):

  1. Проверка достаточно ли данных для расчета индикатора.
  2. Расчет массива цен согласно указанному типу цены - формирование массива PriceBuffer[]
  3. Определение индекса бара, с которого начать/продолжить расчет q-периодного моментума.
  4. Расчет q-периодного моментума - формирование массива MtmBuffer[].
  5. Первое сглаживание методом EMA (период r) - формирование массива EMA_MtmBuffer[].
  6. Второе сглаживание методом EMA (период s) - формирование массива DEMA_MtmBuffer[].
  7. Третье сглаживание методом EMA (период u) - формирование массива MainBuffer[] - расчет значений для отрисовки графического построения #0.
Расчет: Функция OnCalculate()

Расчет значений индикатора выполняется в функции OnCalculate() обработки события Calculate. Воспользуемся второй формой вызова OnCalculate().

int OnCalculate(
                const int rates_total,     // размер входных таймсерий
                const int prev_calculated, // обработано баров на предыдущем вызове
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
//---
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }

Параметр rates_total - это количество баров ценового графика, которые отрисованы и доступны индикатору для обработки. Параметр prev_calculated - это количество баров ценового графика, которые были обработаны индикатором на момент начала текущего вызова функции OnCalculate().

Функция OnCalculate() возвращает количество баров ценового графика, которые были обработаны индикатором на момент окончания текущего вызова функции OnCalculate(). Эта функция возвращает параметр rates_total и должна быть построена таким образом, чтобы на первом же вызове были обработаны все необработанные бары ценового графика.

То есть, если на первом вызове функции OnCalculate() параметр prev_calculated равен 0, то на втором вызове параметр prev_calculated равен либо rates_total, либо rates_total+1 и, начиная со второго вызова, функция OnCalculate() обрабатывает (пересчитывает) только последний бар. Дополнительное разъяснение с примером см. здесь.

Индикаторные буферы и массивы Time[], Open[], High[], Low[], Close[], TickVolume[], Volume[] и Spread[] по умолчанию имеют направление индексации слева направо, от начала массива к концу, от самый старых данных к самым свежим. Индекс первого элемента равен 0. Размером индикаторных буферов управляет клиентский терминал с тем, чтобы он всегда соответствовал количеству баров, на которых индикатор рассчитывается.

Расчет: Проверка достаточно ли данных для расчета индикатора (1)
//--- достаточно ли данных для расчета индикатора
   if(rates_total<rates_total_min) return(0);

Глобальная переменная rates_total_min - это минимальный размер входных таймсерий индикатора; рассчитывается в функции OnInit() обработки события Init.

   rates_total_min=begin4+1; // минимальный размер входных таймсерий индикатора
Расчет: Массив цен PriceBuffer[] (2)
//--- расчет массива цен PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // тип цены
                        rates_total,         // размер входных таймсерий
                        prev_calculated,     // обработано баров на предыдущем вызове
                        Open,High,Low,Close, // массивы Open[], High[], Low[], Close[]
                        PriceBuffer          // рассчитываемый массив цен
                       );

Для формирования массива цен PriceBuffer[] используется функция CalculatePriceBuffer(). Код функции CalculatePriceBuffer() расположен в файле "WilliamBlau.mqh" (см. введение). Тип цены указывается во входном параметре AppliedPrice.

Расчет: Определение индекса бара, с которого начать/продолжить расчет q-периодного моментума (3)

Локальная переменная pos - это индекс бара, с которого будет рассчитываться индикатор на текущем вызове функции OnCalculate(). Совместим расчет значения переменной pos с этапом подготовки массива MtmBuffer[] к расчету (этап обнуления незначимых элементов массива MtmBuffer[]).

Расчет: q-периодный моментум (4)
//--- расчет q-периодного моментума
   // определение индекса (pos), с которого начать/продолжить расчет q-периодного моментума
   // обнуление незначимых элементов массива MtmBuffer[]
   if(prev_calculated==0)      // если первый вызов
     {
      pos=begin1;              // то расcчитывать все значения, начиная со значимого индекса
      for(i=0;i<pos;i++)       // до значимого индекса
         MtmBuffer[i]=0.0;     // значения обнулить
     }
   else pos=prev_calculated-1; // иначе рассчитывать только последнее значение
   // расчет значимых элементов массива MtmBuffer[]
   for(i=pos;i<rates_total;i++)
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];

q-периодный моментум рассчитывается как разница между ценой текущего периода PriceBuffer[i] и ценой (q–1) периодов назад PriceBuffer[i–(q–1)].

Расчет: сглаживание методом EMA (5–7)
//--- сглаживание методом EMA
   // r-периодная 1-я EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // размер входных таймсерий
                           prev_calculated, // обработано баров на предыдущем вызове
                           begin1,          // с какого индекса начинаются значимые данные во входном массиве
                           r,               // период сглаживания
                           MtmBuffer,       // входной массив
                           EMA_MtmBuffer    // выходной массив
                          );
   // s-периодная 2-я EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   // u-периодная 3-я EMA (для графического построения #0)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,MainBuffer);

О функции ExponentialMAOnBuffer() см. также введение. На примере расчета r-периодной 1-й EMA: функция ExponentialMAOnBuffer() заполняет выходной массив EMA_MtmBuffer[] значениями EMA (период r) от входного массива MtmBuffer[]; незначимые данные до индекса (begin1–1) включительно заполняются нулевыми значениями.

 

1.4.2. "Blau_TSI.mq5" - индикатор TSI(price,q,r,s,u) - индекс истинной силы

Программный код индикатора TSI(price,q,r,s,u) (построен на основе изменений и добавлений в программный код "Blau_Mtm.mq5"):

//+------------------------------------------------------------------+
//|                                                     Blau_TSI.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp." // название компании-производителя
#property link      "https://www.mql5.com"                       // ссылка на сайт компании-производителя
#property description "True Strength Index (William Blau)"      // краткое описание mql5-программы
#include <WilliamBlau.mqh>               // включаемый файл (поиск в стандартном каталоге)
//--- настройки индикатора
#property indicator_separate_window      // выводить индикатор в отдельное окно
#property indicator_buffers 10           // количество буферов для расчета индикатора
#property indicator_plots   1            // количество графических построений в индикаторе
//--- горизонтальные уровни
#property indicator_level1 -25           // значение уровня #0 на вертикальной оси
#property indicator_level2 25            // значение уровня #1 на вертикальной оси
#property indicator_levelcolor Silver    // цвет для вывода линии уровня
#property indicator_levelstyle STYLE_DOT // стиль линии уровня: STYLE_DOT - пунктирная линия
#property indicator_levelwidth 1         // толщина линии уровня
//--- ограничения шкалы отдельного окна индикатора
#property indicator_minimum -100         // нижнее ограничение шкалы отдельного окна индикатора
#property indicator_maximum 100          // верхнее ограничение шкалы отдельного окна индикатора
//--- графическое построение #0 (Main)
#property indicator_label1  "TSI"        // метка для графического построения #0
#property indicator_type1   DRAW_LINE    // тип: DRAW_LINE - линия
#property indicator_color1  Blue         // цвет для вывода линии: Blue - синий
#property indicator_style1  STYLE_SOLID  // стиль линии: STYLE_SOLID - сплошная линия
#property indicator_width1  1            // толщина линии
//--- входные параметры
input int    q=2;  // q - период, по которому вычисляется моментум
input int    r=20; // r - период 1-й EMA, применительно к моментуму
input int    s=5;  // s - период 2-й EMA, применительно к результату первого сглаживания
input int    u=3;  // u - период 3-й EMA, применительно к результату второго сглаживания
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - тип цены
//--- динамические массивы для расчета индикатора
double MainBuffer[];        // TSI (для графического построения #0)
double PriceBuffer[];       // массив цен
double MtmBuffer[];         // q-периодный моментум
double EMA_MtmBuffer[];     // r-периодная 1-я EMA
double DEMA_MtmBuffer[];    // s-периодная 2-я EMA
double TEMA_MtmBuffer[];    // u-периодная 3-я EMA
double AbsMtmBuffer[];      // q-периодный моментум (абсолютное значение)
double EMA_AbsMtmBuffer[];  // r-периодная 1-я EMA (абсолютное значение)
double DEMA_AbsMtmBuffer[]; // s-периодная 2-я EMA (абсолютное значение)
double TEMA_AbsMtmBuffer[]; // u-периодная 3-я EMA (абсолютное значение)
//--- глобальные переменные
int    begin1, begin2, begin3, begin4; // индекс таймсерии, с которой начинаются значимые данные
int    rates_total_min; // минимальный размер входных таймсерий индикатора
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- связь индикаторных буферов с соответствующими динамическими массивами 
   // значения рассчитанного индикатора; предназначены для отрисовки графических построений
   // графическое построение #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                // TSI
   // буферы для промежуточных расчетов индикатора; не предназначены для отрисовки
   SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);       // массив цен
   SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);         // q-периодный моментум
   SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);     // r-периодная 1-я EMA
   SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // s-периодная 2-я EMA
   SetIndexBuffer(5,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // u-периодная 3-я EMA
   SetIndexBuffer(6,AbsMtmBuffer,INDICATOR_CALCULATIONS);      // q-периодный моментум (абсолютное значение)
   SetIndexBuffer(7,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // r-периодная 1-я EMA (абсолютное значение)
   SetIndexBuffer(8,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // s-периодная 2-я EMA (абсолютное значение)
   SetIndexBuffer(9,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-периодная 3-я EMA (абсолютное значение)
/*
//--- графическое построение #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"TSI");             // метка для графического построения #0
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_LINE);    // тип: DRAW_LINE - линия
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Blue);        // цвет для вывода линии: Blue - синий
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID); // стиль линии: STYLE_SOLID - сплошная линия
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,1);           // толщина линии
*/
//--- точность отображения значений индикатора
   IndicatorSetInteger(INDICATOR_DIGITS,2);
/*
//--- горизонтальные уровни
   IndicatorSetInteger(INDICATOR_LEVELS,2);                // количество уровней на окне индикатора
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-25);         // значение уровня #0 на вертикальной оси
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,25);          // значение уровня #1 на вертикальной оси
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,Silver);       // цвет для вывода линии уровня
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_DOT);    // стиль линии уровня: STYLE_DOT - пунктирная линия
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1);            // толщина линии уровня
   IndicatorSetString(INDICATOR_LEVELTEXT,0,"Oversold");   // описание уровня #0 "Перепроданность"
   IndicatorSetString(INDICATOR_LEVELTEXT,1,"Overbought"); // описание уровня #1 "Перекупленность"
//--- ограничения шкалы отдельного окна индикатора
   IndicatorSetDouble(INDICATOR_MINIMUM,-100); // нижнее ограничение шкалы отдельного окна индикатора
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);  // верхнее ограничение шкалы отдельного окна индикатора
*/
//---
   begin1=q-1;        //                             - значимые данные: MtmBuffer[], AbsMtmBuffer[]
   begin2=begin1+r-1; // or =(q-1)+(r-1)             - значимые данные: EMA_...[]
   begin3=begin2+s-1; // or =(q-1)+(r-1)+(s-1)       - значимые данные: DEMA_...[]
   begin4=begin3+u-1; // or =(q-1)+(r-1)+(s-1)+(u-1) - значимые данные: TEMA_...[], MainBuffer[]
   //
   rates_total_min=begin4+1; // минимальный размер входных таймсерий индикатора
//--- количество начальных баров без отрисовки графического построения #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- краткое имя индикатора
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_TSI("+shortname+")");
//--- OnInit done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(
                const int rates_total,     // размер входных таймсерий
                const int prev_calculated, // обработано баров на предыдущем вызове
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
   int i,pos;
   double value1,value2;
//--- достаточно ли данных для расчета индикатора
   if(rates_total<rates_total_min) return(0);
//--- расчет массива цен PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // тип цены
                        rates_total,         // размер входных таймсерий
                        prev_calculated,     // обработано баров на предыдущем вызове
                        Open,High,Low,Close, // массивы Open[], High[], Low[], Close[]
                        PriceBuffer          // рассчитываемый массив цен
                       );
//--- расчет mtm и |mtm|
   // определение индекса (pos), с которого начать/продолжить расчет mtm и |mtm|
   // обнуление незначимых элементов массивов MtmBuffer[] и AbsMtmBuffer[]
   if(prev_calculated==0)      // если первый вызов
     {
      pos=begin1;              // то расcчитать все значения, начиная со значимого индекса
      for(i=0;i<pos;i++)       // до значимого индекса
        {
         MtmBuffer[i]=0.0;     // значения обнулить
         AbsMtmBuffer[i]=0.0;  //
        }
     }
   else pos=prev_calculated-1; // иначе рассчитать только последнее значение
   // расчет значимых элементов массивов MtmBuffer[] и AbsMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
      AbsMtmBuffer[i]=MathAbs(MtmBuffer[i]);
     }
//--- сглаживание методом EMA
   // r-периодная 1-я EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // размер входных таймсерий
                           prev_calculated, // обработано баров на предыдущем вызове
                           begin1,          // с какого индекса начинаются значимые данные во входном массиве
                           r,               // период сглаживания
                           MtmBuffer,       // входной массив
                           EMA_MtmBuffer    // выходной массив
                          );
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,AbsMtmBuffer,EMA_AbsMtmBuffer);
   // s-периодная 2-я EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_AbsMtmBuffer,DEMA_AbsMtmBuffer);
   // u-периодная 3-я EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,TEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_AbsMtmBuffer,TEMA_AbsMtmBuffer);
//--- расчет TSI (для графического построения #0)
   // определение индекса (pos), с которого начать/продолжить расчет TSI
   // обнуление незначимых элементов массива MainBuffer[]
   if(prev_calculated==0)      // если первый вызов
     {
      pos=begin4;              // то расcчитывать все значения, начиная со значимого индекса
      for(i=0;i<pos;i++)       // до значимого индекса
         MainBuffer[i]=0.0;    // значения обнулить
     }
   else pos=prev_calculated-1; // иначе рассчитывать только последнее значение
   // расчет значимых элементов массива MainBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      value1=100*TEMA_MtmBuffer[i];
      value2=TEMA_AbsMtmBuffer[i];
      MainBuffer[i]=(value2>0)?value1/value2:0;
     }
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Рассмотрим детально только изменения и добавления в программный код "Blau_Mtm.mq5".

1.4.2.1. Настройки индикатора TSI(price,q,r,s,u) (изменения и добавления в программный код "Blau_Mtm.mq5")

Настройки индикатора (общие положения)

Настройки индикатора TSI(price,q,r,s,u) отличаются от настроек индикатора Mtm(price,q,r,s,u) (см. рис. 1.8):

  1. Указать окно для отображения индикатора (не изменилось).
  2. Указать количество графических построений (не изменилось).
  3. Указать количество индикаторных буферов (количество буферов увеличилось).
  4. Объявить индикаторные массивы (добавлены массивы).
  5. Установить связь: индикаторный массив –> индикаторный буфер –> графическое построение (реструктуризация).
  6. Описать свойства каждого графического построения (изменена метка).
  7. Указать точность отображения значений индикатора (изменена точность).
  8. Указать для каждого графического построения количество начальных баров без отрисовки графического построения (не изменилось).
  9. Установить горизонтальные уровни и описать свойства каждого горизонтального уровня (новое).
  10. Установить ограничения шкалы отдельного окна индикатора (новое).
  11. Указать краткое имя индикатора (изменено имя).

Настройки индикатора TSI(price,q,r,s,u)

Рис. 1.8. Настройки индикатора TSI(price,q,r,s,u)


Настройки (изменения)

В программный код "Blau_Mtm.mq5" внесены следующие незначительные изменения.

1. Изменено краткое описание mql5-программы:

#property description "True Strength Index (William Blau)"      // краткое описание mql5-программы

2. (к настройке 6) Количество графических построений не увеличилось; способ отображения (DRAW_LINE – линия), цвет для вывода линии (Blue), стиль линии (STYLE_SOLID – сплошная линия) и толщина линии (1) остались прежними; изменилась метка для графического построения #0:

#property indicator_label1  "TSI"        // метка для графического построения #0

3. (к настройке 7) Изменена точность отображения значений индикатора:

   IndicatorSetInteger(INDICATOR_DIGITS,2);

4. (к настройке 11) Изменено краткое имя индикатора:

   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_TSI("+shortname+")");
Настройки: Горизонтальные уровни (9)

Для настройки горизонтальных уровней для каждого уровня необходимо указать:

  1. Значение на вертикальной оси;
  2. Описание уровня (необязательно). Горизонтальные уровни имеют единый стиль отрисовки:
    1. Цвет для вывода линии; 
    2. Стиль линии (возможные стили см. в перечислении ENUM_LINE_STYLE);
    3. Толщина линии.

Возможно два способа настройки:

1) Через директиву препроцессора #property (реализован этот способ).

//--- горизонтальные уровни
#property indicator_level1 -25           // значение уровня #0 на вертикальной оси
#property indicator_level2 25            // значение уровня #1 на вертикальной оси
#property indicator_levelcolor Silver    // цвет для вывода линии уровня
#property indicator_levelstyle STYLE_DOT // стиль линии уровня: STYLE_DOT - пунктирная линия
#property indicator_levelwidth 1         // толщина линии уровня

2) С помощью группы функций настройки свойств индикатора IndicatorSet*():

//--- горизонтальные уровни
   IndicatorSetInteger(INDICATOR_LEVELS,2);               // количество уровней на окне индикатора
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-25);         // значение уровня #0 на вертикальной оси
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,25);          // значение уровня #1 на вертикальной оси
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,Silver);       // цвет для вывода линии уровня
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_DOT);    // стиль линии уровня: STYLE_DOT - пунктирная линия
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1);           // толщина линии уровня
   IndicatorSetString(INDICATOR_LEVELTEXT,0,"Oversold");   // описание уровня #0 "Перепроданность"
   IndicatorSetString(INDICATOR_LEVELTEXT,1,"Overbought"); // описание уровня #1 "Перекупленность"

Код записывается в функции OnInit() обработки события Init. Индексация горизонтальных уровней начинается с 0. Для уточнения отображения горизонтального уровня используются идентификаторы свойств индикатора INDICATOR_LEVEL*, перечисленные в перечислениях ENUM_CUSTOMIND_PROPERTY.

Описание каждого уровня задается только с помощью функции IndicatorSetString(), идентификатор свойства индикатора INDICATOR_LEVELTEXT перечисления ENUM_CUSTOMIND_PROPERTY_STRING. Описание уровня размещается непосредственно над уровнем слева. 

Из окна "Свойства" (вкладка "Уровни") индикатора можно добавить/удалить горизонтальные уровни, изменить значение, описание каждого уровня и стиль отрисовки уровней.

Настройки: Ограничения шкалы отдельного окна индикатора (10)

Возможно два способа настройки:

1) Через директиву препроцессора #property (реализован этот способ).

//--- ограничения шкалы отдельного окна индикатора
#property indicator_minimum -100         // нижнее ограничение шкалы отдельного окна индикатора
#property indicator_maximum 100          // верхнее ограничение шкалы отдельного окна индикатора

2) С помощью функции IndicatorSetDouble(), идентификаторы свойства индикатора INDICATOR_MINIMUM и INDICATOR_MAXIMUM перечисления ENUM_CUSTOMIND_PROPERTY_DOUBLE.

//--- ограничения шкалы отдельного окна индикатора
   IndicatorSetDouble(INDICATOR_MINIMUM,-100); // нижнее ограничение шкалы отдельного окна индикатора
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);  // верхнее ограничение шкалы отдельного окна индикатора

Код записывается в функции OnInit() обработки события Init. Нижнее и верхнее ограничения шкалы отдельного окна индикатора доступны для изменения из окна "Свойства" (вкладка "Шкала") индикатора.

Настройки (изменения): Индикаторные буферы (3–5)

Изменения в настройке "индикаторный массив –> индикаторный буфер –> графическое построение":

1. (к настройке 3) Увеличилось количество буферов:

#property indicator_buffers 10           // количество буферов для расчета индикатора

2. (к настройке 4) Добавлены индикаторные массивы, которые необходимы для расчета абсолютного значения q-периодного моментума:

double AbsMtmBuffer[];      // q-периодный моментум (абсолютное значение)
double EMA_AbsMtmBuffer[];  // r-периодная 1-я EMA (абсолютное значение)
double DEMA_AbsMtmBuffer[]; // s-периодная 2-я EMA (абсолютное значение)
double TEMA_AbsMtmBuffer[]; // u-периодная 3-я EMA (абсолютное значение)

изменено назначение массива MainBuffer[]:

double MainBuffer[];        // TSI (для графического построения #0)
double TEMA_MtmBuffer[];    // u-периодная 3-я EMA

3. (к настройке 5) Выполнена реструктуризация связи "индикаторный массив –> индикаторный буфер –> графическое построение":

//--- связь индикаторных буферов с соответствующими динамическими массивами 
   // значения рассчитанного индикатора; предназначены для отрисовки графических построений
   // графическое построение #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                // TSI
   // буферы для промежуточных расчетов индикатора; не предназначены для отрисовки
   SetIndexBuffer(1,PriceBuffer,INDICATOR_CALCULATIONS);       // массив цен
   SetIndexBuffer(2,MtmBuffer,INDICATOR_CALCULATIONS);         // q-периодный моментум
   SetIndexBuffer(3,EMA_MtmBuffer,INDICATOR_CALCULATIONS);     // r-периодная 1-я EMA
   SetIndexBuffer(4,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // s-периодная 2-я EMA
   SetIndexBuffer(5,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);    // u-периодная 3-я EMA
   SetIndexBuffer(6,AbsMtmBuffer,INDICATOR_CALCULATIONS);      // q-периодный моментум (абсолютное значение)
   SetIndexBuffer(7,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // r-периодная 1-я EMA (абсолютное значение)
   SetIndexBuffer(8,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // s-периодная 2-я EMA (абсолютное значение)
   SetIndexBuffer(9,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-периодная 3-я EMA (абсолютное значение)


1.4.2.2. Расчет индикатора TSI(price,q,r,s,u) (изменения и добавления в программный код "Blau_Mtm.mq5")

Расчет: Алгоритм

Алгоритм расчета индикатора TSI(price,q,r,s,u):

  1. Проверка достаточно ли данных для расчета индикатора.
  2. Расчет массива цен согласно указанному типу цены - формирование массива PriceBuffer[].
  3. Определение индекса бара, с которого начать/продолжить расчет q-периодного моментума.
  4. Расчет q-периодного моментума и его абсолютного значения - формирование массивов MtmBuffer[] и AbsMtmBuffer[].
  5. Первое сглаживание методом EMA (период r) - формирование массивов EMA_MtmBuffer[] и EMA_AbsMtmBuffer[].
  6. Второе сглаживание методом EMA (период s) - формирование массивов DEMA_MtmBuffer[] и DEMA_AbsMtmBuffer[].
  7. Третье сглаживание методом EMA (период u) - формирование массивов TEMA_MtmBuffer[] и TEMA_AbsMtmBuffer[].
  8. Определение индекса бара, с которого начать/продолжить расчет индекса истинной силы.
  9. Расчет индекса истинной силы - формирование массива MainBuffer[] - расчет значений для отрисовки графического построения #0.

Суть изменений в алгоритме (кратко): а) (см. п. 4–7) параллельно с расчетом q-периодного моментума (группа массивов *MtmtBuffer[]) идет расчет абсолютного значения q-периодного моментума (группа массивов *AbsMtmBuffer[]); б) (см. п. 8–9) добавлен расчет TSI.

Расчет: q-периодный моментум и его абсолютное значение (3–7)
//--- расчет mtm и |mtm|
   // определение индекса (pos), с которого начать/продолжить расчет mtm и |mtm|
   // обнуление незначимых элементов массивов MtmBuffer[] и AbsMtmBuffer[]
   if(prev_calculated==0)      // если первый вызов
     {
      pos=begin1;              // то расcчитать все значения, начиная со значимого индекса
      for(i=0;i<pos;i++)       // до значимого индекса
        {
         MtmBuffer[i]=0.0;     // значения обнулить
         AbsMtmBuffer[i]=0.0;  //
        }
     }
   else pos=prev_calculated-1; // иначе рассчитать только последнее значение
   // расчет значимых элементов массивов MtmBuffer[] и AbsMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
      AbsMtmBuffer[i]=MathAbs(MtmBuffer[i]);
     }
//--- сглаживание методом EMA
   // r-периодная 1-я EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // размер входных таймсерий
                           prev_calculated, // обработано баров на предыдущем вызове
                           begin1,          // с какого индекса начинаются значимые данные во входном массиве
                           r,               // период сглаживания
                           MtmBuffer,       // входной массив
                           EMA_MtmBuffer    // выходной массив
                          );
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,AbsMtmBuffer,EMA_AbsMtmBuffer);
   // s-периодная 2-я EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_AbsMtmBuffer,DEMA_AbsMtmBuffer);
   // u-периодная 3-я EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,TEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_AbsMtmBuffer,TEMA_AbsMtmBuffer);
Расчет: индекс истинной силы (8–9)
//--- расчет TSI (для графического построения #0)
   // определение индекса (pos), с которого начать/продолжить расчет TSI
   // обнуление незначимых элементов массива MainBuffer[]
   if(prev_calculated==0)      // если первый вызов
     {
      pos=begin4;              // то расcчитывать все значения, начиная со значимого индекса
      for(i=0;i<pos;i++)       // до значимого индекса
         MainBuffer[i]=0.0;    // значения обнулить
     }
   else pos=prev_calculated-1; // иначе рассчитывать только последнее значение
   // расчет значимых элементов массива MainBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      value1=100*TEMA_MtmBuffer[i];
      value2=TEMA_AbsMtmBuffer[i];
      MainBuffer[i]=(value2>0)?value1/value2:0;
     }

 

1.4.3. "Blau_Ergodic.mq5" - индикатор Ergodic(price,q,r,s,u,ul) - эргодический осциллятор

Программный код индикатора Ergodic(price,q,r,s,u,ul) (построен на основе изменений и добавлений в программный код "Blau_TSI.mq5"):

//+------------------------------------------------------------------+
//|                                                 Blau_Ergodic.mq5 |
//|                        Copyright 2011, MetaQuotes Software Corp. |
//|                                              https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2011, MetaQuotes Software Corp." // название компании-производителя
#property link      "https://www.mql5.com"                       // ссылка на сайт компании-производителя
#property description "Ergodic Oscillator (William Blau)"       // краткое описание mql5-программы
#include <WilliamBlau.mqh>                 // включаемый файл (поиск в стандартном каталоге)
//--- настройки индикатора
#property indicator_separate_window        // выводить индикатор в отдельное окно
#property indicator_buffers 11             // количество буферов для расчета индикатора
#property indicator_plots   2              // количество графических построений в индикаторе
//--- горизонтальные уровни
#property indicator_level1 -25             // значение уровня #0 на вертикальной оси
#property indicator_level2 25              // значение уровня #1 на вертикальной оси
#property indicator_levelcolor Silver      // цвет для вывода линии уровня
#property indicator_levelstyle STYLE_DOT   // стиль линии уровня: STYLE_DOT - пунктирная линия
#property indicator_levelwidth 1           // толщина линии уровня
//--- ограничения шкалы отдельного окна индикатора
#property indicator_minimum -100           // нижнее ограничение шкалы отдельного окна индикатора
#property indicator_maximum 100            // верхнее ограничение шкалы отдельного окна индикатора
//--- графическое построение #0 (Main)

#property indicator_label1  "Ergodic"      // метка для графического построения #0
#property indicator_type1   DRAW_HISTOGRAM // тип: DRAW_HISTOGRAM - гистограмма от нулевой линии
#property indicator_color1  Silver         // цвет для вывода линии: Silver - серебристый
#property indicator_style1  STYLE_SOLID    // стиль линии: STYLE_SOLID - сплошная линия
#property indicator_width1  2              // толщина линии
//--- графическое построение #1 (Signal Line)
#property indicator_label2  "Signal"       // метка для графического построения #1
#property indicator_type2   DRAW_LINE      // тип: DRAW_LINE - линия
#property indicator_color2  Red            // цвет для вывода линии: Red - красный
#property indicator_style2  STYLE_SOLID    // стиль линии: STYLE_SOLID - сплошная линия
#property indicator_width2  1              // толщина линии
//--- входные параметры
input int    q=2;  // q - период, по которому вычисляется моментум
input int    r=20; // r - период 1-й EMA, применительно к моментуму
input int    s=5;  // s - период 2-й EMA, применительно к результату первого сглаживания
input int    u=3;  // u - период 3-й EMA, применительно к результату второго сглаживания
input int    ul=3; // ul - (сигнальная линия) период EMA, применительно к эргодике
input ENUM_APPLIED_PRICE AppliedPrice=PRICE_CLOSE; // AppliedPrice - тип цены
//--- динамические массивы для расчета индикатора
double MainBuffer[];        // эргодика (для графического построения #0)
double SignalBuffer[];      // сигнальная линия: ul-периодная EMA от эргодики (для графического построения #1)
double PriceBuffer[];       // массив цен
double MtmBuffer[];         // q-периодный моментум
double EMA_MtmBuffer[];     // r-периодная 1-я EMA
double DEMA_MtmBuffer[];    // s-периодная 2-я EMA
double TEMA_MtmBuffer[];    // u-периодная 3-я EMA
double AbsMtmBuffer[];      // q-периодный моментум (абсолютное значение)
double EMA_AbsMtmBuffer[];  // r-периодная 1-я EMA (абсолютное значение)
double DEMA_AbsMtmBuffer[]; // s-периодная 2-я EMA (абсолютное значение)
double TEMA_AbsMtmBuffer[]; // u-периодная 3-я EMA (абсолютное значение)
//--- глобальные переменные
int    begin1, begin2, begin3, begin4, begin5; // индекс таймсерии, с которой начинаются значимые данные
int    rates_total_min; // минимальный размер входных таймсерий индикатора
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- связь индикаторных буферов с соответствующими динамическими массивами 
   // значения рассчитанного индикатора; предназначены для отрисовки графических построений
   // графическое построение #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                 // эргодика
   // графическое построение #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);               // сигнальная линия: ul-периодная EMA от эргодики
   // буферы для промежуточных расчетов индикатора; не предназначены для отрисовки
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);        // массив цен
   SetIndexBuffer(3,MtmBuffer,INDICATOR_CALCULATIONS);          // q-периодный моментум
   SetIndexBuffer(4,EMA_MtmBuffer,INDICATOR_CALCULATIONS);      // r-периодная 1-я EMA
   SetIndexBuffer(5,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // s-периодная 2-я EMA
   SetIndexBuffer(6,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // u-периодная 3-я EMA
   SetIndexBuffer(7,AbsMtmBuffer,INDICATOR_CALCULATIONS);       // q-периодный моментум (абсолютное значение)
   SetIndexBuffer(8,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);   // r-периодная 1-я EMA (абсолютное значение)
   SetIndexBuffer(9,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // s-периодная 2-я EMA (абсолютное значение)
   SetIndexBuffer(10,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-периодная 3-я EMA (абсолютное значение)
/*
//--- графическое построение #0 (Main)
   PlotIndexSetString(0,PLOT_LABEL,"Ergodic");           // метка для графического построения #0
   PlotIndexSetInteger(0,PLOT_DRAW_TYPE,DRAW_HISTOGRAM); // тип: DRAW_HISTOGRAM - гистограмма от нулевой линии
   PlotIndexSetInteger(0,PLOT_LINE_COLOR,Silver);        // цвет для вывода линии: Silver - серебристый
   PlotIndexSetInteger(0,PLOT_LINE_STYLE,STYLE_SOLID);   // стиль линии: STYLE_SOLID - сплошная линия
   PlotIndexSetInteger(0,PLOT_LINE_WIDTH,2);             // толщина линии
//--- графическое построение #1 (Signal Line)
   PlotIndexSetString(1,PLOT_LABEL,"Signal");            // метка для графического построения #1
   PlotIndexSetInteger(1,PLOT_DRAW_TYPE,DRAW_LINE);      // тип: DRAW_LINE - линия
   PlotIndexSetInteger(1,PLOT_LINE_COLOR,Red);           // цвет для вывода линии: Red - красный
   PlotIndexSetInteger(1,PLOT_LINE_STYLE,STYLE_SOLID);   // стиль линии: STYLE_SOLID - сплошная линия
   PlotIndexSetInteger(1,PLOT_LINE_WIDTH,1);             // толщина линии
*/
//--- точность отображения значений индикатора
   IndicatorSetInteger(INDICATOR_DIGITS,2);
/*
//--- горизонтальные уровни
   IndicatorSetInteger(INDICATOR_LEVELS,2);                // количество уровней на окне индикатора
   IndicatorSetDouble(INDICATOR_LEVELVALUE,0,-25);         // значение уровня #0 на вертикальной оси
   IndicatorSetDouble(INDICATOR_LEVELVALUE,1,25);          // значение уровня #1 на вертикальной оси
   IndicatorSetInteger(INDICATOR_LEVELCOLOR,Silver);       // цвет для вывода линии уровня
   IndicatorSetInteger(INDICATOR_LEVELSTYLE,STYLE_DOT);    // стиль линии уровня: STYLE_DOT - пунктирная линия
   IndicatorSetInteger(INDICATOR_LEVELWIDTH,1);            // толщина линии уровня
   IndicatorSetString(INDICATOR_LEVELTEXT,0,"Oversold");   // описание уровня #0 "Перепроданность"
   IndicatorSetString(INDICATOR_LEVELTEXT,1,"Overbought"); // описание уровня #1 "Перекупленность"
//--- ограничения шкалы отдельного окна индикатора
   IndicatorSetDouble(INDICATOR_MINIMUM,-100); // нижнее ограничение шкалы отдельного окна индикатора
   IndicatorSetDouble(INDICATOR_MAXIMUM,100);  // верхнее ограничение шкалы отдельного окна индикатора
*/
//---
   begin1=q-1;         //                                    - значимые данные: MtmBuffer[], AbsMtmBuffer[]
   begin2=begin1+r-1;  // or =(q-1)+(r-1)                    - значимые данные: EMA_...[]
   begin3=begin2+s-1;  // or =(q-1)+(r-1)+(s-1)              - значимые данные: DEMA_...[]
   begin4=begin3+u-1;  // or =(q-1)+(r-1)+(s-1)+(u-1)        - значимые данные: TEMA_...[], MainBuffer[]
   begin5=begin4+ul-1; // or =(q-1)+(r-1)+(s-1)+(u-1)+(ul-1) - значимые данные: SignalBuffer[]
   //
   rates_total_min=begin5+1; // минимальный размер входных таймсерий индикатора
//--- количество начальных баров без отрисовки графического построения #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- количество начальных баров без отрисовки графического построения #1
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,begin5);
//--- краткое имя индикатора
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u)+","+string(ul);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Ergodic("+shortname+")");
//--- OnInit done
   return(0);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(
                const int rates_total,     // размер входных таймсерий
                const int prev_calculated, // обработано баров на предыдущем вызове
                const datetime &Time[],    // Time
                const double &Open[],      // Open
                const double &High[],      // High
                const double &Low[],       // Low
                const double &Close[],     // Close
                const long &TickVolume[],  // Tick Volume
                const long &Volume[],      // Real Volume
                const int &Spread[]        // Spread
               )
  {
   int i,pos;
   double value1,value2;
//--- достаточно ли данных для расчета индикатора
   if(rates_total<rates_total_min) return(0);
//--- расчет массива цен PriceBuffer[]
   CalculatePriceBuffer(
                        AppliedPrice,        // тип цены
                        rates_total,         // размер входных таймсерий
                        prev_calculated,     // обработано баров на предыдущем вызове
                        Open,High,Low,Close, // массивы Open[], High[], Low[], Close[]
                        PriceBuffer          // рассчитываемый массив цен
                       );
//--- расчет mtm и |mtm|
   // определение индекса (pos), с которого начать/продолжить расчет mtm и |mtm|
   // обнуление незначимых элементов массивов MtmBuffer[] и AbsMtmBuffer[]
   if(prev_calculated==0)      // если первый вызов
     {
      pos=begin1;              // то расcчитать все значения, начиная со значимого индекса
      for(i=0;i<pos;i++)       // до значимого индекса
        {
         MtmBuffer[i]=0.0;     // значения обнулить
         AbsMtmBuffer[i]=0.0;  //
        }
     }
   else pos=prev_calculated-1; // иначе рассчитать только последнее значение
   // расчет значимых элементов массивов MtmBuffer[] и AbsMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      MtmBuffer[i]=PriceBuffer[i]-PriceBuffer[i-(q-1)];
      AbsMtmBuffer[i]=MathAbs(MtmBuffer[i]);
     }
//--- сглаживание методом EMA
   // r-периодная 1-я EMA
   ExponentialMAOnBufferWB(
                           rates_total,     // размер входных таймсерий
                           prev_calculated, // обработано баров на предыдущем вызове
                           begin1,          // с какого индекса начинаются значимые данные во входном массиве
                           r,               // период сглаживания
                           MtmBuffer,       // входной массив
                           EMA_MtmBuffer    // выходной массив
                          );
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,AbsMtmBuffer,EMA_AbsMtmBuffer);
   // s-периодная 2-я EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_MtmBuffer,DEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin2,s,EMA_AbsMtmBuffer,DEMA_AbsMtmBuffer);
   // u-периодная 3-я EMA
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_MtmBuffer,TEMA_MtmBuffer);
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin3,u,DEMA_AbsMtmBuffer,TEMA_AbsMtmBuffer);
//--- расчет эргодики (для графического построения #0)
   // определение индекса (pos), с которого начать/продолжить расчет эргодики
   // обнуление незначимых элементов массива MainBuffer[]
   if(prev_calculated==0)      // если первый вызов
     {
      pos=begin4;              // то расcчитывать все значения, начиная со значимого индекса
      for(i=0;i<pos;i++)       // до значимого индекса
         MainBuffer[i]=0.0;    // значения обнулить
     }
   else pos=prev_calculated-1; // иначе рассчитывать только последнее значение
   // расчет значимых элементов массива MainBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      value1=100*TEMA_MtmBuffer[i];
      value2=TEMA_AbsMtmBuffer[i];
      MainBuffer[i]=(value2>0)?value1/value2:0;
     }
//--- расчет Signal Line (для графического построения #1)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin4,ul,MainBuffer,SignalBuffer);
//--- OnCalculate done. Return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

Рассмотрим детально только изменения и добавления в программный код "Blau_TSI.mq5".

1.4.3.1. Настройки индикатора Ergodic(price,q,r,s,u,ul) (изменения и добавления в программный код "Blau_TSI.mq5")

Настройки индикатора (общие положения)

Настройки индикатора Ergodic(price,q,r,s,u,ul) отличаются от настроек индикатора TSI(price,q,r,s,u) (см. рис. 1.9):

  1. Указать окно для отображения индикатора (не изменилось).
  2. Указать количество графических построений (добавлено графическое построение).
  3. Указать количество индикаторных буферов (количество буферов увеличилось).
  4. Объявить индикаторные массивы (добавлен массив).
  5. Установить связь: индикаторный массив –> индикаторный буфер –> графическое построение (реструктуризация).
  6. Описать свойства каждого графического построения (изменены свойства; добавлено графическое построение).
  7. Указать точность отображения значений индикатора (не изменилось).
  8. Указать для каждого графического построения количество начальных баров без отрисовки графического построения (добавлено графическое построение).
  9. Установить горизонтальные уровни и описать свойства каждого горизонтального уровня (не изменилось).
  10. Установить ограничения шкалы отдельного окна индикатора (не изменилось).
  11. Указать краткое имя индикатора (изменено имя).

Настройки индикатора Ergodic(price,q,r,s,u,ul)

Рис. 1.9. Настройки индикатора Ergodic(price,q,r,s,u,ul)


Настройки (изменения)

В программный код "Blau_TSI.mq5" внесены следующие изменения.

1. Изменено краткое описание mql5-программы:

#property description "Ergodic Oscillator (William Blau)"       // краткое описание mql5-программы

2. Добавлен входной параметр:

input int    ul=3; // ul - (сигнальная линия) период EMA, применительно к эргодике

3. (к настройке 11) Изменено краткое имя индикатора:

//--- краткое имя индикатора
   string shortname=PriceName(AppliedPrice)+","+string(q)+","+string(r)+","+string(s)+","+string(u)+","+string(ul);
   IndicatorSetString(INDICATOR_SHORTNAME,"Blau_Ergodic("+shortname+")");
Настройки (изменения): Графические построения (2, 6)

1. (к настройке 2) Добавлено еще одно графическое построение (сигнальная линия):

#property indicator_plots   2              // количество графических построений в индикаторе

2. (к настройке 6) а) Изменены свойства первого графического построения #0 "Ergodic".

Ранее в качестве способа отображения использовалась линия (идентификатор DRAW_LINE), теперь в качестве способа отображения выбрана гистограмма от нулевой линии (идентификатор DRAW_HISTOGRAM перечисления ENUM_DRAW_TYPE).

Изменены цвет для вывода линий и толщина линий:

//--- графическое построение #0 (Main)
#property indicator_label1  "Ergodic"      // метка для графического построения #0
#property indicator_type1   DRAW_HISTOGRAM // тип: DRAW_HISTOGRAM - гистограмма от нулевой линии
#property indicator_color1  Silver         // цвет для вывода линии: Silver - серебристый
#property indicator_style1  STYLE_SOLID    // стиль линии: STYLE_SOLID - сплошная линия
#property indicator_width1  2              // толщина линии

б) Добавлено графическое построение #1 "Signal" (сигнальная линия):

//--- графическое построение #1 (Signal Line)
#property indicator_label2  "Signal"       // метка для графического построения #1
#property indicator_type2   DRAW_LINE      // тип: DRAW_LINE - линия
#property indicator_color2  Red            // цвет для вывода линии: Red - красный
#property indicator_style2  STYLE_SOLID    // стиль линии: STYLE_SOLID - сплошная линия
#property indicator_width2  1              // толщина линии
Настройки (изменения): Индикаторные буферы (3–5)

Изменения в настройке "индикаторный массив –> индикаторный буфер –> графическое построение":

1. (к настройке 3) Увеличилось количество буферов:

#property indicator_buffers 11             // количество буферов для расчета индикатора

2. (к настройке 4) Добавлен индикаторный массив, который необходим для расчета и отрисовки значений сигнальной линии:

double SignalBuffer[];      // сигнальная линия ul-периодная EMA от эргодики (для графического построения #1)

3. (к настройке 5) Выполнена реструктуризация связи "индикаторный массив –> индикаторный буфер –> графическое построение":

//--- связь индикаторных буферов с соответствующими динамическими массивами 
   // значения рассчитанного индикатора; предназначены для отрисовки графических построений
   // графическое построение #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                 // эргодика
   // графическое построение #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);               // сигнальная линия: ul-периодная EMA от эргодики
   // буферы для промежуточных расчетов индикатора; не предназначены для отрисовки
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);        // массив цен
   SetIndexBuffer(3,MtmBuffer,INDICATOR_CALCULATIONS);          // q-периодный моментум
   SetIndexBuffer(4,EMA_MtmBuffer,INDICATOR_CALCULATIONS);      // r-периодная 1-я EMA
   SetIndexBuffer(5,DEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // s-периодная 2-я EMA
   SetIndexBuffer(6,TEMA_MtmBuffer,INDICATOR_CALCULATIONS);     // u-периодная 3-я EMA
   SetIndexBuffer(7,AbsMtmBuffer,INDICATOR_CALCULATIONS);       // q-периодный моментум (абсолютное значение)
   SetIndexBuffer(8,EMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);   // r-периодная 1-я EMA (абсолютное значение)
   SetIndexBuffer(9,DEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS);  // s-периодная 2-я EMA (абсолютное значение)
   SetIndexBuffer(10,TEMA_AbsMtmBuffer,INDICATOR_CALCULATIONS); // u-периодная 3-я EMA (абсолютное значение)
Настройки: Количество начальных баров без отрисовки (8)
  • Количество начальных баров без отрисовки графического построения #0 "Ergodic" не изменилось. Методика расчета изложена в п. 1.4.1.1.
  • Методика расчета количества начальных баров без отрисовки графического построения #1 "Signal" аналогичная. Массив SignalBuffer[] - это результат сглаживания значимых данных массива MainBuffer[] (период сглаживания ul).

Поскольку индексация массива MainBuffer[] начинается с 0, значимые данные в массиве MainBuffer[] начинаются с индекса (q–1)+(r–1)+(s–1)+(u–1), то значимые данные в массиве SignalBuffer[] начинаются с индекса (q–1)+(r–1)+(s–1)+(u–1)+(ul–1).

Объявлена глобальная переменная begin5:

int    begin1, begin2, begin3, begin4, begin5; // индекс таймсерии, с которой начинаются значимые данные

Расчет (полный, дополнительно см. в п. 1.4.1.1):

//---
   begin1=q-1;         //                                    - значимые данные: MtmBuffer[], AbsMtmBuffer[]
   begin2=begin1+r-1;  // or =(q-1)+(r-1)                    - значимые данные: EMA_...[]
   begin3=begin2+s-1;  // or =(q-1)+(r-1)+(s-1)              - значимые данные: DEMA_...[]
   begin4=begin3+u-1;  // or =(q-1)+(r-1)+(s-1)+(u-1)        - значимые данные: TEMA_...[], MainBuffer[]
   begin5=begin4+ul-1; // or =(q-1)+(r-1)+(s-1)+(u-1)+(ul-1) - значимые данные: SignalBuffer[]
//--- количество начальных баров без отрисовки графического построения #0
   PlotIndexSetInteger(0,PLOT_DRAW_BEGIN,begin4);
//--- количество начальных баров без отрисовки графического построения #1
   PlotIndexSetInteger(1,PLOT_DRAW_BEGIN,begin5);


1.4.3.2. Расчет индикатора Ergodic(price,q,r,s,u,ul) (изменения и добавления в программный код "Blau_TSI.mq5")

Расчет: Алгоритм

Алгоритм расчета индикатора Ergodic(price,q,r,s,ul):

  1. Проверка достаточно ли данных для расчета индикатора.
  2. Расчет массива цен согласно указанному типу цены - формирование массива PriceBuffer[].
  3. Определение индекса бара, с которого начать/продолжить расчет q-периодного моментума.
  4. Расчет q-периодного моментума и его абсолютного значения - формирование массивов MtmBuffer[] и AbsMtmBuffer[].
  5. Первое сглаживание методом EMA (период r) - формирование массивов EMA_MtmBuffer[] и EMA_AbsMtmBuffer[].
  6. Второе сглаживание методом EMA (период s) - формирование массивов DEMA_MtmBuffer[] и DEMA_AbsMtmBuffer[].
  7. Третье сглаживание методом EMA (период u) - формирование массивов TEMA_MtmBuffer[] и TEMA_AbsMtmBuffer[].
  8. Определение индекса бара, с которого начать/продолжить расчет индекса истинной силы.
  9. Расчет эргодики (индекса истинной силы) - формирование массива MainBuffer[] - расчет значений для отрисовки графического построения #0.
  10. Расчет сигнальной линии - сглаживание эргодики методом EMA (период ul) - формирование массива SignalBuffer[] - расчет значений для отрисовки графического построения #1.

Суть изменений в алгоритме (кратко): а) (см. п. 1) изменилось требование к минимальному размеру входных таймсерий индикатора; б) (см. п. 10) добавлен расчет сигнальной линии.

Расчет (изменения): Проверка достаточно ли данных для расчета индикатора (1)

В алгоритме изменений нет:

//--- достаточно ли данных для расчета индикатора
   if(rates_total<rates_total_min) return(0);

Изменилось значение глобальной переменной rates_total_min (минимальный размер входных таймсерий индикатора; рассчитывается в функции OnInit() обработки события Init):

   rates_total_min=begin5+1; // минимальный размер входных таймсерий индикатора
Расчет: сигнальная линия (10)
//--- расчет Signal Line (для графического построения #1)
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin4,ul,MainBuffer,SignalBuffer);

2. Стохастический моментум

Рассматриваемые индикаторы (см. вложение) разделены на две группы.

I. Индикаторы, основанные на стохастике:

  1. Blau_TStoch.mq5 - стохастик (q-периодный стохастик; сглаженный q-периодный стохастик);
  2. Blau_TStochI.mq5 - индекс стохастика (нормированный сглаженный q-периодный стохастик);
  3. Blau_TS_Stochastic.mq5 - стохастический TS-осциллятор (основан на индексе стохастика).

II. Индикаторы, основанные на стохастическом моментуме:

  1. Blau_SM.mq5 - индикатор стохастического темпа (q-периодный стохастический моментум; сглаженный q-периодный стохастический моментум);
  2. Blau_SMI.mq5 - индекс стохастического темпа (нормированный сглаженный q-периодный стохастический моментум);
  3. Blau_SM_Stochastic.mq5 - стохастический SM-осциллятор (основан на индексе стохастического темпа).


2.1. Индикаторы, основанные на стохастике

В "Руководстве пользователю к клиентскому терминалу MetaTrader" в разделе "Аналитика/Технические индикаторы/Осцилляторы/Stochastic Oscillator" представлено описание встроенного в клиентский терминал MetaTrader 5 технического индикатора стохастический осциллятор (Stochastic Oscillator) и способов его использования в техническом анализе (см. также iStochastic).

 

2.1.1. Стохастический осциллятор Джорджа Лэйна

Стохастик, стохастический осциллятор (Stochastic, Stochastic Oscillator) - это индикатор, который показывает положение цены относительно диапазона колебания цены за предыдущие q периодов. Создатель и популяризатор стохастика Джордж Лэйн (George Lane).

Различают:

  • быстрый стохастик, называемый иногда %K;
  • медленный стохастик (сигнальная линия), называемый иногда %D.

Формула стохастического осциллятора Джорджа Лэйна:

           price - LL(q)
%K = 100 * -------------
           HH(q) - LL(q)
%D = SMA(%k, ul)

где:

  • %K - быстрый стохастик;
  • %D - медленный стохастик (сигнальная линия);
  • price - цена [закрытия] текущего периода;
  • q - число временных периодов ценового графика, участвующих в расчете стохастика;
  • HH(q) - максимальное для предыдущих q периодов значение самой высокой цены за период q;
  • LL(q) - минимальное для предыдущих q периодов значение самой низкой цены за период q;
  • SMA(%K,ul) - простая скользящая средняя порядка ul, примененная к быстрому стохастику (%K).

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

 

2.1.2. Стохастический осциллятор Уильяма Блау


Индикаторы Уильяма Блау, основанные на стохастике

Рис. 2.1. Индикаторы Уильяма Блау, основанные на стохастике

 

2.1.2.1. Стохастик


Стохастик - это расстояние от цены [закрытия] текущего периода до низшей точкой диапазона колебания цены за предыдущие q периодов. Величина q-периодного стохастика показывает, насколько сильно цена смещена относительно низшей точки q-периодного диапазона колебания цены. Значения q-периодного стохастика положительны, либо равны нулю.

Определение стохастика

Рис. 2.2. Определение стохастика

Формула q-периодного стохастика:

stoch(price,q) = price - LL(q)

где:

  • price - цена [закрытия] текущего периода;
  • q - число временных периодов ценового графика, участвующих в расчете стохастика;
  • LL(q) - минимальное для предыдущих q периодов значение самой низкой цены за период q.

Формула сглаженного q-периодного стохастика:

TStoch(price,q,r,s,u) = EMA(EMA(EMA( stoch(price,q) ,r),s),u)

где:

  • price - цена [закрытия] - ценовая база ценового графика;
  • q - число временных периодов ценового графика, участвующих в расчете стохастика;
  • stoch(price,q)=price-LL(q) - q-периодный стохастик;
  • EMA(stoch(price,q),r) - первое сглаживание - экспоненциальная скользящая средняя (экспонента) периода r, примененная к q-периодному стохастику;
  • EMA(EMA(...,r),s) - второе сглаживание - экспонента периода s, примененная к экспоненте периода r;
  • EMA(EMA(EMA(...,r),s),u) - третье сглаживание - экспонента периода u, примененная к результату второго сглаживания.

TStoch(price,q,r,s,u) - стохастик. Спецификация

  • Имя файла: Blau_TStoch.mq5
  • Наименование: Индикатор стохастика (q-периодный стохастик; сглаженный q-периодный стохастик) по Уильяму Блау.
  • Входные параметры:
    • q - период, по которому вычисляется стохастик (по умолчанию q=5);
    • r - период 1-й EMA, применительно к стохастику (по умолчанию r=20);
    • s - период 2-й EMA, применительно к результату первого сглаживания (по умолчанию s=5);
    • u - период 3-й EMA, применительно к результату второго сглаживания (по умолчанию u=3);
    • AppliedPrice - тип цены (по умолчанию AppliedPrice=PRICE_CLOSE).
  • Дополнительно:
    • выводится в отдельном окне;
    • изменить стиль отрисовки графического построения - цвет, толщину, стиль линии (вкладка "Цвета").
  • Ограничения:
    • q>0;
    • r>0, s>0, u>0. Если r, s или u равны 1, то на соответствующем периоде EMA сглаживание не выполняется;
    • минимальный размер массива цен =(q-1+r+s+u-3+1).

 

2.1.2.2. Индекс стохастика

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

Величины сглаженного q-периодного стохастика приведены к процентному формату (интервал отображения [0,+100]). Каждая величина сглаженного q-периодного стохастика нормируется на величину q-периодного диапазона колебания цены. Нормировка позволяет интерпретировать значение нормированного сглаженного q-периодного стохастика как степень перекупленности/перепроданности рынка.

Формула индекса стохастика:

                         100 * EMA(EMA(EMA( price-LL(q) ,r),s),u)       100 * TStoch(price,q,r,s,u)
TStochI(price,q,r,s,u) = ---------------------------------------- = ----------------------------------
                            EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)      EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)
если EMA(EMA(EMA(HH(q)-LL(q),r),s),u)=0, то TStochI(price,q,r,s,u)=0

где:

  • price - цена [закрытия] - ценовая база ценового графика;
  • q - число временных периодов ценового графика, участвующих в расчете стохастика;
  • LL(q) - минимальное для предыдущих q периодов значение самой низкой цены за период q;
  • HH(q) - максимальное для предыдущих q периодов значение самой высокой цены за период q;
  • stoch(q)=price-LL(q) - q-периодный стохастик;
  • TStoch(price,q,r,s,u) - трижды сглаженный q-периодный стохастик;
  • HH(q)-LL(q) - q-периодный диапазон колебания цены;
  • EMA(...,r) - первое сглаживание - экспоненциальная скользящая средняя (экспонента) периода r, примененная к показателю [соответственно: 1) к q-периодному стохастику и 2) к q-периодному диапазону колебания цены];
  • EMA(EMA(...,r),s) - второе сглаживание - экспонента периода s, примененная к экспоненте периода r;
  • EMA(EMA(EMA(...,r),s),u) - третье сглаживание - экспонента периода u, примененная к результату второго сглаживания.

TStochI(price,q,r,s,u) - индекс стохастика. Спецификация

  • Имя файла: Blau_TStochI.mq5
  • Наименование: Индекс стохастика (нормированный сглаженный q-периодный стохастик) по Уильяму Блау.
  • Входные параметры:
    • q - период, по которому вычисляется стохастик (по умолчанию q=5);
    • r - период 1-й EMA, применительно к стохастику (по умолчанию r=20);
    • s - период 2-й EMA, применительно к результату первого сглаживания (по умолчанию s=5);
    • u - период 3-й EMA, применительно к результату второго сглаживания (по умолчанию u=3);
    • AppliedPrice - тип цены (по умолчанию AppliedPrice=PRICE_CLOSE).
  • Дополнительно:
    • выводится в отдельном окне;
    • изменить стиль отрисовки графического построения - цвет, толщину, стиль линии (вкладка "Цвета");
    • (не обязательно) два уровня (по умолчанию +40 и +60) - добавить/удалить уровень; изменить значение, описание уровня; изменить стиль отрисовки уровней (вкладка "Уровни");
    • изменить нижнее (по умолчанию 0) и верхнее (по умолчанию +100) ограничения шкалы отдельного окна индикатора (вкладка "Шкала").
  • Ограничения:
    • q>0;
    • r>0, s>0, u>0. Если r, s или u равны 1, то на соответствующем периоде EMA сглаживание не выполняется;
    • минимальный размер массива цен =(q-1+r+s+u-3+1).

 

2.1.2.3. Стохастический осциллятор

Определение стохастического осциллятора:

TS_Stochastic(price,q,r,s,u) = TStochI(price,q,r,s,u)
SignalLine(price,q,r,s,u,ul) = EMA( TS_Stochastic(price,q,r,s,u) ,ul)

где:

  • TS_Stochastic() - быстрый стохастик, %k - индекс стохастика TStochI(price,q,r,s,u);
  • SignalLine() - медленный стохастик (сигнальная линия), %d - экспоненциальная скользящая средняя периода ul, примененная к быстрому стохастику (%k);
  • ul - период EMA сигнальной линии - по Уильяму Блау значение ul должно быть равно периоду последней значимой (>1) EMA быстрого стохастика.

TS_Stochastic(price,q,r,s,u,ul) - стохастический осциллятор. Спецификация

  • Имя файла: Blau_TS_Stochastic.mq5
  • Наименование: Стохастический осциллятор (основан на индексе стохастика) по Уильяму Блау.
  • Входные параметры:
    • графическое построение #0 - быстрый стохастик (индекс стохастика), %k:
      • q - период, по которому вычисляется стохастик (по умолчанию q=5);
      • r - период 1-й EMA, применительно к стохастику (по умолчанию r=20);
      • s - период 2-й EMA, применительно к результату первого сглаживания (по умолчанию s=5);
      • u - период 3-й EMA, применительно к результату второго сглаживания (по умолчанию u=3);
    • графическое построение #1 - медленный стохастик (сигнальная линия), %d:
      • ul - период EMA сигнальной линии, применительно к быстрому стохастику (по умолчанию ul=3);
    • AppliedPrice - тип цены (по умолчанию AppliedPrice=PRICE_CLOSE).
  • Дополнительно:
    • выводится в отдельном окне;
    • изменить стиль отрисовки каждого графического построения - цвет, толщину, стиль линии (вкладка "Цвета");
    • два уровня (по умолчанию +40 и +60) - добавить/удалить уровень; изменить значение, описание уровня; изменить стиль отрисовки уровней (вкладка "Уровни");
    • изменить нижнее (по умолчанию 0) и верхнее (по умолчанию +100) ограничения шкалы отдельного окна индикатора (вкладка "Шкала").
  • Ограничения:
    • q>0;
    • r>0, s>0, u>0. Если r, s или u равны 1, то на соответствующем периоде EMA сглаживание не выполняется;
    • ul>0. Если ul=1, то медленный стохастик (сигнальная линия) совпадает с быстрым стохастиком;
    • минимальный размер массива цен =(q-1+r+s+u+ul-4+1).

 

2.1.2.4. Преемственность


Стохастический осциллятор Уильяма Блау включает в себя стохастический осциллятор Джорджа Лэйна. Чтобы TS_Stochastic (Уильям Блау) соответствовал стохастическому осциллятору (Джордж Лэйн), который реализован в MetaTrader 5, необходимо задать:

TS_Stochastic( price=Close, q=KPeriod, r=1, s=1, u=1, ul=DPeriod )
Stochastic( KPeriod=q, DPeriod=ul, Slowing=1, цена="Low/High", метод="Exponential" )

>Стохастический осциллятор Уильяма Блау включает в себя стохастический осциллятор Джорджа Лэйна

Рис. 2.3. Стохастический осциллятор Уильяма Блау включает в себя стохастический осциллятор Джорджа Лэйна

 

2.1.2.5. Программный код стохастического осциллятора


На примере индикатора TS_Stochastic(price,q,r,s,u,ul):

1) Связь между индикаторными массивами, индикаторными буферами и графическими построениями:

//--- связь индикаторных буферов с соответствующими динамическими массивами 
   // значения рассчитанного индикатора; предназначены для отрисовки графических построений
   // графическое построение #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);               // быстрый стохастик
   // графическое построение #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);             // медленный стохастик: ul-периодная EMA от быстрого стохастика
   // буферы для промежуточных расчетов индикатора; не предназначены для отрисовки
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);      // массив цен
   SetIndexBuffer(3,LLBuffer,INDICATOR_CALCULATIONS);         // минимальное значение самой низкой цены за период q
   SetIndexBuffer(4,HHBuffer,INDICATOR_CALCULATIONS);         // максимальное значение самой высокой цены за период q
   SetIndexBuffer(5,StochBuffer,INDICATOR_CALCULATIONS);      // q-периодный стохастик
   SetIndexBuffer(6,EMA_StochBuffer,INDICATOR_CALCULATIONS);  // r-периодная 1-я EMA
   SetIndexBuffer(7,DEMA_StochBuffer,INDICATOR_CALCULATIONS); // s-периодная 2-я EMA
   SetIndexBuffer(8,TEMA_StochBuffer,INDICATOR_CALCULATIONS); // u-периодная 3-я EMA
   SetIndexBuffer(9,HHLLBuffer,INDICATOR_CALCULATIONS);       // q-периодный диапазон колебания цены
   SetIndexBuffer(10,EMA_HHLLBuffer,INDICATOR_CALCULATIONS);  // r-периодная 1-я EMA (диапазон колебания цены)
   SetIndexBuffer(11,DEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // s-периодная 2-я EMA (диапазон колебания цены)
   SetIndexBuffer(12,TEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // u-периодная 3-я EMA (диапазон колебания цены)

2) Алгоритм расчета q-периодного стохастика и q-периодного диапазона колебания цены:

//--- расчет q-периодного стохастика и q-периодного диапазона колебания цены
   // расчет значимых элементов массивов StochBuffer[], HHLLBuffer[], LLBuffer[], HHBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      // расчет LLBuffer[] - поиск минимального значения самой низкой цены за период q
      // расчет HHBuffer[] - поиск максимального значения самой высокой цены за период q
      min=1000000.0;
      max=-1000000.0;
      for(k=i-(q-1);k<=i;k++)
        {
         if(min>Low[k])  min=Low[k];
         if(max<High[k]) max=High[k];
        }
      LLBuffer[i]=min;
      HHBuffer[i]=max;
      // расчет StochBuffer[] - q-периодный стохастик
      StochBuffer[i]=PriceBuffer[i]-LLBuffer[i];
      // расчет HHLLBuffer[] - q-периодный диапазон колебания цены
      HHLLBuffer[i]=HHBuffer[i]-LLBuffer[i];
     }

2.2. Индикаторы, основанные на стохастическом моментуме

Индикаторы Уильяма Блау, основанные на стохастическом моментуме

Рис. 2.4. Индикаторы Уильяма Блау, основанные на стохастическом моментуме

 

2.2.1. Стохастический моментум

Стохастический моментум (Stochastic Momentum, SM) - это расстояние от цены [закрытия] текущего периода до середины диапазона колебания цены за предыдущие q периодов. Величина q-периодного стохастического моментума показывает, насколько сильно цена смещена относительно середины q-периодного диапазона колебания цены.

Знак q-периодного стохастического моментума показывает положение цены относительно середины q-периодного диапазона колебания цены: положительный стохастический моментум - цена выше средней точки, отрицательный - цена ниже средней точки.

Определение стохастического моментума

Рис. 2.5. Определение стохастического моментума

Формула q-периодного стохастического моментума:

sm(price,q) = price - 1/2 * [LL(q) + HH(q)]

где:

  • price - цена [закрытия] текущего периода;
  • q - число временных периодов ценового графика, участвующих в расчете стохастического моментума;
  • LL(q) - минимальное для предыдущих q периодов значение самой низкой цены за период q;
  • HH(q) - максимальное для предыдущих q периодов значение самой высокой цены за период q;
  • 1/2*[LL(q)+HH(q)] - середина q-периодного диапазона колебания цены.

Формула сглаженного q-периодного стохастического моментума:

SM(price,q,r,s,u) = EMA(EMA(EMA( sm(price,q) ,r),s),u)

где:

  • price - цена [закрытия] - ценовая база ценового графика;
  • q - число временных периодов ценового графика, участвующих в расчете стохастического моментума;
  • sm(price,q)=price-1/2*[LL(q)+HH(q)] - q-периодный стохастический моментум;
  • EMA(sm(price,q),r) - первое сглаживание - экспоненциальная скользящая средняя (экспонента) периода r, примененная к q-периодному стохастическому моментуму;
  • EMA(EMA(...,r),s) - второе сглаживание - экспонента периода s, примененная к экспоненте периода r;
  • EMA(EMA(EMA(sm(q),r),s),u) - третье сглаживание - экспонента периода u, примененная к результату второго сглаживания.


2.2.1.2. SM(price,q,r,s,u) - индикатор стохастического темпа (стохастический моментум). Спецификация

  • Имя файла: Blau_SM.mq5
  • Наименование: Индикатор стохастического темпа (q-периодный стохастический моментум; сглаженный q-периодный стохастический моментум) по Уильяму Блау.
  • Входные параметры:
    • q - период, по которому вычисляется стохастический моментум (по умолчанию q=5);
    • r - период 1-й EMA, применительно к стохастическому моментуму (по умолчанию r=20);
    • s - период 2-й EMA, применительно к результату первого сглаживания (по умолчанию s=5);
    • u - период 3-й EMA, применительно к результату второго сглаживания (по умолчанию u=3);
    • AppliedPrice - тип цены (по умолчанию AppliedPrice=PRICE_CLOSE).
  • Дополнительно:
    • выводится в отдельном окне;
    • изменить стиль отрисовки графического построения - цвет, толщину, стиль линии (вкладка "Цвета").
  • Ограничения:
    • q>0;
    • r>0, s>0, u>0. Если r, s или u равны 1, то на соответствующем периоде EMA сглаживание не выполняется;
    • минимальный размер массива цен =(q-1+r+s+u-3+1).

 

2.2.2. Индекс стохастического темпа

Индекс стохастического темпа (Stochastic Momentum Index, SMI) - это индикатор нормированного стохастического темпа (нормированный сглаженный q-периодный стохастический моментум). Величины сглаженного q-периодного стохастического моментума приведены к процентному формату (интервал отображения [–100,+100]).

Каждая величина сглаженного q-периодного стохастического моментума нормируется на величину половины q-периодного диапазона колебания цены. Нормировка позволяет  интерпретировать значение SMI как степень перекупленности (положительное значение) или перепроданности (отрицательное значение) рынка.

Формула индекса стохастического темпа:

                     100 * EMA(EMA(EMA( price-1/2*[LL(q)+HH(q)] ,r),s),u)           100 * SM(price,q,r,s,u)
SMI(price,q,r,s,u) = ---------------------------------------------------- = ----------------------------------------
                           EMA(EMA(EMA( 1/2*[HH(q)-LL(q)] ,r),s),u)         EMA(EMA(EMA( 1/2*[HH(q)-LL(q)] ,r),s),u)
если EMA(EMA(EMA(1/2*[HH(q)-LL(q)],r),s),u)=0, то SMI(price,q,r,s,u)=0

где:

  • price - цена [закрытия] - ценовая база ценового графика;
  • LL(q) - минимальное для предыдущих q периодов значение самой низкой цены за период q;
  • HH(q) - максимальное для предыдущих q периодов значение самой высокой цены за период q;
  • sm(price,q)=price-1/2*[LL(q)+HH(q)] - q-периодный стохастический моментум;
  • SM(price,q,r,s,u) - трижды сглаженный q-периодный стохастический моментум;
  • HH(q)-LL(q) - q-периодный диапазон колебания цены;
  • 1/2*[LL(q)+HH(q)] - середина q-периодного диапазона колебания цены;
  • 1/2*[HH(q)-LL(q)] - половина q-периодного диапазона колебания цены;
  • EMA(...,r) - первое сглаживание - экспоненциальная скользящая средняя (экспонента) периода r, примененная к показателю [соответственно: 1) к q-периодному стохастическому моментуму и 2) к половине q-периодного диапазона колебания цены];
  • EMA(EMA(...,r),s) - второе сглаживание - экспонента периода s, примененная к экспоненте периода r;
  • EMA(EMA(EMA(...,r),s),u) - третье сглаживание - экспонента периода u, примененная к результату второго сглаживания.


2.2.2.2. SMI(price,q,r,s,u) - индекс стохастического темпа. Спецификация

  • Имя файла: Blau_SMI.mq5
  • Наименование: Индекс стохастического темпа (нормированный сглаженный q-периодный стохастический моментум) по Уильяму Блау.
  • Входные параметры:
    • q - период, по которому вычисляется стохастический моментум (по умолчанию q=5);
    • r - период 1-й EMA, применительно к стохастическому моментуму (по умолчанию r=20);
    • s - период 2-й EMA, применительно к результату первого сглаживания (по умолчанию s=5);
    • u - период 3-й EMA, применительно к результату второго сглаживания (по умолчанию u=3);
    • AppliedPrice - тип цены (по умолчанию AppliedPrice=PRICE_CLOSE).
  • Дополнительно:
    • выводится в отдельном окне;
    • изменить стиль отрисовки графического построения - цвет, толщину, стиль линии (вкладка "Цвета");
    • (не обязательно) два уровня (по умолчанию –40 и +40) - добавить/удалить уровень; изменить значение, описание уровня; изменить стиль отрисовки уровней (вкладка "Уровни");
    • изменить нижнее (по умолчанию –100) и верхнее (по умолчанию +100) ограничения шкалы отдельного окна индикатора (вкладка "Шкала").
  • Ограничения:
    • q>0;
    • r>0, s>0, u>0. Если r, s или u равны 1, то на соответствующем периоде EMA сглаживание не выполняется;
    • минимальный размер массива цен =(q-1+r+s+u-3+1).

 

2.2.3. Стохастический осциллятор

Определение стохастического осциллятора:
SM_Stochastic(price,q,r,s,u) = SMI(price,q,r,s,u)
SignalLine(price,q,r,s,u,ul) = EMA( SM_Stochastic(price,q,r,s,u) ,ul)

где:

  • SM_Stochastic() - индекс стохастического темпа SMI(price,q,r,s,u);
  • SignalLine() - сигнальная линия - экспоненциальная скользящая средняя периода ul, примененная к индексу стохастического темпа;
  • ul - период EMA сигнальной линии - по Уильяму Блау значение ul должно быть равно периоду последней значимой (>1) EMA индекса стохастического темпа.


2.2.3.1. SM_Stochastic(price,q,r,s,u,ul) - стохастический осциллятор. Спецификация

  • Имя файла: Blau_SM_Stochastic.mq5
  • Наименование: Стохастический осциллятор (основан на стохастическом моментуме) по Уильяму Блау.
  • Входные параметры:
    • графическое построение #0 - индекс стохастического темпа:
      • q - период, по которому вычисляется стохастический моментум (по умолчанию q=5);
      • r - период 1-й EMA, применительно к стохастическому моментуму (по умолчанию r=20);
      • s - период 2-й EMA, применительно к результату первого сглаживания (по умолчанию s=5);
      • u - период 3-й EMA, применительно к результату второго сглаживания (по умолчанию u=3);
    • графическое построение #1 - сигнальная линия:
      • ul - период EMA сигнальной линии, применительно к индексу стохастического темпа (по умолчанию ul=3);
    • AppliedPrice - тип цены (по умолчанию AppliedPrice=PRICE_CLOSE).
  • Дополнительно:
    • выводится в отдельном окне;
    • изменить стиль отрисовки каждого графического построения - цвет, толщину, стиль линии (вкладка "Цвета");
    • два уровня (по умолчанию –40 и +40) - добавить/удалить уровень; изменить значение, описание уровня; изменить стиль отрисовки уровней (вкладка "Уровни");
    • изменить нижнее (по умолчанию –100) и верхнее (по умолчанию +100) ограничения шкалы отдельного окна индикатора (вкладка "Шкала").
  • Ограничения:
    • q>0;
    • r>0, s>0, u>0. Если r, s или u равны 1, то на соответствующем периоде EMA сглаживание не выполняется;
    • ul>0. Если ul=1, то сигнальная линия совпадает с индексом стохастического темпа;
    • минимальный размер массива цен =(q-1+r+s+u+ul-4+1).

 

2.2.4. Программный код стохастического осциллятора

На примере индикатора SM_Stochastic(price,q,r,s,u,ul):

1) Связь между индикаторными массивами, индикаторными буферами и графическими построениями:

//--- связь индикаторных буферов с соответствующими динамическими массивами 
   // значения рассчитанного индикатора; предназначены для отрисовки графических построений
   // графическое построение #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                   // индекс стохастического моментума
   // графическое построение #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);                 // сигнальная линия: ul-периодная EMA от индекса стохастического моментума
   // буферы для промежуточных расчетов индикатора; не предназначены для отрисовки
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);          // массив цен
   SetIndexBuffer(3,LLBuffer,INDICATOR_CALCULATIONS);             // минимальное значение самой низкой цены за период q
   SetIndexBuffer(4,HHBuffer,INDICATOR_CALCULATIONS);             // максимальное значение самой высокой цены за период q
   SetIndexBuffer(5,SMBuffer,INDICATOR_CALCULATIONS);             // q-периодный стохастический моментум
   SetIndexBuffer(6,EMA_SMBuffer,INDICATOR_CALCULATIONS);         // r-периодная 1-я EMA
   SetIndexBuffer(7,DEMA_SMBuffer,INDICATOR_CALCULATIONS);        // s-периодная 2-я EMA
   SetIndexBuffer(8,TEMA_SMBuffer,INDICATOR_CALCULATIONS);        // u-периодная 3-я EMA
   SetIndexBuffer(9,HalfHHLLBuffer,INDICATOR_CALCULATIONS);       // половина q-периодного диапазона колебания цены
   SetIndexBuffer(10,EMA_HalfHHLLBuffer,INDICATOR_CALCULATIONS);  // r-периодная 1-я EMA (половина диапазона колебания цены)
   SetIndexBuffer(11,DEMA_HalfHHLLBuffer,INDICATOR_CALCULATIONS); // s-периодная 2-я EMA (половина диапазона колебания цены)
   SetIndexBuffer(12,TEMA_HalfHHLLBuffer,INDICATOR_CALCULATIONS); // u-периодная 3-я EMA (половина диапазона колебания цены)

2) Алгоритм расчета q-периодного стохастического моментума и половины q-периодного диапазона колебания цены:

//--- расчет q-периодного стохастического моментума и половины q-периодного диапазона колебания цены
   // определение индекса (pos), с которого начать/продолжить расчет стохастического моментума и половины диапазона колебания цены
   // обнуление незначимых элементов массивов SMBuffer[], HalfHHLLBuffer[], LLBuffer[], HHBuffer[]
   if(prev_calculated==0)       // если первый вызов
     {
      pos=begin1;               // то расcчитать все значения, начиная со значимого индекса
      for(i=0;i<pos;i++)        // до значимого индекса
        {
         SMBuffer[i]=0.0;       // значения обнулить
         HalfHHLLBuffer[i]=0.0; //
         LLBuffer[i]=0.0;       //
         HHBuffer[i]=0.0;       //
        }
     }
   else pos=prev_calculated-1;  // иначе рассчитать только последнее значение
   // расчет значимых элементов массивов SMBuffer[], HalfHHLLBuffer[], LLBuffer[], HHBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      // расчет LLBuffer[] - поиск минимального значения самой низкой цены за период q
      // расчет HHBuffer[] - поиск максимального значения самой высокой цены за период q
      min=1000000.0;
      max=-1000000.0;
      for(k=i-(q-1);k<=i;k++)
        {
         if(min>Low[k])  min=Low[k];
         if(max<High[k]) max=High[k];
        }
      LLBuffer[i]=min;
      HHBuffer[i]=max;
      // расчет SMBuffer[] - q-периодный стохастический моментум
      SMBuffer[i]=PriceBuffer[i]-0.5*(LLBuffer[i]+HHBuffer[i]);
      // расчет HalfHHLLBuffer[] - половина q-периодного диапазона колебания цены
      HalfHHLLBuffer[i]=0.5*(HHBuffer[i]-LLBuffer[i]);
     }

3. Индикатор отклонения от тенденции

Рассматриваемые индикаторы (см. вложение) разделены на две группы.

I. Индикаторы, основанные на отклонении от тенденции развития рынка.

  1. Blau_MDI.mq5 - индикатор среднего отклонения от тенденции (среднее отклонение; сглаженное среднее отклонение);
  2. Blau_Ergodic_MDI.mq5 - эргодический MDI-осциллятор (основан на индикаторе среднего отклонения).

II. Индикаторы, основанные на схождении/расхождении скользящих средних.

  1. Blau_MACD.mq5 - индикатор схождения/расхождения скользящих средних (MACD; сглаженный MACD);
  2. Blau_Ergodic_MACD.mq5 - эргодический MACD-осциллятор (основан на индикаторе схождения/расхождения скользящих средних).


3.1. Индикаторы, основанные на отклонении от тенденции развития рынка

 

Индикаторы Уильяма Блау, основанные на отклонении от тенденции развития рынка

Рис. 3.1. Индикаторы Уильяма Блау, основанные на отклонении от тенденции развития рынка

 

3.1.1. Индикатор среднего отклонения от тенденции

Среднее отклонение от тенденции (метод "исключения тенденции") - это расстояние цены [закрытия] до экспоненциальной скользящей средней (экспоненты) периода r, примененной к цене [закрытия].

Тенденция развития рынка: экспонента периода r, примененная к цене, используется для определения тенденции роста (экспонента растет) или снижения (экспонента снижается) цены.

Скользящее среднее сглаживает кривую цены, но незначительное увеличение периода скользящей средней порождает запаздывание, которое хорошо видно в точках разворота цены (см. дополнительно п. 1.1.1, рис. 1.2). Величина среднего отклонения от тенденции показывает, насколько сильно цена смещена относительно r-периодной экспоненты, примененной к цене.

Знак среднего отклонения от тенденции показывает положение цены относительно r-периодной экспоненты, примененной к цене: положительное отклонение от тенденции - цена выше экспоненты; отрицательное - цена ниже экспоненты.

Формула среднего отклонения от тенденции:

md(price,r) = price - EMA(price,r)

где:

  • price - цена [закрытия] текущего периода;
  • EMA(price,r) - тенденция развития рынка - экспоненциальная скользящая средняя периода r, примененная к цене.

Показатель "Среднее отклонение от тенденции" присутствует под названием "Ошибка отклонения цены от значения EMA" в ряде технических индикаторов, встроенных в клиентский терминал MetaTrader 5. См. в "Руководстве пользователю к клиентскому терминалу MetaTrader" в разделе "Аналитика/Технические индикаторы/Трендовые индикаторы":

  1. Double Exponential Moving Average, DEMA;
  2. Triple Exponential Moving Average, TEMA.

Подобный показатель использует Александр Элдер в своих индикаторах Bears Power и Bulls Power. См. в "Руководстве пользователю к клиентскому терминалу MetaTrader" в разделе "Аналитика/Технические индикаторы/Осцилляторы":

  1. Bears Power;
  2. Bulls Power.

Индикатор среднего отклонения от тенденции (Mean Deviation Index, MDI) - это сглаженное среднее отклонение от тенденции развития рынка.

Формула индикатора среднего отклонения от тенденции:

MDI(price,r,s,u) = EMA(EMA( md(price,r) ,s),u) = EMA(EMA( price-EMA(price,r) ,s),u)

где:

  • price - цена [закрытия] - ценовая база ценового графика;
  • EMA(price,r) - тенденция развития рынка - первое сглаживание - экспоненциальная скользящая средняя (экспонента) периода r, примененная к цене;
  • md(price,r)=price-EMA(price,r) - среднее отклонение от тенденции - отклонение цены от экспоненты периода r, примененной к цене;
  • EMA(md(price,r),s) - второе сглаживание - экспонента периода s, примененная к среднему отклонению от тенденции;
  • EMA(EMA(md(price,r),s),u) - третье сглаживание - экспонента периода u, примененная к результату второго сглаживания.


3.1.1.3. MDI(price,r,s,u) - индикатор среднего отклонения. Спецификация

  • Имя файла: Blau_MDI.mq5
  • Наименование: Индикатор среднего отклонения от тенденции развития рынка (среднее отклонение; сглаженное среднее отклонение) по Уильяму Блау.
  • Входные параметры:
    • r - период 1-й EMA, применительно к цене (по умолчанию r=20);
    • s - период 2-й EMA, применительно к среднему отклонению (по умолчанию s=5);
    • u - период 3-й EMA, применительно к результату второго сглаживания (по умолчанию u=3);
    • AppliedPrice - тип цены (по умолчанию AppliedPrice=PRICE_CLOSE).
  • Дополнительно:
    • выводится в отдельном окне;
    • изменить стиль отрисовки графического построения - цвет, толщину, стиль линии (вкладка "Цвета").
  • Ограничения:
    • r>1;
    • s>0, u>0. Если s или u равны 1, то на соответствующем периоде EMA сглаживание не выполняется;
    • минимальный размер массива цен =(r+s+u-3+1).

 

3.1.2. Эргодический MDI-осциллятор

Определение эргодического MDI-осциллятора:
Ergodic_MDI(price,r,s,u) = MDI(price,r,s,u)
SignalLine(price,r,s,u,ul) = EMA( Ergodic_MDI(price,r,s,u) ,ul)

где:

  • Ergodic_MDI() - эргодика - индикатор среднего отклонения от тенденции MDI(price,r,s,u);
  • SignalLine() - сигнальная линия - экспоненциальная скользящая средняя периода ul, примененная к эргодике;
  • ul - период EMA сигнальной линии - по Уильяму Блау значение ul должно быть равно периоду последней значимой (>1) EMA эргодики.


3.1.2.2. Ergodic_MDI(price,r,s,u,ul) - эргодический MDI-осциллятор. Спецификация

  • Имя файла: Blau_Ergodic_MDI.mq5
  • Наименование: Эргодический MDI-осциллятор (основан на индикаторе среднего отклонения) по Уильяму Блау.
  • Входные параметры:
    • графическое построение #0 - эргодика (индикатор среднего отклонения от тенденции):
      • r - период 1-й EMA, применительно к цене (по умолчанию r=20);
      • s - период 2-й EMA, применительно к среднему отклонению (по умолчанию s=5);
      • u - период 3-й EMA, применительно к результату второго сглаживания (по умолчанию u=3);
    • графическое построение #1 - сигнальная линия:
      • ul - период EMA сигнальной линии, применительно к эргодике (по умолчанию ul=3);
    • AppliedPrice - тип цены (по умолчанию AppliedPrice=PRICE_CLOSE).
  • Дополнительно:
    • выводится в отдельном окне;
    • изменить стиль отрисовки каждого графического построения - цвет, толщину, стиль линии (вкладка "Цвета").
  • Ограничения:
    • r>1;
    • s>0, u>0. Если s или u равны 1, то на соответствующем периоде EMA сглаживание не выполняется;
    • ul>0. Если ul=1, то сигнальная линия совпадает с эргодикой;
    • минимальный размер массива цен =(r+s+u+ul-4+1).

 

3.1.3. Программный код эргодического осциллятора

На примере индикатора Ergodic_MDI(price,r,s,u,ul):

1) Связь между индикаторными массивами, индикаторными буферами и графическими построениями:

//--- связь индикаторных буферов с соответствующими динамическими массивами 
   // значения рассчитанного индикатора; предназначены для отрисовки графических построений
   // графическое построение #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);             // эргодика: u-периодная 3-я EMA
   // графическое построение #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);           // сигнальная линия: ul-периодная EMA от эргодики
   // буферы для промежуточных расчетов индикатора; не предназначены для отрисовки
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);     // массив цен
   SetIndexBuffer(3,EMA_PriceBuffer,INDICATOR_CALCULATIONS); // r-периодная 1-я EMA (к цене)
   SetIndexBuffer(4,MDBuffer,INDICATOR_CALCULATIONS);        // среднее отклонение
   SetIndexBuffer(5,DEMA_MDBuffer,INDICATOR_CALCULATIONS);   // s-периодная 2-я EMA

2) Алгоритм расчета среднего отклонения:

//--- расчет среднего отклонения
   // определение индекса (pos), с которого начать/продолжить расчет среднего отклонения
   // обнуление незначимых элементов массива MDBuffer[]
   if(prev_calculated==0)      // если первый вызов
     {
      pos=begin2;              // то расcчитывать все значения, начиная со значимого индекса
      for(i=0;i<pos;i++)       // до значимого индекса
         MDBuffer[i]=0.0;      // значения обнулить
     }
   else pos=prev_calculated-1; // иначе рассчитывать только последнее значение
   // r-периодная 1-я EMA: расчет значимых (обнуление незначимых) элементов массива EMA_PriceBuffer[]
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,PriceBuffer,EMA_PriceBuffer);
   // расчет значимых элементов массива MDBuffer[]
   for(i=pos;i<rates_total;i++)
      MDBuffer[i]=PriceBuffer[i]-EMA_PriceBuffer[i];


3.2. Индикаторы, основанные на схождении/расхождении скользящих средних

 

Индикаторы Уильяма Блау, основанные на схождении/расхождении скользящих средних

Рис. 3.2. Индикаторы Уильяма Блау, основанные на схождении/расхождении скользящих средних

 

3.2.1. Индикатор схождения/расхождения скользящих средних

Схождение/расхождение скользящих средних (Moving Average Convergence/Divergence, MACD) - это разность (расхождение) между двумя экспоненциальными скользящими средними (экспонентами): быстрой экспоненты периода s и медленной экспоненты периода r; экспоненты применены к цене [закрытия].

Знак MACD показывает положение быстрой s-периодной экспоненты относительно медленной r-периодной экспоненты: положительный MACD - EMA(s) выше EMA(r), отрицательный MACD - EMA(s) ниже EMA(r). Изменение MACD по абсолютному значению: рост |MACD| указывает на расхождение скользящих средних; снижение |MACD| указывает на схождение скользящих средних.

Формула схождения/расхождения скользящих средних:

macd(price,r,s) = EMA(price,s) - EMA(price,r)
s < r

где:

  • price - цена [закрытия] текущего периода;
  • EMA(price,r) - медленная экспоненциальная скользящая средняя (экспонента) периода r, примененная к цене;
  • EMA(price,s) - быстрая экспонента периода s, примененная к цене.

Индикатор схождения/расхождения скользящих средних показывает соотношение между быстрой и медленной экспоненциальными скользящими средними (сглаженное схождение/расхождение скользящих средних).

Формула индикатора схождения/расхождения скользящих средних:

MACD(price,r,s,u) = EMA( macd(price,r,s) ,u) = EMA( EMA(price,s)-EMA(price,r) ,u)
s < r

где:

  • price - цена [закрытия] - ценовая база ценового графика;
  • EMA(price,r) - первое сглаживание - медленная экспоненциальная скользящая средняя (экспонента) периода r, примененная к цене;
  • EMA(price,s) - второе сглаживание - быстрая экспонента периода s, примененная к цене;
  • macd(r,s)=EMA(price,s)-EMA(price,r) - схождение/расхождение быстрой (период s) и медленной (период s) эспонент, примененных к цене;
  • EMA(macd(r,s),u) - третье сглаживание - экспонента периода u, примененная к схождению/расхождению скользящих средних: быстрой EMA(price,s) и медленной EMA(price,r).

3.2.1.1. MACD(price,r,s,u) - индикатор схождения/расхождения скользящих средних. Спецификация

  • Имя файла: Blau_MACD.mq5
  • Наименование: Индикатор схождения/расхождения скользящих средних (MACD; сглаженный MACD) по Уильяму Блау.
  • Входные параметры:
    • r - период 1-й медленной EMA, применительно к цене (по умолчанию r=20);
    • s - период 2-й быстрой EMA, применительно к цене (по умолчанию s=5)
    • u - период 3-й EMA, применительно к схождению/расхождению скользящих средних (по умолчанию u=3);
    • AppliedPrice - тип цены (по умолчанию AppliedPrice=PRICE_CLOSE).
  • Дополнительно:
    • выводится в отдельном окне;
    • изменить стиль отрисовки графического построения - цвет, толщину, стиль линии (вкладка "Цвета").
  • Ограничения:
    • r>1, s>1;
    • s<r (ограничение по требованиям теории, на программном уровне не проверяется);
    • u>0. Если u=1, то сглаживание не выполняется;
    • минимальный размер массива цен =([max(r,s)]+u-2+1).

 

3.2.2. Эргодический MACD-осциллятор

Определение эргодического MACD-осциллятора:
Ergodic_MACD(price,r,s,u) = MACD(price,r,s,u)
SignalLine(price,r,s,u,ul) = EMA( Ergodic_MACD(price,r,s,u) ,ul)

где:

  • Ergodic_MACD() - эргодика - индикатор схождения/расхождения скользящих средних MACD(price,r,s,u);
  • SignalLine() - сигнальная линия - экспоненциальная скользящая средняя периода ul, примененная к эргодике;
  • ul - период EMA сигнальной линии - по Уильяму Блау значение ul должно быть равно периоду последней значимой (>1) EMA эргодики.

В "Руководстве пользователю к клиентскому терминалу MetaTrader" в разделе "Аналитика/Технические индикаторы/Осцилляторы/MACD" представлено описание встроенного в клиентский терминал MetaTrader 5 технического индикатора Cхождение/расхождение скользящих средних (MACD) и способов его использования в техническом анализе (см. также iMACD).

В отличие от "терминального" MACD, для получения сигнальной линии в качестве метода сглаживания Уильям Блау использует экспоненциальное скользящее среднее (в "терминальном" MACD используется простое скользящее среднее).

3.2.2.1. Ergodic_MACD(price,r,s,u,ul) - эргодический MACD-осциллятор. Спецификация

  • Имя файла: Blau_Ergodic_MACD.mq5
  • Наименование: Эргодический MACD-осциллятор (основан на индикаторе схождения/расхождения скользящих средних) по Уильяму Блау.
  • Входные параметры:
    • графическое построение #0 - эргодика (схождения/расхождения скользящих средних):
      • r - период 1-й медленной EMA, применительно к цене (по умолчанию r=20);
      • s - период 2-й быстрой EMA, применительно к цене (по умолчанию s=5)
      • u - период 3-й EMA, применительно к схождению/расхождению скользящих средних (по умолчанию u=3);
    • графическое построение #1 - сигнальная линия:
      • ul - период EMA сигнальной линии, применительно к эргодике (по умолчанию ul=3);
    • AppliedPrice - тип цены (по умолчанию AppliedPrice=PRICE_CLOSE).
  • Дополнительно:
    • выводится в отдельном окне;
    • изменить стиль отрисовки каждого графического построения - цвет, толщину, стиль линии (вкладка "Цвета").
  • Ограничения:
    • r>1, s>1;
    • s<r (ограничение по требованиям теории, на программном уровне не проверяется);
    • u>0. Если u=1, то сглаживание не выполняется;
    • ul>0. Если ul=1, то сигнальная линия совпадает с эргодикой;
    • минимальный размер массива цен =([max(r,s)]+u+ul-3+1).

 

3.2.3. Программный код эргодического MACD-осциллятора

На примере индикатора Ergodic_MACD(price,r,s,u,ul):

1) Связь между индикаторными массивами, индикаторными буферами и графическими построениями:

//--- связь индикаторных буферов с соответствующими динамическими массивами 
   // значения рассчитанного индикатора; предназначены для отрисовки графических построений
   // графическое построение #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);               // эргодика: u-периодная 3-я EMA
   // графическое построение #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);             // сигнальная линия: ul-периодная EMA от эргодики
   // буферы для промежуточных расчетов индикатора; не предназначены для отрисовки
   SetIndexBuffer(2,PriceBuffer,INDICATOR_CALCULATIONS);      // массив цен
   SetIndexBuffer(3,EMA1_PriceBuffer,INDICATOR_CALCULATIONS); // r-периодная медленная 1-я EMA (к цене)
   SetIndexBuffer(4,EMA2_PriceBuffer,INDICATOR_CALCULATIONS); // s-периодная быстрая 2-я EMA (к цене)
   SetIndexBuffer(5,MACDBuffer,INDICATOR_CALCULATIONS);       // схождение/расхождение скользящих средних

2) Алгоритм расчета схождения/расхождения скользящих средних:

//--- расчет схождения/расхождения скользящих средних
   // определение индекса (pos), с которого начать/продолжить расчет схождения/расхождения скользящих средних
   // обнуление незначимых элементов массива MACDBuffer[]
   if(prev_calculated==0)      // если первый вызов
     {
      pos=begin2;              // то расcчитывать все значения, начиная со значимого индекса
      for(i=0;i<pos;i++)       // до значимого индекса
         MACDBuffer[i]=0.0;    // значения обнулить
     }
   else pos=prev_calculated-1; // иначе рассчитывать только последнее значение
   // r-периодная 1-я EMA: расчет значимых (обнуление незначимых) элементов массива EMA1_PriceBuffer[]
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,r,PriceBuffer,EMA1_PriceBuffer);
   // s-периодная 2-я EMA: расчет значимых (обнуление незначимых) элементов массива EMA2_PriceBuffer[]
   ExponentialMAOnBufferWB(rates_total,prev_calculated,begin1,s,PriceBuffer,EMA2_PriceBuffer);
   // расчет значимых элементов массива MACDBuffer[]
   for(i=pos;i<rates_total;i++)
      MACDBuffer[i]=EMA2_PriceBuffer[i]-EMA1_PriceBuffer[i];

3.3. Дополнение

При расчете эргодических MDI-осциллятора и MACD-осциллятора Уильям Блау не использует нормировку (для справки см. пп. 1.2.1, 1.3.1). Поэтому эргодические MDI-осциллятор и MACD-осциллятор не могут быть использованы для интерпретации степени перекупленности или перепроданности рынка.

Так, рекомендации по использованию сигналов индикатора MACD из "Руководства пользователю к клиентскому терминалу MetaTrader" в разделе "Аналитика/Технические индикаторы/Осцилляторы/MACD":

"Moving Average Convergence/Divergence также весьма ценен как индикатор перекупленности/перепроданности. Когда короткое скользящее среднее поднимается существенно выше длинного (т.е. MACD растет), это означает, что цена рассматриваемого инструмента, скорее всего, слишком завышена и скоро вернется к более реалистичному уровню."

в этом случае некорректны с точки зрения технического анализа.

4. Моментум для свеч

Рассматриваемые индикаторы (см. вложение) разделены на две группы.

  1. Blau_CMtm.mq5 - индикатор моментума свечи (моментум q-периодной свечи; сглаженный моментум q-периодной свечи);
  2. Индексы (нормированный сглаженный моментум q-периодной свечи):
    • Blau_CMI.mq5 - индекс моментума свечи (нормирование по абсолютному значению моментума q-периодной свечи);
    • Blau_CSI.mq5 - индекс свечи (нормирование по длине q-периодной свечи);
  3. Эргодические осцилляторы свечи:
    • Blau_Ergodic_CMI.mq5 - эргодический CMI-осциллятор (основан на индексе моментума свечи);
    • Blau_Ergodic_CSI.mq5 - эргодический CSI-осциллятор (основан на индексе свечи).

 

Индикаторы Уильяма Блау, основанные на моментуме свечи (нормирование по абсолютному значению моментума q-периодной свечи)

Рис. 4.1. Индикаторы Уильяма Блау, основанные на моментуме свечи (нормирование по абсолютному значению моментума q-периодной свечи)

 

Индикаторы Уильяма Блау, основанные на моментуме свечи (нормирование по длине q-периодной свечи)

Рис. 4.2. Индикаторы Уильяма Блау, основанные на моментуме свечи (нормирование по длине q-периодной свечи)

 

4.1. Моментум свечи

4.1.1. Определение моментума свечи

Моментум (см. п. 1.1) - это разность между текущей ценой (как правило, сегодняшней ценой закрытия) и предыдущей ценой (как правило, вчерашней ценой закрытия). Моментум может отражать изменение цены на любом временном периоде ценового графика.

Моментум свечи (по Уильяму Блау) - это разность между ценой закрытия и ценой открытия в пределах одного периода (в пределах одной свечи). Знак моментума свечи показывает направление изменения цены: положительный моментум свечи - цена выросла за период, отрицательный - цена снизилась за период.

Формула моментума свечи:

cmtm = close - open

где:

  • close - цена закрытия [текущего] периода (свечи);
  • open - цена открытия [текущего] периода (свечи).

С позиции универсальности расширим определение моментума свечи:

  1. Моментум свечи может отражать изменение цены на любом временном периоде ценового графика;
  2. Ценовая база (цена закрытия, цена открытия) может быть произвольной.

Определение моментума q-периодной свечи

Рис. 4.3. Определение моментума q-периодной свечи


Формула моментума q-периодной свечи:

cmtm(price1,price2,q) = price1 - price2[q-1]

где:

  • q - число временных периодов ценового графика, участвующих в расчете моментума свечи;
  • price1 - цена [закрытия] на момент окончания периода q;
  • price2[q–1] - цена [открытия] на момент начала периода q.

Формула сглаженного моментума q-периодной свечи:

CMtm(price1,price2,q,r,s,u) = EMA(EMA(EMA( cmtm(price1,price2,q) ,r),s),u)

где:

  • q - число временных периодов ценового графика, участвующих в расчете моментума q-периодной свечи;
  • price1 - цена [закрытия] на момент окончания периода q;
  • price2 - цена [открытия] на момент начала периода q;
  • cmtm(price1,price2,q)=price1-price2[q-1] - моментум q-периодной свечи;
  • EMA(cmtm(price1,price2,q),r) - первое сглаживание - экспоненциальная скользящая средняя (экспонента) периода r, примененная к моментуму q-периодной свечи;
  • EMA(EMA(...,r),s) - второе сглаживание - экспонента периода s, примененная к экспоненте периода r;
  • EMA(EMA(EMA(...,r),s),u) - третье сглаживание - экспонента периода u, примененная к результату второго сглаживания.


4.1.2. CMtm(price1,price2,q,r,s,u) - индикатор моментума свечи. Спецификация
  • Имя файла: Blau_CMtm.mq5
  • Наименование: Индикатор моментума свечи (моментум q-периодной свечи; сглаженный моментум q-периодной свечи) по Уильяму Блау.
  • Входные параметры:
    • q - период, по которому вычисляется моментум q-периодной свечи (по умолчанию q=1);
    • r - период 1-й EMA, применительно к моментуму q-периодной свечи (по умолчанию r=20);
    • s - период 2-й EMA, применительно к результату первого сглаживания (по умолчанию s=5);
    • u - период 3-й EMA, применительно к результату второго сглаживания (по умолчанию u=3);
    • AppliedPrice1 - тип цены [закрытия] (по умолчанию AppliedPrice=PRICE_CLOSE);
    • AppliedPrice2 - тип цены [открытия] (по умолчанию AppliedPrice=PRICE_OPEN).
  • Дополнительно:
    • выводится в отдельном окне;
    • изменить стиль отрисовки графического построения - цвет, толщину, стиль линии (вкладка "Цвета").
  • Ограничения:
    • q>0;
    • r>0, s>0, u>0. Если r, s или u равны 1, то на соответствующем периоде EMA сглаживание не выполняется;
    • минимальный размер массива цен =(q-1+r+s+u-3+1).

4.2. Нормированный моментум свечи

4.2.1. Индекс моментума свечи

Индекс моментума свечи (Candle Momentum Index, CMI) - это индикатор нормированного моментума q-периодной свечи (нормированный сглаженный моментум q-периодной свечи). Величины сглаженного моментума q-периодной свечи приведены к процентному масштабу (интервал отображения [–100,+100]). Каждая величина сглаженного моментума q-периодной свечи нормируется на величину сглаженного моментума q-периодной свечи, взятую по абсолютному значению. Нормировка позволяет значение CMI интерпретировать как степень перекупленности (положительное значение) или перепроданности (отрицательное значение) рынка.

Формула индекса моментума свечи:

                             100 * EMA(EMA(EMA( cmtm(price1,pric2,q) ,r),s),u)          100 * CMtm(price1,pric2,q,r,s,u)
CMI(price1,price2,q,r,s,u) = –––––––––––-------------––––––––-–––––––––––––––– = –––––––––––––––-------------–––-–––––––––––––
                               EMA(EMA(EMA( |cmtm(price1,pric2,q)| ,r),s),u)     EMA(EMA(EMA( |cmtm(price1,pric2,q)| ,r),s),u)
если EMA(EMA(EMA(|cmtm(price1,pric2,q)|,r),s),u)=0, то CMI(price1,price2,q,r,s,u)=0

где:

  • q - число временных периодов ценового графика, участвующих в расчете моментума q-периодной свечи;
  • price1 - цена [закрытия] на момент окончания периода q;
  • price2 - цена [открытия] на момент начала периода q;
  • cmtm(price1,pric2,q)=price1-pric2[q-1], - моментум q-периодной свечи;
  • |cmtm(price1,pric2,q)| - абсолютное значение моментума q-периодной свечи;
  • CMtm(price,q,r,s,u) - трижды сглаженный моментум q-периодной свечи;
  • EMA(...,r) - первое сглаживание - экспоненциальная скользящая средняя (экспонента) периода r, примененная к показателю [соответственно: 1) к моментуму q-периодной свечи и 2) к абсолютному значению моментума q-периодной свечи];
  • EMA(EMA(...,r),s) - второе сглаживание - экспонента периода s, примененная к экспоненте периода r;
  • EMA(EMA(EMA(...,r),s),u) - третье сглаживание - экспонента периода u, примененная к результату второго сглаживания.


4.2.1.1. CMI(price1,price2,q,r,s,u) - индекс моментума свечи. Спецификация

  • Имя файла: Blau_CMI.mq5
  • Наименование: Индекс моментума q-периодной свечи (нормированный сглаженный моментум q-периодной свечи; нормирование по абсолютному значению моментума q-периодной свечи) по Уильяму Блау.
  • Входные параметры:
    • q - период, по которому вычисляется моментум q-периодной свечи (по умолчанию q=1);
    • r - период 1-й EMA, применительно к моментуму q-периодной свечи (по умолчанию r=20);
    • s - период 2-й EMA, применительно к результату первого сглаживания (по умолчанию s=5);
    • u - период 3-й EMA, применительно к результату второго сглаживания (по умолчанию u=3);
    • AppliedPrice1 - тип цены [закрытия] (по умолчанию AppliedPrice=PRICE_CLOSE);
    • AppliedPrice2 - тип цены [открытия] (по умолчанию AppliedPrice=PRICE_OPEN).
  • Дополнительно:
    • выводится в отдельном окне;
    • изменить стиль отрисовки графического построения - цвет, толщину, стиль линии (вкладка "Цвета");
    • (не обязательно) два уровня (по умолчанию –25 и +25) - добавить/удалить уровень; изменить значение, описание уровня; изменить стиль отрисовки уровней (вкладка "Уровни");
    • изменить нижнее (по умолчанию –100) и верхнее (по умолчанию +100) ограничения шкалы отдельного окна индикатора (вкладка "Шкала").
  • Ограничения:
    • q>0;
    • r>0, s>0, u>0. Если r, s или u равны 1, то на соответствующем периоде EMA сглаживание не выполняется;
    • минимальный размер массива цен =(q-1+r+s+u-3+1).

 

4.2.2. Индекс свечи

Индекс свечи (Candle Stochastic Index, CSI) - это индикатор нормированного моментума q-периодной свечи (нормированный сглаженный моментум q-периодной свечи). Величины сглаженного моментума q-периодной свечи приведены к процентному масштабу (интервал отображения [–100,+100]).

Каждая величина сглаженного моментума q-периодной свечи нормируется на величину q-периодного диапазона колебания цены (или на длину q-периодной свечи). Нормировка позволяет  интерпретировать значение CSI как степень перекупленности (положительное значение) или перепроданности (отрицательное значение) рынка.

Формула индекса свечи:

                             100 * EMA(EMA(EMA( cmtm(price1,pric2,q) ,r),s),u)    100 * CMtm(price1,pric2,q,r,s,u)
CSI(price1,price2,q,r,s,u) = –––––––––––––––––––-–––-------------––––––––––––– = ––––––––––––––––--––-–––––––––––––
                                    EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)           EMA(EMA(EMA( HH(q)-LL(q) ,r),s),u)
если EMA(EMA(EMA(HH(q)-LL(q),r),s),u)=0, то CSI(price1,price2,q,r,s,u)=0

где:

  • q - число временных периодов ценового графика, участвующих в расчете моментума q-периодной свечи;
  • price1 - цена [закрытия] на момент окончания периода q;
  • price2 - цена [открытия] на момент начала периода q;
  • cmtm(price1,pric2,q)=price1-price2[q-1] - моментум q-периодной свечи;
  • LL(q) - минимальное для предыдущих q периодов значение самой низкой цены за период q;
  • HH(q) - максимальное для предыдущих q периодов значение самой высокой цены за период q
  • HH(q)-LL(q) - q-периодный диапазон колебания цены (длина q-периодной свечи);
  • CMtm(price1,pric2,q,r,s,u) - трижды сглаженный моментум q-периодной свечи;
  • EMA(...,r) - первое сглаживание - экспоненциальная скользящая средняя (экспонента) периода r, примененная к показателю [соответственно: 1) к моментуму q-периодной свечи и 2) к q-периодному диапазону колебания цены (или к длине q-периодной свечи)];
  • EMA(EMA(...,r),s) - второе сглаживание - экспонента периода s, примененная к экспоненте периода r;
  • EMA(EMA(EMA(...,r),s),u) - третье сглаживание - экспонента периода u, примененная к результату второго сглаживания.

4.2.2.1. CSI(price1,price2,q,r,s,u) - индекс свечи. Спецификация

  • Имя файла: Blau_CSI.mq5
  • Наименование: Индекс q-периодной свечи (нормированный сглаженный моментум q-периодной свечи; нормирование по длине q-периодной свечи) по Уильяму Блау.
  • Входные параметры:
    • q - период, по которому вычисляется моментум q-периодной свечи (по умолчанию q=1);
    • r - период 1-й EMA, применительно к моментуму q-периодной свечи (по умолчанию r=20);
    • s - период 2-й EMA, применительно к результату первого сглаживания (по умолчанию s=5);
    • u - период 3-й EMA, применительно к результату второго сглаживания (по умолчанию u=3);
    • AppliedPrice1 - тип цены [закрытия] (по умолчанию AppliedPrice=PRICE_CLOSE);
    • AppliedPrice2 - тип цены [открытия] (по умолчанию AppliedPrice=PRICE_OPEN).
  • Дополнительно:
    • выводится в отдельном окне;
    • изменить стиль отрисовки графического построения - цвет, толщину, стиль линии (вкладка "Цвета");
    • (не обязательно) два уровня (по умолчанию –25 и +25) - добавить/удалить уровень; изменить значение, описание уровня; изменить стиль отрисовки уровней (вкладка "Уровни");
    • изменить нижнее (по умолчанию –100) и верхнее (по умолчанию +100) ограничения шкалы отдельного окна индикатора (вкладка "Шкала").
  • Ограничения:
    • q>0;
    • r>0, s>0, u>0. Если r, s или u равны 1, то на соответствующем периоде EMA сглаживание не выполняется;
    • минимальный размер массива цен =(q-1+r+s+u-3+1).

 

4.3. Эргодический осцилляторы свечи

4.3.1. Эргодический CMI-осциллятор

Определение эргодического CMI-осциллятора:
Ergodic_CMI(price1,pric2,q,r,s,u) = CMI(price1,pric2,q,r,s,u)
SignalLine(price1,pric2,q,r,s,u,ul) = EMA( Ergodic_CMI(price1,pric2,q,r,s,u) ,ul)

где:

  • Ergodic_CMI() - эргодика - индекс моментума свечи CMI(price1,price2,q,r,s,u);
  • SignalLine() - сигнальная линия - экспоненциальная скользящая средняя периода ul, примененная к эргодике;
  • ul - период EMA сигнальной линии - по Уильяму Блау значение ul должно быть равно периоду последней значимой (>1) EMA эргодики.

Ergodic_CMI(price1,pric2,q,r,s,u,ul) - эргодический CMI-осциллятор. Спецификация

  • Имя файла: Blau_Ergodic_CMI.mq5
  • Наименование: Эргодический CMI-осциллятор (основан на индексе моментума свечи) по Уильяму Блау.
  • Входные параметры:
    • графическое построение #0 - эргодика (индекс моментума свечи):
      • q - период, по которому вычисляется моментум q-периодной свечи (по умолчанию q=1);
      • r - период 1-й EMA, применительно к моментуму q-периодной свечи (по умолчанию r=20);
      • s - период 2-й EMA, применительно к результату первого сглаживания (по умолчанию s=5);
      • u - период 3-й EMA, применительно к результату второго сглаживания (по умолчанию u=3);
    • графическое построение #1 - сигнальная линия:
      • ul - период EMA сигнальной линии, применительно к эргодике (по умолчанию ul=3);
    • AppliedPrice1 - тип цены [закрытия] (по умолчанию AppliedPrice=PRICE_CLOSE);
    • AppliedPrice2 - тип цены [открытия] (по умолчанию AppliedPrice=PRICE_OPEN).
  • Дополнительно:
    • выводится в отдельном окне;
    • изменить стиль отрисовки каждого графического построения - цвет, толщину, стиль линии (вкладка "Цвета");
    • два уровня (по умолчанию –25 и +25) - добавить/удалить уровень; изменить значение, описание уровня; изменить стиль отрисовки уровней (вкладка "Уровни");
    • изменить нижнее (по умолчанию –100) и верхнее (по умолчанию +100) ограничения шкалы отдельного окна индикатора (вкладка "Шкала").
  • Ограничения:
    • q>0;
    • r>0, s>0, u>0. Если r, s или u равны 1, то на соответствующем периоде EMA сглаживание не выполняется;
    • ul>0. Если ul=1, то сигнальная линия совпадает с эргодикой;
    • минимальный размер массива цен =(q-1+r+s+u+ul-4+1).


Программный код эргодического CMI-осциллятора


На примере индикатора Ergodic_CMI(price1,price2,r,s,u,ul):

1) Связь между индикаторными массивами, индикаторными буферами и графическими построениями:

//--- связь индикаторных буферов с соответствующими динамическими массивами 
   // значения рассчитанного индикатора; предназначены для отрисовки графических построений
   // графическое построение #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                  // эргодика
   // графическое построение #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);                // сигнальная линия: ul-периодная EMA от эргодики
   // буферы для промежуточных расчетов индикатора; не предназначены для отрисовки
   SetIndexBuffer(2,Price1Buffer,INDICATOR_CALCULATIONS);        // массив цен [закрытия]
   SetIndexBuffer(3,Price2Buffer,INDICATOR_CALCULATIONS);        // массив цен [открытия]
   SetIndexBuffer(4,CMtmBuffer,INDICATOR_CALCULATIONS);          // q-периодный моментум свечи
   SetIndexBuffer(5,EMA_CMtmBuffer,INDICATOR_CALCULATIONS);      // r-периодная 1-я EMA
   SetIndexBuffer(6,DEMA_CMtmBuffer,INDICATOR_CALCULATIONS);     // s-периодная 2-я EMA
   SetIndexBuffer(7,TEMA_CMtmBuffer,INDICATOR_CALCULATIONS);     // u-периодная 3-я EMA
   SetIndexBuffer(8,AbsCMtmBuffer,INDICATOR_CALCULATIONS);       // q-периодный моментум свечи (абсолютное значение)
   SetIndexBuffer(9,EMA_AbsCMtmBuffer,INDICATOR_CALCULATIONS);   // r-периодная 1-я EMA (абсолютное значение)
   SetIndexBuffer(10,DEMA_AbsCMtmBuffer,INDICATOR_CALCULATIONS); // s-периодная 2-я EMA (абсолютное значение)
   SetIndexBuffer(11,TEMA_AbsCMtmBuffer,INDICATOR_CALCULATIONS); // u-периодная 3-я EMA (абсолютное значение)

2) Алгоритм расчета cmtm и |cmtm|:

//--- расчет массива цен [закрытия] Price1Buffer[] и [открытия] Price2Buffer[]
   CalculatePriceBuffer(
                        AppliedPrice1,       // тип цены [закрытия]
                        rates_total,         // размер входных таймсерий
                        prev_calculated,     // обработано баров на предыдущем вызове
                        Open,High,Low,Close, // массивы Open[], High[], Low[], Close[]
                        Price1Buffer         // рассчитываемый массив цен [закрытия]
                       );
   CalculatePriceBuffer(AppliedPrice2,rates_total,prev_calculated,Open,High,Low,Close,Price2Buffer);
//--- расчет cmtm и |cmtm|
   // определение индекса (pos), с которого начать/продолжить расчет cmtm и |cmtm|
   // обнуление незначимых элементов массивов CMtmBuffer[] и AbsCMtmBuffer[]
   if(prev_calculated==0)      // если первый вызов
     {
      pos=begin1;              // то расcчитать все значения, начиная со значимого индекса
      for(i=0;i<pos;i++)       // до значимого индекса
        {
         CMtmBuffer[i]=0.0;    // значения обнулить
         AbsCMtmBuffer[i]=0.0; //
        }
     }
   else pos=prev_calculated-1; // иначе рассчитать только последнее значение
   // расчет значимых элементов массивов CMtmBuffer[] и AbsCMtmBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      CMtmBuffer[i]=Price1Buffer[i]-Price2Buffer[i-(q-1)];
      AbsCMtmBuffer[i]=MathAbs(CMtmBuffer[i]);
     }

 

4.3.2. Эргодический CSI-осциллятор

Определение эргодического CSI-осциллятора:

Ergodic_CSI(price1,pric2,q,r,s,u) = CSI(price1,pric2,q,r,s,u)
SignalLine(price1,pric2,q,r,s,u,ul) = EMA( Ergodic_CSI(price1,pric2,q,r,s,u) ,ul)

где:

  • Ergodic_CSI() - эргодика - индекс свечи CSI(price1,price2,q,r,s,u);
  • SignalLine() - сигнальная линия - экспоненциальная скользящая средняя периода ul, примененная к эргодике;
  • ul - период EMA сигнальной линии - по Уильяму Блау значение ul должно быть равно периоду последней значимой (>1) EMA эргодики.


4.3.2.1. Ergodic_CSI(price1,pric2,q,r,s,u,ul) - эргодический CSI-осциллятор. Спецификация

  • Имя файла: Blau_Ergodic_CSI.mq5
  • Наименование: Эргодический CSI-осциллятор (основан на индексе свечи) по Уильяму Блау.
  • Входные параметры:
    • графическое построение #0 - эргодика (индекс свечи):
      • q - период, по которому вычисляется моментум q-периодной свечи (по умолчанию q=1);
      • r - период 1-й EMA, применительно к моментуму q-периодной свечи (по умолчанию r=20);
      • s - период 2-й EMA, применительно к результату первого сглаживания (по умолчанию s=5);
      • u - период 3-й EMA, применительно к результату второго сглаживания (по умолчанию u=3);
    • графическое построение #1 - сигнальная линия:
      • ul - период EMA сигнальной линии, применительно к эргодике (по умолчанию ul=3);
    • AppliedPrice1 - тип цены [закрытия] (по умолчанию AppliedPrice=PRICE_CLOSE);
    • AppliedPrice2 - тип цены [открытия] (по умолчанию AppliedPrice=PRICE_OPEN).
  • Дополнительно:
    • выводится в отдельном окне;
    • изменить стиль отрисовки каждого графического построения - цвет, толщину, стиль линии (вкладка "Цвета");
    • два уровня (по умолчанию –25 и +25) - добавить/удалить уровень; изменить значение, описание уровня; изменить стиль отрисовки уровней (вкладка "Уровни");
    • изменить нижнее (по умолчанию –100) и верхнее (по умолчанию +100) ограничения шкалы отдельного окна индикатора (вкладка "Шкала").
  • Ограничения:
    • q>0;
    • r>0, s>0, u>0. Если r, s или u равны 1, то на соответствующем периоде EMA сглаживание не выполняется;
    • ul>0. Если ul=1, то сигнальная линия совпадает с эргодикой;
    • минимальный размер массива цен =(q-1+r+s+u+ul-4+1).


4.3.2.2. Программный код эргодического CSI-осциллятора


На примере индикатора Ergodic_CSI(price1,price2,r,s,u,ul):

1) Связь между индикаторными массивами, индикаторными буферами и графическими построениями:

//--- связь индикаторных буферов с соответствующими динамическими массивами 
   // значения рассчитанного индикатора; предназначены для отрисовки графических построений
   // графическое построение #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);               // эргодика
   // графическое построение #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);             // сигнальная линия: ul-периодная EMA от эргодики
   // буферы для промежуточных расчетов индикатора; не предназначены для отрисовки
   SetIndexBuffer(2,Price1Buffer,INDICATOR_CALCULATIONS);     // массив цен [закрытия]
   SetIndexBuffer(3,Price2Buffer,INDICATOR_CALCULATIONS);     // массив цен [открытия]
   SetIndexBuffer(4,LLBuffer,INDICATOR_CALCULATIONS);         // минимальное значение самой низкой цены за период q
   SetIndexBuffer(5,HHBuffer,INDICATOR_CALCULATIONS);         // максимальное значение самой высокой цены за период q
   SetIndexBuffer(6,CMtmBuffer,INDICATOR_CALCULATIONS);       // q-периодный моментум свечи
   SetIndexBuffer(7,EMA_CMtmBuffer,INDICATOR_CALCULATIONS);   // r-периодная 1-я EMA
   SetIndexBuffer(8,DEMA_CMtmBuffer,INDICATOR_CALCULATIONS);  // s-периодная 2-я EMA
   SetIndexBuffer(9,TEMA_CMtmBuffer,INDICATOR_CALCULATIONS);  // u-периодная 3-я EMA
   SetIndexBuffer(10,HHLLBuffer,INDICATOR_CALCULATIONS);      // q-периодный диапазон колебания цены
   SetIndexBuffer(11,EMA_HHLLBuffer,INDICATOR_CALCULATIONS);  // r-периодная 1-я EMA (диапазон колебания цены)
   SetIndexBuffer(12,DEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // s-периодная 2-я EMA (диапазон колебания цены)
   SetIndexBuffer(13,TEMA_HHLLBuffer,INDICATOR_CALCULATIONS); // u-периодная 3-я EMA (диапазон колебания цены)

2) Алгоритм расчета cmtm и q-периодного диапазона колебания цены:

//--- расчет массива цен [закрытия] Price1Buffer[] и [открытия] Price2Buffer[]
   CalculatePriceBuffer(
                        AppliedPrice1,       // тип цены [закрытия]
                        rates_total,         // размер входных таймсерий
                        prev_calculated,     // обработано баров на предыдущем вызове
                        Open,High,Low,Close, // массивы Open[], High[], Low[], Close[]
                        Price1Buffer         // рассчитываемый массив цен [закрытия]
                       );
   CalculatePriceBuffer(AppliedPrice2,rates_total,prev_calculated,Open,High,Low,Close,Price2Buffer);
//--- расчет cmtm и и q-периодного диапазона колебания цены
   // определение индекса (pos), с которого начать/продолжить расчет cmtm и q-периодного диапазона колебания цены
   // обнуление незначимых элементов массивов CMtmBuffer[] и HHLLBuffer[], LLBuffer[], HHBuffer[]
   if(prev_calculated==0)      // если первый вызов
     {
      pos=begin1;              // то расcчитать все значения, начиная со значимого индекса
      for(i=0;i<pos;i++)       // до значимого индекса
        {
         CMtmBuffer[i]=0.0;    // значения обнулить
         HHLLBuffer[i]=0.0;    //
         LLBuffer[i]=0.0;      //
         HHBuffer[i]=0.0;      //
        }
     }
   else pos=prev_calculated-1; // иначе рассчитать только последнее значение
   // расчет значимых элементов массивов CMtmBuffer[], HHLLBuffer[], LLBuffer[], HHBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      // расчет CMtmBuffer[] - q-периодный моментум свечи
      CMtmBuffer[i]=Price1Buffer[i]-Price2Buffer[i-(q-1)];
      // расчет LLBuffer[] - поиск минимального значения самой низкой цены за период q
      // расчет HHBuffer[] - поиск максимального значения самой высокой цены за период q
      min=1000000.0;
      max=-1000000.0;
      for(k=i-(q-1);k<=i;k++)
        {
         if(min>Low[k])  min=Low[k];
         if(max<High[k]) max=High[k];
        }
      LLBuffer[i]=min;
      HHBuffer[i]=max;
      // расчет HHLLBuffer[] - q-периодный диапазон колебания цены
      HHLLBuffer[i]=HHBuffer[i]-LLBuffer[i];
     }
 

5. Направленный тренд

Рассматриваемые индикаторы (см. вложение):

  1. Blau_HLM.mq5 - индикатор виртуального закрытия (сложный q-периодный моментум по максимумам и минимумам; сглаженный сложный q-периодный моментум по максимумам и минимумам);
  2. Blau_DTI.mq5 - индекс направленного тренда (нормированный сглаженный сложный q-периодный моментум по максимумам и минимумам);
  3. Blau_Ergodic_DTI.mq5 - эргодический DTI-осциллятор (основан на индексе направленного тренда).

 

Индикаторы направленного тренда, основанные на сложном моментуме по максимумам и минимумам

Рис. 5.1. Индикаторы направленного тренда, основанные на сложном моментуме по максимумам и минимумам

 

5.1. Сложный моментум по максимумам и минимумам

5.1.1. Определение моментумов ап-тренда и даун-тренда

Одно из определений тенденции. Если значения максимальных цен растут, то тенденция восходящая. Если значения минимальных цен снижаются, то тенденция нисходящая.

Группа индикаторов темпа (моментум), рассмотренные в п. 1, позволяют вычислить моментум по максимумам цены:

Mtm( price=High, q, r, s, u )
TSI( price=High, q, r, s, u )
Ergodic( price=High, q, r, s, u )

и по минимумам цены:

Mtm( price=Low, q, r, s, u )
TSI( price=Low, q, r, s, u )
Ergodic( price=Low, q, r, s, u )

Моментум ап-тренда, или моментум растущих максимумов (High Momentum Up, HMU) - это положительная разность между максимальной ценой текущего периода и максимальной ценой на начало q-периодного диапазона колебания цены. Величина q-периодного моментума ап-тренда показывает относительную скорость роста максимальной цены текущего периода по сравнению с максимальной ценой на начало q-периодного диапазона колебания цены.

Формула q-периодного моментума ап-тренда:

HMU(q) = High - High[q-1], если High - High[q-1] > 0
HMU(q) = 0, если High - High[q-1] <= 0

где:

  • q - число временных периодов ценового графика, участвующих в расчете моментума ап-тренда;
  • High - максимальная цена текущего периода;
  • High[q–1] - максимальная цена (q-1) периодов назад.

Моментум даун-тренда, или моментум убывающих минимумов (Low Momentum Down, LMD) - это положительная разность между минимальной ценой текущего периода и минимальной ценой на начало q-периодного диапазона колебания цены. Величина q-периодного моментума даун-тренда показывает относительную скорость снижения минимальной цены текущего периода по сравнению с минимальной ценой на начало q-периодного диапазона колебания цены.

Формула q-периодного моментума даун-тренда:

LMD(q) = -(Low - Low[q-1]), если Low - Low[q-1] < 0
LMD(q) = 0, если Low - Low[q-1] >= 0

где:

  • q - число временных периодов ценового графика, участвующих в расчете моментума даун-тренда;
  • Low - минимальная цена текущего периода;
  • Low[q–1] - минимальная цена (q-1) периодов назад.

Сложный моментум по максимумам и минимумам (High-Low Momentum, HLM) - это разность между q-периодными моментумом ап-тренда и q-периодным моментумом даун-тренда. Знак сложного моментума по максимумам и минимумам указывает на тенденцию изменения цены: положительный HLM - тенденция роста цены (повышательный тренд), отрицательный - тенденция снижения цены (понижательный тренд).

Формула:

HLM(q) = HMU(q) - LMD(q)

где:

  • q - число временных периодов ценового графика, участвующих в расчете моментумов ап-тренда и даун-тренда;
  • HMU(q) - моментум ап-тренда за период q;
  • LMD(q) - моментум даун-тренда за период q.

Формула сглаженного сложного q-периодного моментума по максимума и минимумам (виртуальное закрытие):

HLM(q,r,s,u) = EMA(EMA(EMA( HLM(q) ,r),s),u) = EMA(EMA(EMA( HMU(q)-HMD(q) ,r),s),u)

где:

  • q - число временных периодов ценового графика, участвующих в расчете моментумов ап-тренда и даун-тренда;
  • HMU(q) - моментум ап-тренда за период q;
  • LMD(q) - моментум даун-тренда за период q;
  • HLM(q)=HMU(q)-LMD(q) - сложный q-периодный моментум по максимумам и минимумам;
  • EMA(HLM(q),r) - первое сглаживание - экспоненциальная скользящая средняя (экспонента) периода r, примененная к сложному q-периодному моментуму по максимумам и минимумам;
  • EMA(EMA(...,r),s) - второе сглаживание - экспонента периода s, примененная к экспоненте периода r;
  • EMA(EMA(EMA(...,r),s),u) - третье сглаживание - экспонента периода u, примененная к результату второго сглаживания.

Кривая графика накопленной суммы сложных моментумов по максимумам и минимумам называется виртуальное закрытие.


5.1.2. HLM(q,r,s,u) - индикатор виртуального закрытия. Спецификация
  • Имя файла: Blau_HLM.mq5
  • Наименование: Индикатор виртуального закрытия (сложный q-периодный моментум по максимумам и минимумам; сглаженный сложный q-периодный моментум по максимумам и минимумам) по Уильяму Блау.
  • Входные параметры:
    • q - период, по которому вычисляется HLM (по умолчанию q=2);
    • r - период 1-й EMA, применительно к HLM (по умолчанию r=20);
    • s - период 2-й EMA, применительно к результату первого сглаживания (по умолчанию s=5);
    • u - период 3-й EMA, применительно к результату второго сглаживания (по умолчанию u=3).
  • Дополнительно:
    • выводится в отдельном окне;
    • изменить стиль отрисовки графического построения - цвет, толщину, стиль линии (вкладка "Цвета").
  • Ограничения:
    • q>0;
    • r>0, s>0, u>0. Если r, s или u равны 1, то на соответствующем периоде EMA сглаживание не выполняется;
    • минимальный размер массива цен =(q-1+r+s+u-3+1).

 

5.2. Индекс направленного тренда

5.2.1. Определение индекса направленного тренда

Индекс направленного тренда (Directional Trend Index, DTI) - это индикатор нормированного сложного q-периодного моментума по максимумам и минимумам (нормированный сглаженный HLM). Величины сглаженного HLM приведены к процентному масштабу (интервал отображения [–100,+100]).

Каждая величина сглаженного HLM нормируется на величину сглаженного HLM, взятую по абсолютному значению. Нормировка позволяет значение DTI интерпретировать как степень перекупленности (положительное значение) или перепроданности (отрицательное значение) рынка.

Формула индекса направленного тренда:

               100 * EMA(EMA(EMA( HLM(q) ,r),s),u)          100 * HLM(q,r,s,u)
DTI(q,r,s,u) = –––––––––––––––––––––––––---––––––– = ––––––––––––––--–––––––––––––––
                 EMA(EMA(EMA( |HLM(q)| ,r),s),u)     EMA(EMA(EMA( |HLM(q)| ,r),s),u)
если EMA(EMA(EMA(|HLM(q)|,r),s),u)=0, то DTI(price,q,r,s,u)=0

где:

  • q - число временных периодов ценового графика, участвующих в расчете моментумов ап-тренда и даун-тренда;
  • HLM(q)=HMU(q)-LMD(q) - сложный q-периодный моментум по максимумам и минимумам;
  • |HLM(q)| - абсолютное значение HLM(q);
  • HLM(q,r,s,u) - трижды сглаженный HLM(q);
  • EMA(...,r) - первое сглаживание - экспоненциальная скользящая средняя (экспонента) периода r, примененная к показателю [соответственно: 1) к HLM(q) и 2) к абсолютному значению HLM(q)];
  • EMA(EMA(...,r),s) - второе сглаживание - экспонента периода s, примененная к экспоненте периода r;
  • EMA(EMA(EMA(...,r),s),u) - третье сглаживание - экспонента периода u, примененная к результату второго сглаживания.
5.2.2. DTI(q,r,s,u) - индекс направленного тренда. Спецификация
  • Имя файла: Blau_DTI.mq5
  • Наименование: Индекс направленного тренда (нормированный сглаженный сложный q-периодный моментум по максимумам и минимумам) по Уильяму Блау.
  • Входные параметры:
    • q - период, по которому вычисляется HLM (по умолчанию q=2);
    • r - период 1-й EMA, применительно к HLM (по умолчанию r=20);
    • s - период 2-й EMA, применительно к результату первого сглаживания (по умолчанию s=5);
    • u - период 3-й EMA, применительно к результату второго сглаживания (по умолчанию u=3).
  • Дополнительно:
    • выводится в отдельном окне;
    • изменить стиль отрисовки графического построения - цвет, толщину, стиль линии (вкладка "Цвета");
    • (не обязательно) два уровня (по умолчанию –25 и +25) - добавить/удалить уровень; изменить значение, описание уровня; изменить стиль отрисовки уровней (вкладка "Уровни");
    • изменить нижнее (по умолчанию –100) и верхнее (по умолчанию +100) ограничения шкалы отдельного окна индикатора (вкладка "Шкала").
  • Ограничения:
    • q>0;
    • r>0, s>0, u>0. Если r, s или u равны 1, то на соответствующем периоде EMA сглаживание не выполняется;
    • минимальный размер массива цен =(q-1+r+s+u-3+1).

 

5.3. Эргодический DTI-осциллятор

5.3.1. Определение эргодического DTI-осциллятора

Ergodic_DTI(q,r,s,u) = DTI(q,r,s,u)
SignalLine(q,r,s,u,ul) = EMA( Ergodic_DTI(q,r,s,u) ,ul)

где:

  • Ergodic_DTI() - эргодика - индекс направленного тренда DTI(q,r,s,u);
  • SignalLine() - сигнальная линия - экспоненциальная скользящая средняя периода ul, примененная к эргодике;
  • ul - период EMA сигнальной линии - по Уильяму Блау значение ul должно быть равно периоду последней значимой (>1) EMA эргодики.
5.3.2. Ergodic_DTI(q,r,s,u,ul) - эргодический DTI-осциллятор. Спецификация
  • Имя файла: Blau_Ergodic_DTI.mq5
  • Наименование: Эргодический DTI-осциллятор (основан на индексе направленного тренда) по Уильяму Блау.
  • Входные параметры:
    • графическое построение #0 - эргодика (индекс направленного тренда):
      • q - период, по которому вычисляется HLM (по умолчанию q=2);
      • r - период 1-й EMA, применительно к HLM (по умолчанию r=20);
      • s - период 2-й EMA, применительно к результату первого сглаживания (по умолчанию s=5);
      • u - период 3-й EMA, применительно к результату второго сглаживания (по умолчанию u=3);
    • графическое построение #1 - сигнальная линия:
      • ul - период EMA сигнальной линии, применительно к эргодике (по умолчанию ul=3);
  • Дополнительно:
    • выводится в отдельном окне;
    • изменить стиль отрисовки каждого графического построения - цвет, толщину, стиль линии (вкладка "Цвета");
    • два уровня (по умолчанию –25 и +25) - добавить/удалить уровень; изменить значение, описание уровня; изменить стиль отрисовки уровней (вкладка "Уровни");
    • изменить нижнее (по умолчанию –100) и верхнее (по умолчанию +100) ограничения шкалы отдельного окна индикатора (вкладка "Шкала").
  • Ограничения:
    • q>0;
    • r>0, s>0, u>0. Если r, s или u равны 1, то на соответствующем периоде EMA сглаживание не выполняется;
    • ul>0. Если ul=1, то сигнальная линия совпадает с эргодикой;
    • минимальный размер массива цен =(q-1+r+s+u+ul-4+1).


5.4. Программный код эргодического DTI-осциллятора

На примере индикатора Ergodic_DTI(q,r,s,u,ul):

1) Связь между индикаторными массивами, индикаторными буферами и графическими построениями:

//--- связь индикаторных буферов с соответствующими динамическими массивами 
   // значения рассчитанного индикатора; предназначены для отрисовки графических построений
   // графическое построение #0
   SetIndexBuffer(0,MainBuffer,INDICATOR_DATA);                 // эргодика
   // графическое построение #1
   SetIndexBuffer(1,SignalBuffer,INDICATOR_DATA);               // сигнальная линия: ul-периодная EMA от эргодики
   // буферы для промежуточных расчетов индикатора; не предназначены для отрисовки
   SetIndexBuffer(2,HMUBuffer,INDICATOR_CALCULATIONS);          // q-периодный моментум ап-тренда
   SetIndexBuffer(3,LMDBuffer,INDICATOR_CALCULATIONS);          // q-периодный моментум даун-тренда
   SetIndexBuffer(4,HLMBuffer,INDICATOR_CALCULATIONS);          // сложный q-периодный моментум по максимумам и минимумам
   SetIndexBuffer(5,EMA_HLMBuffer,INDICATOR_CALCULATIONS);      // r-периодная 1-я EMA
   SetIndexBuffer(6,DEMA_HLMBuffer,INDICATOR_CALCULATIONS);     // s-периодная 2-я EMA
   SetIndexBuffer(7,TEMA_HLMBuffer,INDICATOR_CALCULATIONS);     // u-периодная 3-я EMA
   SetIndexBuffer(8,AbsHLMBuffer,INDICATOR_CALCULATIONS);       // сложный q-периодный моментум по максимумам и минимумам (абсолютное значение)
   SetIndexBuffer(9,EMA_AbsHLMBuffer,INDICATOR_CALCULATIONS);   // r-периодная 1-я EMA (абсолютное значение)
   SetIndexBuffer(10,DEMA_AbsHLMBuffer,INDICATOR_CALCULATIONS); // s-периодная 2-я EMA (абсолютное значение)
   SetIndexBuffer(11,TEMA_AbsHLMBuffer,INDICATOR_CALCULATIONS); // u-периодная 3-я EMA (абсолютное значение)

2) Алгоритм расчета HLM и |HML|:

//--- расчет HLM и |HLM|
   // определение индекса (pos), с которого начать/продолжить расчет HLM и |HLM|
   // обнуление незначимых элементов массивов HLMBuffer[], AbsHLMBuffer[], HMUBuffer[], LMDBuffer[]
   if(prev_calculated==0)      // если первый вызов
     {
      pos=begin1;              // то расcчитать все значения, начиная со значимого индекса
      for(i=0;i<pos;i++)       // до значимого индекса
        {
         HLMBuffer[i]=0.0;     // значения обнулить
         AbsHLMBuffer[i]=0.0;  //
         HMUBuffer[i]=0.0;     //
         LMDBuffer[i]=0.0;     //
        }
     }
   else pos=prev_calculated-1; // иначе рассчитать только последнее значение
   // расчет значимых элементов массивов HLMBuffer[], AbsHLMBuffer[], HMUBuffer[], LMDBuffer[]
   for(i=pos;i<rates_total;i++)
     {
      HMUBuffer[i]=High[i]-High[i-(q-1)];    HMUBuffer[i]=(HMUBuffer[i]>0)?HMUBuffer[i]:0;
      LMDBuffer[i]=-1*(Low[i]-Low[i-(q-1)]); LMDBuffer[i]=(LMDBuffer[i]>0)?LMDBuffer[i]:0;
      HLMBuffer[i]=HMUBuffer[i]-LMDBuffer[i];
      AbsHLMBuffer[i]=MathAbs(HLMBuffer[i]);
     }

Заключение

В первой части статьи "Индикаторы и торговые системы Уильяма Блау на MQL5. Часть 1: Индикаторы" представлено описание разработанных на MQL5 индикаторов и осцилляторов из книги Уильяма Блау (William Blau) "Моментум, направленность и расхождение".

О том, как использовать эти индикаторы и осцилляторы при принятии торговых решений будет описано во второй части статьи "Индикаторы и торговые системы Уильяма Блау на MQL5. Часть 2: Торговые системы".

 

Содержимое прикрепленного к статье архива с индикаторами "Blau_Indicators.zip"

Файл Описание
Включаемый файл. Размещение: "каталог_терминала\MQL5\Include"
 WilliamBlau.mqh  
Индикаторы. Размещение: "каталог_терминала\MQL5\Indicators"
   Индикаторы, основанные на моментуме
 Blau_Mtm.mq5  Индикатор темпа  (q-периодный моментум; сглаженный q-периодный моментум)
 Blau_TSI.mq5  Индекс истинной силы (нормированный сглаженный q-периодный моментум)
 Blau_Ergodic.mq5  Эргодический осциллятор (основан на индексе истинной силы)
   Индикаторы, основанные на стохастике
 Blau_TStoch.mq5  Стохастик (q-периодный стохастик; сглаженный q-периодный стохастик)
 Blau_TStochI.mq5  Индекс стохастика (нормированный сглаженный q-периодный стохастик)
 Blau_TS_Stochastic.mq5  Стохастический TS-осциллятор (основан на индексе стохастика)
   Индикаторы, основанные на стохастическом моментуме
 Blau_SM.mq5  Индикатор стохастического темпа (q-периодный стохастический моментум; сглаженный q-периодный стохастический моментум)
 Blau_SMI.mq5  Индекс стохастического темпа (нормированный сглаженный q-периодный стохастический моментум)
 Blau_SM_Stochastic.mq5  Стохастический SM-осциллятор (основан на индексе стохастического темпа)
   Индикаторы, основанные на отклонении от тенденции развития рынка
 Blau_MDI.mq5  Индикатор среднего отклонения от тенденции (среднее отклонение; сглаженное среднее отклонение)
 Blau_Ergodic_MDI.mq5  Эргодический MDI-осциллятор (основан на индикаторе среднего отклонения)
   Индикаторы, основанные на схождении/расхождении скользящих средних
 Blau_MACD.mq5  Индикатор схождения/расхождения скользящих средних (MACD; сглаженный MACD)
 Blau_Ergodic_MACD.mq5  Эргодический MACD-осциллятор (основан на индикаторе схождения/расхождения скользящих средних)
   Индикаторы, основанные на моментуме свечи
 Blau_CMtm.mq5  Индикатор моментума свечи (моментум q-периодной свечи; сглаженный моментум q-периодной свечи)
 Blau_CMI.mq5  Индекс моментума свечи (нормированный сглаженный моментум q-периодной свечи; нормирование по абсолютному значению моментума q-периодной свечи)
 Blau_CSI.mq5  Индекс свечи (нормированный сглаженный моментум q-периодной свечи; нормирование по длине q-периодной свечи)
 Blau_Ergodic_CMI.mq5  Эргодический CMI-осциллятор (основан на индексе моментума свечи)
 Blau_Ergodic_CSI.mq5  Эргодический CSI-осциллятор  (основан на индексе свечи)
   Индикаторы, основанные на сложном моментуме по максимумам и минимумам
 Blau_HLM.mq5  Индикатор виртуального закрытия (сложный q-периодный моментум по максимумам и минимумам; сглаженный сложный q-периодный моментум по максимумам и минимумам)
 Blau_DTI.mq5  Индекс направленного тренда (нормированный сглаженный сложный q-периодный моментум по максимумам и минимумам)
 Blau_Ergodic_DTI.mq5  Эргодический DTI-осциллятор (основан на индексе направленного тренда)
Прикрепленные файлы |
Последние комментарии | Перейти к обсуждению на форуме трейдеров (4)
Denis Kirichenko
Denis Kirichenko | 22 апр. 2011 в 16:06

Шедеврально!

Будет время, обязательно изучу детально... 

fozi
fozi | 22 апр. 2011 в 22:58
denkir:

Шедеврально!

Будет время, обязательно изучу детально... 

вот книга на которую ссылаеццо автор. Правда там хотят немного "золотых" а я так нашел ))

формат *.djvu 

 блин.. почему то после вложения не появляеццо, может модераторы проверяют. Вобщем если кому нужно пишите в личко. вышлю на мыло

---
--- | 22 апр. 2011 в 23:42
fozi:

вот книга на которую ссылаеццо автор. Правда там хотят немного "золотых" а я так нашел ))

формат *.djvu 

 блин.. почему то после вложения не появляеццо

zip сделайте
Marik
Marik | 31 июл. 2015 в 10:41
Благодарю автора за проделанный труд!
Прогнозирование временных рядов в MetaTrader 5 при помощи библиотеки машинного обучения ENCOG Прогнозирование временных рядов в MetaTrader 5 при помощи библиотеки машинного обучения ENCOG
Статья посвящена использованию функционала нейронных сетей библиотеки машинного обучения ENCOG в MetaTrader 5. В качестве примера приведена реализация простого нейросетевого индикатора на основе технических индикаторов и советника, торгующего по сигналам нейросетевого индикатора. Все исходные коды, скомпилированные библиотеки и примеры обученной сети прилагаются к статье.
Как заказать написание советника и получить желаемый результат Как заказать написание советника и получить желаемый результат
Как правильно написать Техническое Задание? Что можно и чего нельзя ожидать от программиста при заказе советника или индикатора? Как нужно вести диалог, на какие моменты обратить внимание? Статья дает ответы на эти и многие другие вопросы, которые зачастую неочевидны для многих без самостоятельного набивания шишек.
Мастер MQL5: Новая версия Мастер MQL5: Новая версия
Статья описывает возможности, появившиеся в новой версии Мастера MQL5. Изменения в архитектуре сигналов позволяют теперь создавать торговые роботы на основе комбинации различных рыночных моделей. На конкретном примере рассматривается процедура интерактивного создания готового к торговле эксперта.
Основы тестирования в MetaTrader 5 Основы тестирования в MetaTrader 5
В чем различия между тремя режимами тестирования в MetaTrader 5 и на что обратить внимание? Как происходит тестирование эксперта, торгующего одновременно на нескольких инструментах? Когда и как вычисляются значения индикаторов при тестировании и как обрабатываются события? Как синхронизировать бары с разных инструментов при тестировании в режиме "Только цены открытия"? Статья призвана дать ответы на эти и многие другие вопросы.