Определение тренда на основе одной МА и цены

Программирование прибыли: от азов к секретам мастерства. Читайте, спрашивайте, делитесь опытом.
Бонус за сообщение 0.5$
Ответственный Модератор - Haos

Определение тренда на основе одной МА и цены

Сообщение Haos » 10 май 2016, 12:57

Теперь, когда мы знаем как получать в советнике значение скользящей средней (Как получить значение скользящей средней?) и умеем выводить на экран комментарий (Как вывести комментарий на экран?), мы можем создать советник для определения тренда на основе положения цены относительно скользящей средней.
Для начала получим значение скользящей средней так, как мы это делали в указанной статье:
Код: выделить все
double dblMA      = iMA("0", 0, 100, 0, MODE_SMA, PRICE_CLOSE, 1);

Далее введем дополнительно две переменные:
Код: выделить все
double dblPrice   = Close[1];
string strTrend = "NO";

Первая переменная dblPrice типа double будет возвращать значение цены закрытия прошлого бара. В MQL доступ к 4 значениям баров (открытие, закрытие, макс. цена, мин. цена) осуществляется через зарезервированные массивы (в данном случае Close). К номеру массива обращаются через квадратные скобки "[ ]", а сами бары пронумерованы от текущего, который имеет номер 0 назад до первого бара на экране. Таким образом, прошлый бар будет иметь всегда номер "1", второй бар назад - "2" и т.д.
Итак, запись Close[1] - возвращает цену закрытия прошлого бара.

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

Вторая переменная strTrend типа string нужна для присвоения ей фактического названия имеющегося в данный момент тренда. Я использую следующие обозначения:
"NO" - значение не определено (в данном случае тренд не идентифицирован, что может быть при определенных требованиях);
"UP" - восходящий / бычий тренд (также я использую такое обозначения для сигнала от индикаторов на покупку);
"DN" - нисходящий / медвежий тренд (также я использую такое обозначения для сигнала от индикаторов на продажу);

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

Итак, вторая переменная инициирована изначально значением "NO".

Далее, напишем 2 строчки кода, для определения тренда по закрытию прошлого бара:

Код: выделить все
   if(dblPrice > dblMA) strTrend = "UP";
   if(dblPrice < dblMA) strTrend = "DN";

Происходит сравнение переменной dblPrice со значением переменной dblMA и переменная strTrend получает значения, соответствующие или бычьему или медвежьему тренду (если эти два условия не выполняются, то значение переменной останется равной "NO").
Далее, выведем в качестве комментария рассчитанную информацию на экран:
Код: выделить все
Comment( "\n", "Тренд: ", strTrend);

Запустив советник на графике с установленной на нем скользящей средней с аналогичными параметрами, увидим подобную картину:
01.png


Полный код функции OnTick():
Код: выделить все
   double dblMA      = iMA("0", 0, 100, 0, MODE_SMA, PRICE_CLOSE, 1);
   double dblPrice   = Close[1];
   string strTrend = "NO";
   
   if(dblPrice > dblMA) strTrend = "UP";
   if(dblPrice < dblMA) strTrend = "DN";
   
   Comment( "\n", "Тренд: ", strTrend);


Советник выложен для скачивания ниже.
Вложения
EA-Example_007.mq4
(1.57 KB) Скачиваний: 53
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.

Re: Определение тренда на основе одной МА и цены

Сообщение Haos » 01 июн 2016, 18:53

После освоения задания входных параметров в коде советника и первого применения их, мы можем приступить к освоению представления кода в виде пользовательских функций.
Правильный стиль программирования - "блочный". Тот участок кода, который представляет из себя независимые и используемые неоднократно команды должен быть оформлен в пользовательские функции. Это позволит в дальнейшем использовать их в однотипных процедурах других советников. В более широком смысле программисты давно применяют структуры, классы и т.п. В данном случае нужно научиться создавать функции.
Оформим написанный ранее код для определения тренда на основе одной МА и цены в виде функции:
Код: выделить все
string f_MATrend(string sy, int tf, int pe, int msh, int me, int ap, int sh, double pr)
{
/*
   Определяет тренд на основе одной МАшки и цены. 
   "UP" - цена выше МАшки;
   "DN" - цена ниже МАшки;
   "NO" - сигнал не определен;
   Параметры:
   sy - // имя символа  ("0" - текущий символ)
   tf - // таймфрейм    (0 - текущий ТФ)
   pe - // период
   msh - // сдвиг средней
   me - // метод усреднения
   ap - // тип цены
   sh - // сдвиг
   pr - // цена
*/   
   if(sy == "0") sy = Symbol();
   double dblMA = iMA(sy, tf, pe, msh, me, ap, sh);
   if(pr > dblMA) return ("UP");
   if(pr < dblMA) return ("DN");

return("NO");
}

Данная функция возвращает тип string. В качестве возвращаемых значений будут ("UP" - цена выше скользящей средней и т.д.). Это описано в комментарии в функции, а также передаваемые в функцию параметры. Функция располагается в конце кода советника после всех стандартных функций. Вызывается она в функции OnTick(), которая примет вид:
Код: выделить все
void OnTick()
{
   double dblPrice   = Close[1];
   string strTrend = f_MATrend("0", 0, intMAPe, intMASh, intMAMe, intMAAp, 0, dblPrice);
   
   Comment( "\n", "Тренд: ", strTrend);
}

Запустив советник на выполнение на графике в виде комментария увидим соответствующую надпись, о наличие текущего тренда (левый верхний угол на графике). Также для проверки правильности можно запустить индикатор скользящей средней с теми же параметрами, что заданы в советнике.
02.png

Сам советник можно скачать по ссылке ниже.
Вложения
EA-Example_007.1.mq4
(2.26 KB) Скачиваний: 53
Аватар пользователя
Haos
Специалист MQL
 
Сообщений: 24699
Зарегистрирован: 29 мар 2014, 16:07
Средств на руках: 193.70 Доллар
Группа: Главные модераторы
Благодарил (а): 3379 раз.
Поблагодарили: 8200 раз.


Вернуться в MQL – теория и практика

Кто сейчас на форуме?

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 54

Права доступа к форуму

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения