Сам фильтр нужно создать так, чтобы его можно было бы включать (выключать) в соответсвие с выбором трейдера, а не так, чтобы он всегда работал по умолчанию. В общем, это азы модульности программы.
Итак, рассмотрим теорию пребывания цены выше ниже скользящей средней. У нас есть два случая:
1. Цена выше скользящей средней;
2. Цена ниже скользящей средней.
Понять по какому критерию мы должны оценивать выше / ниже не сложно. Само тело свечей должно быть выше (ниже) скользящей средней.
Таким образом,
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".
На работающем рынке нужно будет проверить выполнение функции. Возможно, потребуется исправить возможные ошибки.