Напомним его:
- покупка осуществляется, если быстрая скользящая средняя пересекает медленную скользящую среднюю снизу вверх;
- продажа осуществляется, если быстрая скользящая средняя пересекает медленную скользящую среднюю сверху вниз;
При этом, поскольку данный алгоритм торговли риверсивный, т.е. в рынке всегда есть позиции и они сменяют друг друга по направлению по очередному сигналу, то открытие покупки подразумевает одновременное закрытие продажи, а открытие продажи одновременное закрытие покупки.
Прежде всего, на каждом тике нам нужно вычислять значения скользящих средних (быстрой и медленной) в соответствие с введенными в советник их параметрами и проверять на наличие торгового сигнала.
Поскольку для определения торгового сигнала на основе пересечения двух скользящих средних нам нужны четыре значения: два для каждой скользящей средней и при этом на предыдущих закрытых свечах, то нужно ввести четыре переменные. Они будут типа 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")
{
...
}
Итак, мы на примере торговли на основе пересечения двух скользящих средних рассмотрели выполнения алгоритма на каждом тике каждого бара.