Новый тик (пример 1)

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

Новый тик (пример 1)

Сообщение Haos » 21 июл 2021, 09:42

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

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

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

Поскольку для определения торгового сигнала на основе пересечения двух скользящих средних нам нужны четыре значения: два для каждой скользящей средней и при этом на предыдущих закрытых свечах, то нужно ввести четыре переменные. Они будут типа double.

Код: выделить все
double   dblMAF_1,   // значение быстрой MA на предыдущем баре
              dblMAF_2,   // значение быстрой MA два бара назад
              dblMAS_1,   // значение медленной MA на предыдущем баре
              dblMAS_2;   // значение медленной MA два бара назад
 
   dblMAF_1 = iMA(NULL, 0, 10, 0, MODE_SMA, PRICE_MEDIAN, 1);
   dblMAF_2 = iMA(NULL, 0, 10, 0, MODE_SMA, PRICE_MEDIAN, 2);
   dblMAS_1 = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_MEDIAN, 1);
   dblMAS_2 = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_MEDIAN, 2);


В качестве примера возьмем быструю скользящую среднюю с периодом 10, медленную с периодом 20. Пусть это будут простые скользящие средние MODE_SMA и расчет будет вестись по медиане свечей PRICE_MEDIAN.
Почему по медиане? Да потому, что закрытие свечи играет роль только начиная с дневного ТФ, а при интрадей торговле наиболее значимым является именно медиана свечей. Впрочем, разница небольшая в значениях скользящих средних и это не принципиально, каждый разработчик или пользователь может выбирать нужный ему параметр, который, единственное важное, должен быть вынесен разработчиком во внешние параметры советника, чтобы можно было осуществлять данный выбор пользователю.

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

Код: выделить все
if(dblMAF_1 > dblMAS_1 && dblMAF_2 < dblMAS_2)  ... // сигнал на покупку
if(dblMAF_1 < dblMAS_1 && dblMAF_2 > dblMAS_2) ...   // сигнал на продажу

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

Итак, перая строка должна вернуть значение на покупку, а вторая на продажу. Если оба условия окажутся ложными, то должа быть возвращена команда на отсутствие торгового сигнала.

Итак, сразу приведу данную функцию, которую в отдельной теме можно рассмотреть будет подробно:

Код: выделить все
string f_2MASyg(int pe_F, int pe_S, int me, int ap)                 
/*
   08.08.2020 г.
   Ф-ия определяет сигнал по пересечению 2 МАшек (на последнем закрытом баре)
   возвращает "UP" если быстрая МА пересекла вверх медленную МА
   возвращает "DN" если быстрая МА пересекла вниз медленную МА
   возвращает "NO" если нет пересечения
   Параметры:
   pe_F  -  // период быстрой МАшки
   pe_S  -  // период медленной МАшки   
   me  -  // метод усреднения
   ap  -  // тип цены

*/
{
double   dblMAF_1,   // значение быстрой MA на предыдущем баре
         dblMAF_2,   // значение быстрой MA два бара назад
         dblMAS_1,   // значение медленной MA на предыдущем баре
         dblMAS_2;   // значение медленной MA два бара назад
 
   dblMAF_1 = iMA(NULL, 0, pe_F, 0, me, ap, 1);
   dblMAF_2 = iMA(NULL, 0, pe_F, 0, me, ap, 2);
   dblMAS_1 = iMA(NULL, 0, pe_S, 0, me, ap, 1);
   dblMAS_2 = iMA(NULL, 0, pe_S, 0, me, ap, 2);
   
   if(dblMAF_1 > dblMAS_1 && dblMAF_2 < dblMAS_2) return("UP");
   if(dblMAF_1 < dblMAS_1 && dblMAF_2 > dblMAS_2) return("DN");
   
return("NO");
}

Вот эта вот функция и должна выполняться на каждом тике. Она будет каждый тик проверять есть ли торговый сигнал.
Вставляем её в процедуру для каждого тика:

Код: выделить все
void OnTick()
{
   // Наличие сигналов на вход в рынок:
   string strSyg = f_2MASyg(10, 20, MODE_SMA, PRICE_MEDIAN);
}


Далее мы проверяем полученный результат выполнения функции на наличие торгового сигнала и выполняем торговые действия, если они есть.
Код: выделить все
if(strSyg == "UP" || strSyg == "DN")
{
   ...
}

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

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

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

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

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

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