|
|
|
|
|
|
|
|
|
Мы создали индикатор простой скользящей средней с периодом PeriodMA, теперь нам осталось задействовать параметр ShiftMA, который отвечает за смещение индикатора. Часто в теханализе требуется не только рассчитать значения индикатора, но и сместить их на какое-то количество баров вперед или назад. Это свойство называется смещением. В MQL-4 смещение индикатора достигается очень просто, достаточно любому индикаторному индексу установить признак смещения с помощью функции SetIndexShift(), для этого в блоке init() мы пишем эту простую конструкцию и получаем желаемый результат.
|
|
|
|
Набрасываем на график наш новый индикатор со смещением ноль и второй индикатор со смещением, например, три. Мы видим, что индикатор, использующий смещение, рисуется на три бара вперед, при отрицательном смещении индикатор будет рисоваться с запаздыванием. Мы можем улучшить индикатор. Когда мы смотрим в Окне Данных (Ctrl+D) значения нашего индикатора, то мы видим, что указывается имя индикатора и значение его для данного бара. Часто индикатор может содержать больше одного индекса, обычно нулевой индекс именуется по имени индикатора, а все остальные индексы именуются как Value1 , Value2 и так далее. Для того, чтобы дать более осмысленные имена индексам, служит функция SetIndexLabel(), которая задает отображаемое имя для указанного индекса. Используем в качестве имени SMA(PeriodMA), таким образом мы показали, что это простая скользящая средняя с периодом PeriodMA. Обычно эта функция также используется в блоке init().
|
|
|
|
Если мы посмотрим технический индикатор Moving Average, то увидим, что мы не использовали тип цен для расчета нашего индикатора. Обратимся к справке ME, там указано 7 стандартных ценовых констант :
|
|
|
|
Добавим новый параметр PriceType( тип цены) и изменим блок start() таким образом, чтобы наш индикатор считался не только по ценам открытия. Если мы вместо цен Close[i+k] в цикле for() будем подставлять необходимый тип цены, то больше ничего и не надо. Введем новую вспомогательную переменную double price и будем задавать ее значение в соответствии со справкой МЕ. Сделаем это для унификации пользовательского и технического индикатора, в блоке switch(PriceType) используем в качестве ключей предопределенные ценовые константы.
|
|
|
|
Кроме того, процедуру формирования метки для индекса в блоке init() сделаем также более гибкой, теперь будем отображать не только период(PeriodMA) и смещение(ShiftMA), но и тип цены, от которой построен индикатор.
|
|
|
|
На этом построение простой скользящей средней MA.mq4 будет полным.
|
|
|
|
Теперь рассмотрим еще один вариант средней. Часто бывают индикаторы, когда текущее значение индикатора зависит от предыдущего значения и текущей цены.
Можно записать этот так: F[i]=F[i+1]*a+Price[i]*b, где a и b - коэффициенты, обычно меньше 1. Иногда требуют, чтобы a+b=1. Тогда F[i]=F[i+1]*(1-b)+Price[i]*b .
Чем меньше коэффициент b, тем меньше реагирует индикатор на изменение цен и больше зависит от предыдущего значения индикатора. Для экспоненциальной скользящей средней(ЭСС) коэффициент b=2/(1+PeriodMA). Видим, что чем больше период ЭСС, тем более плавной будет кривая индикатора. Построим новый индикатор EMA.mq4 на базе MA.mq4. Произведем косметические изменения в блоке init()
|
|
|
|
В блоке start(), правда, появляется некоторая заминка. В самом начале, когда мы рассчитываем индикатор в первый раз, у нас нет предыдущего значения индикатора. Нам негде взять предыдущее значение и нам придется делать какое-то допущение. Первый вариант – принять соглашение, что для бара с индексом Bars-1 значение индикатора равно значению цены на этом баре (High, Open, Close или другая ценовая константа, например, {High+Low+Close}/3.0 ), а дальше рассчитывать по алгоритму. Второй вариант – для бара с индексом Bars-PeriodMA значение индикатора равно простой скользящей стредней (ПСС), а дальше опять рассчитывать по алгоритму. Первый вариант реализован в пользовательском индикаторе Moving Averages.mq4 , который идет в составе дистрибутива MetaTrader4 и находится в папке MetaTrader 4expertssamplesindicators .
Поэтому мы пойдем по второму варианту, чтобы сравнить их между собой.
|
|
|
|
Блок вычисления простой средней (синего цвета) возьмем из индикатора MA.mq4. Небольшая доводка, и индикатор EMA.mq4 готов.
|
|
|
|
Видно, что в коде есть два одинаковых участка/блока, которые очень похожи друг на друга. MQL-4 позволяет объявлять свои(пользовательские) функции для однообразных вычислений. Справку по функциям можно посмотреть в «Справочнике MQL4» в разделе «Функции».
Создадим функцию GetPrice(int PriceMode, int index), перенесем в нее все вычисления, тип функции зададим double.
|
|
|
|
Теперь мы заменим эти блоки одной строчкой вызова функции GetPrice() и индикатор EMA2.mq4.mq4 готов. Произведем такие же изменения с индикатором MA.mq4 и назовем его MA2.mq4. Скачать их можно здесь .
Перейти к статье «Перевод индикатора из MQL-2 в MQL-4».
|
|
|
|
|
|