Шаблон на основе цены и одной скользящей средней (в. 2)

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

Шаблон на основе цены и одной скользящей средней (в. 2)

Сообщение Haos » 20 мар 2022, 11:55

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

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

1. Цена выше скользящей средней;

Цена выше 2022-03-20 14-39-11.png

2. Цена ниже скользящей средней.

Цена ниже 2022-03-20 14-40-07.png

Понять по какому критерию мы должны оценивать выше / ниже не сложно. Само тело свечей должно быть выше (ниже) скользящей средней.
Таким образом,

1. Для свечи "i" выше скользящей средней условие будет:

Если [Close(i) > MA(i) И Open(i) > MA(i)] = Истина.

2. Для свечи "i" ниже скользящей средней условие будет:

Если [Close(i) < MA(i) И Open(i) < MA(i)] = Истина.

Примечание: условия выше написаны понятными логическими фразами, без привязки к языку программирования.

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

Это можно записать так:

1. От i = 0 до i < N, если [Close(i) > MA(i) И Open(i) > MA(i)] = Истина], то Истина, иначе Ложь (по умолчанию). Это условия для бычьего фильтра.

2. От i = 0 до i < N, если [Close(i) < MA(i) И Open(i) < MA(i)] = Истина], то Истина, иначе Ложь (по умолчанию). Это условия для медвежьего фильтра.

Всё это несложно будет реализовать в коде на MQL4, чем и займемся.

Как и всегда в аналогичных примерах, создадим отдельную функцию для выполнения данной задачи.
Это будет строковая функция, возвращающая три значения:
- "UP" - если положение заданного кол-ва свечей выше скользящий средней - истина;
- "DN" - если положение заданного кол-ва свечей ниже скользящий средней - истина;
- "NO" - если не истинно ни положительное, ни отрицательное положение свечей относительно скользящей средней.

Входящими параметрами функции f_FilterFlat будут:
pe - период скользящей средней;
me - метод расчета скользящей средней;
ap - тип цены при расчете скользящей средней;
n - количество свечей для анализа.

Код: выделить все
string f_FilterFlat(int pe, int me, int ap, int n)
{
// n - кол-во свечей для анализа
   string strTre = "NO";
   int intUP = 0, intDN = 0; // контрольные сумма
   
   double dblMA = iMA(NULL, 0, pe, 0, me, ap, 0);
   if(Open[0] >= dblMA) strTre = "UP";
   else if(Open[0] < dblMA) strTre = "DN";
   
 
   if(strTre == "UP")
   {
      for(int i = 1; i <= n; i++)
      {
         dblMA = iMA(NULL, 0, pe, 0, me, ap, i);
         if(Open[i] > dblMA && Close[i] > dblMA) intUP++;
      }
      if (intUP == n) return("UP");
   }
   else if(strTre == "DN")
   {
     for(int i = 1; i <= n; i++)
     {
        dblMA = iMA(NULL, 0, pe, 0, me, ap, i);
        if(Open[i] < dblMA && Close[i] < dblMA) intDN++;
     }
     if(intDN == n) return("DN");
   }
   
return("NO");
}


В начале мы определяем "тренд" по цене открытия текущей (т.е. нулевой) свечи. Очевидно, что если открытие нулевой свечи выше скользящей средней, то нас будет интересовать ситуация с телами свечей только выше скользящей средней, а если открытие текущей свечи ниже скользящей средней, то нас будет интересовать ситуация с телами свечей только ниже скользящей средней. Поэтому, открытие текущей свечи и можно сказать, что определяет тренд в этом смысле.

По-хорошему процедуру определения указанного "тренда" можно тоже выделить в отдельную фукнцию, но пока оформим всё в отдельной функции.
После того, как мы установили наличие или бычьего или медвежьего тренда, мы в цикле пробегаем по всем свечам на предмет проверки выполнения нашего требования. Был использован специфический прием, для проверки того факта, чтобы все свечи выполняли требуемое условие. Для этого использовалась контрольная сумма. Каждый раз, когда на очередной свече условие выполнялось, то контрольная сумма увеличивалась на 1. В итоге, если контрольная сумма будет равной количеству свечей, которые мы анализировали, то условие выполнения данного фильтра выполнено. Функция вернет или "UP" или "DN".

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

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

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

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

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

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

cron