Статьи по MQL4
Массивы и технические индикаторы на них

Массивы и технические индикаторы на них


например, forex
Массивы – это набор однотипных элементов, доступ к которым возможен через индекс. Часто в советниках или индикаторах приходится использовать массивы. Например, если в индикаторе для расчетов требуется использовать более восьми индикаторных буферов, то помогут массивы, определенные как ценовые серии. Или требуется логику индикатора по каким-то причинам поместить в советник, для расчета значений индикатора без обращений к функции iCustom().

В чем отличие обычного массива от ценовой серии? Эта разница появляется только потому, что в МТ4 введены дополнительные функции, которые могут рассчитывать значения некоторых технических индикаторов на массивах. Индикаторный буфер не требует от программиста дополнительных усилий, при появлении нового бара размер индикаторного буфера автоматически увеличивается на единицу и индекс всех значений также увеличивается на единицу. Бар, имевший индекс равный 6, теперь имеет индекс равный 7. Новые данные (цена закрытия Close, объем Volume и т.д.) начинают записываться в новый бар с нулевым индексом. Индикаторы на таких буферах рассчитываются от последнего индекса к нулевому. Такое поведение массива и является ценовой серией.

В отличие от ценовой серии обычный массив ведет себя противоположным образом, но только по отношению к функциям i…onArray():
  • iMAOnArray()
  • iMomentumOnArray()
  • iStdDevOnArray()
  • iEnvelopesOnArray()
  • iBandsOnArray()
  • iCCIOnArray()
  • iRSIOnArray()


Поэтому, пока вам не требуется использовать эти функции, вы можете и не делать различий между массивом и ценовой серией. Но если вы захотите рассчитать скользящую среднюю по массиву, то вы сразу почувствуете разницу. Это все равно, что на вокзале вы ожидаете прихода поезда, но нумерация вагонов почему-то идет с хвоста поезда. Для иллюстрации разницы написан скрипт ArraySample.mq4. Алгоритм простой: заполняется массив из 100 элементов и выводится скользящее среднее с периодом 4 от этого массива с помощью функции iMAOnArray(), сначала для обычного массива, а потом делается попытка превратить массив в ценовую серию и сделать вывод повторно.

 
 


Выражение sum+=Array[i] означает тоже самое , что и sum=sum+Array[i]. После выполнения скрипта открываем файл ArraySample.csv и видим, что объявление массива ценовой серией с помощью ArraySetAsSeries() не помогло, функция iMAOnArray() возвращает те же самые значения. Хотя среднее по массиву считается правильно, как и должно быть. Изменим немного скрипт, после объявления массива ценовой серией заново заполним его значениями и проверим.

 
 


Откроем полученный файл ArraySample2.csv в Excel. Теперь вывод для массива и для ценовой серии отличается. Значит, массив необходимо объявлять как ценовую серию до первого обращения к нему. Сделаем ручную проверку для ценовой серии. Сначала находим сумму четырех ячеек:

 
 


Затем найдем среднее для этих 4-х ячеек :

 
 


Далее заполняем этой формулой остальные ячейки:

 
 


Видно, что вычисление скользящей средней по нашему массиву с периодом 4 в скрипте совпадает ручным вычислением в Excel.

 
 


Функция iMAOnArray() хорошо подходит в тех случаях, когда требуется сгладить массив значений, допустим какой-нибудь индикатор. Например, наблюдая за EURUSD H1, мы замечаем, что в конце американской сессии индикатор ATR(8) начинает снижаться (8 – длительность сессии в часах). Чтобы получить более гладкие значения этого индикатора, мы его сглаживаем простой скользящей средней с периодом 5. Для этого мы перетаскиваем стандартный индикатор Moving Average на окно индикатора ATR и указываем в качестве исходных значений «Previous Indicator’s Data» (значения предыдущего индикатора).

 
 


Если мы не хотим каждый раз проделывать эти манипуляции, то мы можем написать пользовательский индикатор, в котором будут сглаживаться значения индикатора ATR. Например, код индикатора VolATR.mq4:

 
 


Использование этого пользовательского индикатора заменяет нам два стандартных индикатора, наложенных друг на друга:

 
 


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

 
 


Проверочный файл ArraySample3.xls с формулами прилагается. Примером использования этой функции является индикатор простейшего расчета индекса доллара SumLogSample.mq4.

Последней рассмотрим функцию iStdDevOnArray(). В МТ4 эта функция характеризует меру разброса данных вокруг скользящей средней от этих данных. Эта мера разброса в статистике называется стандартным отклонением. То есть, сначала на данных массива строится скользящая средняя (период и тип средней задается 3 и 4 параметром), а затем вычисляется разброс данных массива вокруг этой средней. Справку по стандартному отклонению я приведу из справочной системы MS Excel.

 
 


Сам скрипт написан так, чтобы было легче сделать ручную проверку в Excel.

 
 


В каких случаях может понадобиться эта функция? Предположим, нам необходимо из двух МТС выбрать одну, требуется критерий. Таким критерием может быть мера разброса результатов тестирования МТС, когда заполняется массив из прибылей и убытков, находится средняя сделка и стандартное отклонение. Логично, что там, где стандартное отклонение на массиве сделок будет меньше, там волатильность (и возможная будущая просадка) также ожидается меньшей. Или другой вариант. После проведения бек-теста, по результатам сделок строится аппроксимирующая линия (красного цвета) по методу наименьших квадратов. И опять ищется стандартное отклонение от этой линии. Эти вычисления несложно реализовать в блоке deinit() советника.

 
 


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

Функция iBandsOnArray() также вычисляет среднюю по массиву, а затем прибавляет( или отнимает от нее) некоторое количество стандартных отклонений. И опять получаем верхнюю или нижнюю полосу Боллинджера. Так как мы уже убедились, что вычисление средней и стандартного отклонения по массиву в МТ4 происходит без ошибок, то проверку из скрипта этих двух функций делать не имеет смысла. Они в некотором роде похожи.

Функции iCCIOnArray() и iRSIOnArray() более специфичны, реже используются в пользовательских кодах, и поэтому рассматривать я их не стал. Основные ошибки при использовании всех этих функций на массивах:
  1. забывают объявлять тип double для массивов
  2. забывают объявлять массивы как ценовые серии(индикаторные буферы этого не требуют).
Во всех приведенных примерах использовалось простое сглаживание, сделано это было только для простоты ручной проверки в Excel. Вид сглаживания для своих задач вы выбираете сами.

Коды скриптов, индикаторов и файлы Microsoft Excel можно взять здесь .
Перейти к статье «Работа с массивами».
 
+7 (495) 710-76-76
8 (800) 200-01-31
по России бесплатно

закрыть

Вход в личный кабинет

Для счета alpari.classic введите номер счета (буква и 4 цифры) и пароль в ЛК.

Для счетов alpari.micro и alpari.partner введите логин и пароль в МТ.

Зарегистрироваться!Забыли пароль?

 
Rambler's Top100