Русский

Учебник по MQL4  Простые программы на MQL4  Использование технических индикаторов

Использование технических индикаторов


По признаку принадлежности к информационно-торговой системе MetaTrader в MQL4 различают два вида индикаторов - технические и пользовательские.

Технический индикатор - это составная часть информационно-торговой системы MetaTrader, встроенная функция, позволяющая графически отображать на экране определённую зависимость.


Свойства технических индикаторов


Отображение в окне финансового инструмента


Каждый технический индикатор рассчитывает некоторую предопределённую зависимость. Чтобы отобразить эту зависимость графически на экране, необходимо присоединить технический индикатор к окну финансового инструмента. Это можно выполнить, обратившись к системному меню Вставка >> Индикаторы или к окну Навигатора клиентского терминала. Для присоединения технических индикаторов к окну финансового инструмента из Навигатора используется очень простой способ - достаточно перетянуть название нужного технического индикатора из Навигатора в окно финансового инструмента. В результате этого события в окне появятся одна или несколько цветных линий, рассчитанных в этом индикаторе.


Рис. 104. Присоединение к технического индикатора к окну финансового инструмента.

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

Неизменность кода


Все технические индикаторы являются встроенными, их код недоступен пользователю для внесения изменений. Таким образом, пользователь гарантирован от ошибочного изменения кода встроенных технических индикаторов. Вместе с тем, исходный код, по которому рассчитан каждый технический индикатор, доступен на сайте производителя ПО (MetaQuotes Software Corp.) в разделе Технические индикаторы. В случае необходимости программист может использовать полностью или частично эти коды для создания пользовательских индикаторов (см. Создание пользовательских индикаторов).

Вызов функции технического индикатора


Графическое изображение, видимое пользователем, воспроизводится на экране клиентским терминалом. В дальнейшем, для простоты изложения, мы будем называть эти изображения индикаторными линиями.

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

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

Индикаторный массив - одномерный массив, содержащий численные значения, в соответствии с которыми строятся индикаторные линии. Численные значения элементов индикаторного массива - это координаты точек, по которым строится индикаторная линия. При этом координатой каждой точки по оси Y является значение элемента индикаторного массива, а координатой по оси Х - значение индекса элемента индикаторного массива.

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

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

В составе клиентского терминала информационно-торговой системы MetaTrader имеется ряд Технических индикаторов. Рассмотрим некоторые из них.

Скользящее Среднее (Moving Average, MA).

Технический Индикатор Скользящее Среднее (Moving Average, MA) показывает среднее значение цены инструмента за некоторый период времени. Индикатор отражает общую тенденцию рынка - может расти, убывать или показывать незначительные колебания возле некоторой цены.

Для получения значения индикаторной линии МА в какой-либо момент времени необходимо воспользоваться стандартной функцией:

double iMA(string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift)

Параметры:

symbol - символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe - период. Может быть одним из периодов графика. 0 означает период текущего графика.

period - период усреднения для вычисления скользящего среднего.

ma_shift - сдвиг индикатора относительно ценового графика.

ma_method - метод усреднения. Может быть одним из значений методов скользящего среднего (Moving Average).

applied_price - используемая цена. Может быть любой из ценовых констант.

shift - индекс значения, получаемого из индикаторного массива (сдвиг относительно текущего бара на указанное количество баров назад).

Ниже приведен пример вызова функции технического индикатора из эксперта callindicator.mq4 :

//--------------------------------------------------------------------
// callindicator.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
extern int Period_MA = 21; // Период расчётной МА
bool Fact_Up = true; // Факт сообщения, что цена..
bool Fact_Dn = true; //..находится выше или ниже МА
//--------------------------------------------------------------------
int start() // Спец. функция start
{
double MA; // Значение МА на 0 баре
//--------------------------------------------------------------------
// Обращение к функции техн.инд.
MA=iMA(NULL,0,Period_MA,0,MODE_SMA,PRICE_CLOSE,0);
//--------------------------------------------------------------------
if (Bid > MA && Fact_Up == true) // Проверка прохода вверх
{
Fact_Dn = true; // Сообщать о цене выше МА
Fact_Up = false; // Не сообщать о цене ниже МА
Alert("Цена находится выше MA(",Period_MA,").");// Сообщение
}
//--------------------------------------------------------------------
if (Bid < MA && Fact_Dn == true) // Проверка прохода вниз
{
Fact_Up = true; // Сообщать о цене ниже МА
Fact_Dn = false; // Не сообщать о цене выше МА
Alert("Цена находится ниже MA(",Period_MA,").");// Сообщение
}
//--------------------------------------------------------------------
return; // Выход из start()
}
//--------------------------------------------------------------------

В эксперте callindicator.mq4 используется вызов функции iMA() технического индикатора Скользящее Среднее. Рассмотрим эту часть кода более подробно:

   MA=iMA(NULL,0,Period_MA,0,MODE_SMMA,PRICE_CLOSE,0);

NULL означает, что расчёт скользящей средней производится для того финансового инструмента, в окно которого присоединён эксперт (в данном случае - эксперт, в общем случае - любая прикладная программа);

0 - расчёт производится для таймфрейма, установленного в окне финансового инструмента, к которому присоединён эксперт;

Period_MA - значение периода усреднения задано во внешней переменной; если после присоединения к окну финансового инструмента пользователь не изменил это значение на панели настроек внешних переменных эксперта, то это значение равно 5;

0 - сдвиг индикаторного массива относительно ценового графика не производился, т. е значения элементов индикаторного массива содержат те значения МА, которые рассчитаны для баров, на которых отображается индикаторная линия;

MODE_SMA - для расчёта выбран метод простого скользящего среднего;

PRICE_CLOSE - для расчёта принята цена закрытия бара;

0 - индекс элемента индикаторного массива, для которого получено значение - в данном случае, для нулевого элемента.

Учитывая, что сдвиг индикаторного массива относительно ценового графика не производился, значение скользящей средней получено для нулевого бара. Функция iMA() возвращает некоторое значение, которое присваивается переменной MA. В дальнейших строках программы это значение сравнивается с текущей ценой Bid. Если текущая цена оказывается выше или ниже полученного значения МА (т.е. выше линии), то выдаётся сообщение пользователю. Использование в программе переменных Fact_Up и Fact_Dn позволяет выводить сообщения только в случаях, если происходит первое проникновение цены через линию МА (обратите внимание, голубая индикаторная линия в окне финансового инструмента отражена не потому, что функция технического индикатора была вызвана из программы, а потому, что пользователь прикрепил индикатор в окно, Рис. 104).


Рис. 105. Результат работы эксперта callindicator.mq4.

Здесь необходимо напомнить, что по мере появления новых баров индексы исторических баров увеличиваются, а текущий, развивающийся бар всегда имеет индекс 0. В эксперте callindicator.mq4 функция технического индикатора iMA() возвращает значение, рассчитанное для нулевого бара. Несмотря на то, что во время исполнения данного эксперта значение этого индекса никогда не меняется (т.е. расчёт всегда производится для нулевого бара), значение, возвращаемое функцией iMA(), всегда будет соответствовать последнему расчётному, а именно, рассчитанному для текущего нулевого бара.

Если для каких-либо расчётов в программе необходимо получить значение функции технического индикатора не для нулевого, а для какого-либо исторического бара, то в вызове функции необходимо указать значение индекса того элемента индикаторного массива, который нужен. Рассмотрим пример эксперта historybars.mq4, в котором вычисляется значение Скользящей Средней на четвёртом баре:

//--------------------------------------------------------------------
// historybars.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
extern int Period_MA = 5; // Период расчётной МА
//--------------------------------------------------------------------
int start() // Спец. функция start
{
double MA_c, // Значение МА на 0 баре
MA_p, // Значение МА на 4 баре
Delta; // Разница МА на 0 и 4 баре
//--------------------------------------------------------------------
// Обращение к функции техн.инд.
MA_c = iMA(NULL,0,Period_MA,0,MODE_SMA,PRICE_CLOSE,0);
MA_p = iMA(NULL,0,Period_MA,0,MODE_SMA,PRICE_CLOSE,4);
Delta = (MA_c - MA_p)Point; // Разница МА на 0 и 4 баре
//--------------------------------------------------------------------
if (Delta > 0 ) // Текущая цена больше старой
Alert("На 4 барах МА выросла на ",Delta,"pt"); // Сообщение
if (Delta < 0 ) // Текущая цена меньше старой
Alert("На 4 барах МА снизилась на ",-Delta,"pt");// Сообщение
//--------------------------------------------------------------------
return; // Выход из start()
}
//--------------------------------------------------------------------

В эксперте historybars.mq4 рассчитываются значения МА для текущего бара (с индексом 0) и для четвёртого бара (с индексом 4). Указанные значения индексов 0 и 4 в процессе работы (этой, конкретной) программы не изменяются, в то же время программа может работать бесконечно долгое время, всякий раз выполняя необходимые вычисления значений МА для нулевого и четвёртого бара. Здесь важно ещё раз отметить: несмотря на то, что вычисления ведутся для МА на барах с одними и теми же индексами, сами значения МА будут меняться, а именно соответствовать текущим значениям МА на текущем нулевом и текущем четвёртом баре.


Рис. 106. Результат работы эксперта historybars.mq4.

На Рис. 106 хорошо видно, что по мере роста цены на последних барах МА поднимается вверх. Разница между значениями МА на нулевом и четвёртом барах также растёт, что находит своё отражение в сообщениях функции Alert().


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

Стохастический Осциллятор (Stochastic Oscillator).

Технический Индикатор Стохастический Осциллятор (Stochastic Oscillator) сопоставляет текущую цену закрытия с диапазоном цен за выбранный период времени. Индикатор представлен двумя индикаторными линиями. Главная линия называется %K. Вторая линия %D, сигнальная, это - скользящее среднее линии %K . Обычно %K изображается сплошной линией, а %D - пунктирной. Согласно одному из вариантов трактовки показаний индикатора следует покупать, если линия %K поднимается выше линии %D и продавать, если линия %K опускается ниже линии %D. Наиболее благоприятным моментом для совершения торговой операции считается момент пересечения линий.

double iStochastic(string symbol, int timeframe, int %Kperiod, int %Dperiod, int slowing, int method,
 
int price_field, int mode, int shift)

Параметры:

symbol - символьное имя инструмента, на данных которого будет вычисляться индикатор. NULL означает текущий символ.

timeframe - период. Может быть одним из периодов графика. 0 означает период текущего графика.

%Kperiod - период(количество баров) для вычисления линии %K.

%Dperiod - период усреднения для вычисления линии %D.

slowing - значение замедления.

method - метод усреднения. Может быть любым из значений методов скользящего среднего (Moving Average).

price_field - Параметр выбора цен для расчета. Может быть одной из следующих величин: 0 - Low/High или 1 - Close/Close.

mode - индекс линии индикатора. Может принимать одно из значений: MODE_MAIN или MODE_SIGNAL.

shift - индекс получаемого значения из индикаторного буфера (сдвиг относительно текущего бара на указанное количество периодов назад).

Использование осциллятора Stochastic Oscillator предполагает необходимость анализа относительного положения линий. Для того, чтобы вычислить какое торговое решение необходимо осуществлять, следует принять во внимание значения каждой линии на текущем и на предыдущем барах (см. Рис. 107). При пересечении линий в точке А (зелёная линия пересекает красную снизу вверх) необходимо закрыть рыночный ордер Sell и открыть Buy. На всём протяжении участка А - В (нет пересечения линий, зелёная выше красной) необходимо удерживать открытым рыночный ордер Buy. В точке В (зелёная линия пересекает красную сверху вниз) необходимо закрыть Buy и открыть Sell. Далее - удерживать открытым ордер Sell до следующего пересечения линий (нет пересечений, зелёная остаётся ниже красной).


Рис. 107. Пересечение главной и сигнальной линий осциллятора Stochastic Oscillator.

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

//--------------------------------------------------------------------
// callstohastic.mq4
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------------
int start() // Спец. функция start
{
double M_0, M_1, // Значение MAIN на 0 и 1 барах
S_0, S_1; // Значение SIGNAL на 0 и 1барах
//--------------------------------------------------------------------
// Обращение к функции техн.индикат.
M_0 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN, 0);// 0 бар
M_1 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN, 1);// 1 бар
S_0 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,0);// 0 бар
S_1 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_SIGNAL,1);// 1 бар
//--------------------------------------------------------------------
// Анализ ситуации
if( M_1 < S_1 && M_0 >= S_0 ) // Зеленая пересекает красную снизу
Alert("Пересечение снизу вверх. ПОКУПКА."); // Сообщение
if( M_1 > S_1 && M_0 <= S_0 ) // Зеленая пересекает красную свеху
Alert("Пересечение сверху вниз. ПРОДАЖА."); // Сообщение

if( M_1 > S_1 && M_0 > S_0 ) // Зелёная выше красной
Alert("Продолжаем держать покупку."); // Сообщение
if( M_1 < S_1 && M_0 < S_0 ) // Зелёная ниже красной
Alert("Продолжаем держать продажу."); // Сообщение
//--------------------------------------------------------------------
return; // Выход из start()
}
//--------------------------------------------------------------------

Для получения значения линии %K (сплошная зелёная) на нулевом баре используется следующая строка вычислений:

      M_0 = iStochastic(NULL,0,5,3,3,MODE_SMA,0,MODE_MAIN,  0);// 0 бар

Здесь параметр MODE_MAIN указывает линию, значение которой запрашивается, а последний параметр 0 - индекс бара, для которого необходимо вычислить значение указанной линии. В последующих трёх строках программы аналогично вычисляются другие значения - для линии %D (красная пунктирная, параметр MODE_SIGNAL) для нулевого и первого баров.

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

     if( M_1 < S_1 && M_0 >= S_0 )  // Зеленая пересекает красную снизу
Alert("Пересечение снизу вверх. ПОКУПКА."); // Сообщение

вычисляется факт пересечения красной линии зелёной сигнальной линией сверху вниз. Если на предыдущем баре зелёная линия была ниже красной (т.е. истинным является выражение M_1 < S_1), а на текущем баре зелёная линия поднялась выше красной или их значения совпадают (т.е. истинным является выражение M_0 >= S_0), то это значит, что в период с момента образования предыдущего бара по настоящий момент зелёная линия пересекла красную снизу вверх. Таким образом, вычисленное условие в операторе if является истинным, поэтому управление передаётся в тело оператора if, в результате чего исполняется функция Alert() для вывода соответствующего сообщения пользователю.

В эксперте, предназначенном для торговли, в теле оператора if следует указать торговую функцию для открытия ордера Buy. В этом случае рассмотренный вариант пересечения индикаторных линий будет приводить к формированию торгового приказа и, в конечном счёте, - к осуществлению торговой операции. Для варианта, когда зелёная линия пересекает красную сверху вниз, в теле оператора if необходимо указать торговую функцию для открытия ордера на продажу.

На Рис. 108 показан результат работы эксперта callstohastic.mq4.


Рис. 108. Результат работы эксперта callstohastic.mq4.

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