Русский

Учебник по MQL4  Создание обычной программы  Функция определения торговых критериев


Функция определения торговых критериев


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

В общем случае могут быть определены следующие критерии:

  • критерий для открытия рыночного ордера;
  • критерий для закрытия рыночного ордера;
  • критерий для частичного закрытия рыночного ордера;
  • критерий для встречного закрытия рыночных ордеров;
  • критерий для модификации заявленных цен стоп-приказов рыночного ордера;
  • критерий для установки отложенного ордера;
  • критерий для удаления отложенного ордера;
  • критерий для модификации заявленной цены открытия отложенного ордера;
  • критерий для модификации заявленных цен стоп-приказов отложенного ордера.

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

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

Торговая стратегия, реализованная в рассматриваемом эксперте, предполагает использование только взаимоисключающих критериев. Поэтому в представленной здесь функции Criterion() для передачи вычисленных критериев другим функциям используется значение, возвращаемое функцией.

Пользовательская функция Criterion()

int Criterion()

Функция вычисляет торговые критерии. Функция возвращает следующие значения:
10 - сработал торговый критерий для открытия рыночного ордера Buy;
20 - сработал торговый критерий для открытия рыночного ордера Sell;
11 - сработал торговый критерий для закрытия рыночного ордера Buy;
21 - сработал торговый критерий для закрытия рыночного ордера Sell;
0 - значимых критериев нет;
-1 - используемый финансовый инструмент не является EURUSD.

Функция использует значения следующих внешних переменных:
St_min - нижний уровень индикатора Stochastic Oscillator;
St_max - верхний уровень индикатора Stochastic Oscillator;
Open_Level - уровень индикатора MACD (для открытия ордеров);
Close_Level - уровень индикатора MACD (для закрытия ордеров).

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

Функция определения торговых критериев Criterion() оформлена в виде включаемого файла Criterion.mqh:

//--------------------------------------------------------------------
// Criterion.mqh
// Предназначен для использования в качестве примера в учебнике MQL4.
//--------------------------------------------------------------- 1 --
// Функция вычисления торговых критериев.
// Возвращаемые значения:
// 10 - открытие Buy
// 20 - открытие Sell
// 11 - закрытие Buy
// 21 - закрытие Sell
// 0 - значимых критериев нет
// -1 - используется другой финансовый инструмент
//--------------------------------------------------------------- 2 --
// Внешние переменные:
extern int St_min=30; // Миним. уровень стохастика
extern int St_max=70; // Максим. уровень стохастика
extern double Open_Level =5; // Уровень MACD для откр.(+/-)
extern double Close_Level=4; // Уровень MACD для закр.(+/-)
//--------------------------------------------------------------- 3 --
int Criterion() // Пользовательская функция
{
string Sym="EURUSD";
if (Sym!=Symbol()) // Если не наш фин. инструмент
{
Inform(16); // Сообщение..
return(-1); // .. и выход
}
double
M_0, M_1, // Значение MAIN на 0 и 1 барах
S_0, S_1, // Значение SIGNAL на 0 и 1 бар
St_M_0, St_M_1, // Значение MAIN на 0 и 1 барах
St_S_0, St_S_1; // Значение SIGNAL на 0 и 1 бар
double Opn=Open_Level*Point; // Уровень откр. MACD (пунктов)
double Cls=Close_Level*Point; // Уровень закр. MACD (пунктов)
//--------------------------------------------------------------- 4 --
// Параметры технич. индикат:
M_0=iMACD(Sym,PERIOD_H1,12,26,9,PRICE_CLOSE,MODE_MAIN,0); // 0 бар
M_1=iMACD(Sym,PERIOD_H1,12,26,9,PRICE_CLOSE,MODE_MAIN,1); // 1 бар
S_0=iMACD(Sym,PERIOD_H1,12,26,9,PRICE_CLOSE,MODE_SIGNAL,0);//0 бар
S_1=iMACD(Sym,PERIOD_H1,12,26,9,PRICE_CLOSE,MODE_SIGNAL,1);//1 бар

St_M_0=iStochastic(Sym,PERIOD_M15,5,3,3,MODE_SMA,0,MODE_MAIN, 0);
St_M_1=iStochastic(Sym,PERIOD_M15,5,3,3,MODE_SMA,0,MODE_MAIN, 1);
St_S_0=iStochastic(Sym,PERIOD_M15,5,3,3,MODE_SMA,0,MODE_SIGNAL,0);
St_S_1=iStochastic(Sym,PERIOD_M15,5,3,3,MODE_SMA,0,MODE_SIGNAL,1);
//--------------------------------------------------------------- 5 --
// Вычисление торговых критериев
if(M_0>S_0 && -M_0>Opn && St_M_0>St_S_0 && St_S_0<St_min)
return(10); // Открытие Buy
if(M_0<S_0 && M_0>Opn && St_M_0<St_S_0 && St_S_0>St_max)
return(20); // Открытие Sell
if(M_0<S_0 && M_0>Cls && St_M_0<St_S_0 && St_S_0>St_max)
return(11); // Закрытие Buy
if(M_0>S_0 && -M_0>Cls && St_M_0>St_S_0 && St_S_0<St_min)
return(21); // Закрытие Sell
//--------------------------------------------------------------- 6 --
return(0); // Выход из пользов. функции
}
//--------------------------------------------------------------- 7 --

В блоке 1-2 описаны значения, возвращаемые функцией. В блоке 2-3 объявлены некоторые внешние переменные. Включаемый файл Criterion.mqh - единственный файл, используемый в рассматриваемом эксперте, в котором объявлены глобальные (в данном случае - внешние) переменные. В разделе Структура обычной программы приведены причины, указывающие на необходимость объявления всех без исключения глобальных переменных в отдельном файле Variables.mqh. В данном случае внешние переменные объявлены в файле Criterion.mqh по двум причинам: во-первых, для того, чтобы продемонстрировать техническую возможность (такая возможность бывает не всегда), во-вторых, для того, чтобы показать, как можно использовать внешние переменные в период отладки и тестирования программы.

Техническая возможность объявления внешних переменных в файле Criterion.mqh существует потому, что эти переменные ни в каких других функциях программы не используются. Значения внешних переменных, объявленных в блоке 2-3, определяют уровни для индикаторов Stochastic Oscillator и MACD и используются только в рассматриваемой функции Criterion(). Объявление внешних переменных в файле, содержащем функцию определения торговых критериев, может быть оправданно в случае, если файл с таким содержанием используется временно, а именно, в течение периода отладки программы и вычисления оптимальных значений этих внешних переменных. Для этой цели можно ввести и другие внешние переменные, например, для оптимизации параметров индикаторов (в данном случае константами заданы значения 12,26,9 для MACD и 5,3,3 для Stochastic Oscillator). По окончании работы над программой указанные внешние переменные могут быть удалены из программы, а вместо них в программе должны использоваться константы со значениями, вычисленными во время оптимизации.

В блоке 3-4 открыты и описаны локальные переменные. Эксперт предназначен для использования на финансовом инструменте EURUSD, поэтому в блоке 3-4 выполняется необходимая проверка. Если эксперт запущен в окне другого финансового инструмента, то функция заканчивает работу и возвращает значение -1 (не тот инструмент).

В программе используются значения двух индикаторов, вычисленные на текущем и предыдущем барах (блок 4-5). При обычном применении индикаторов Stochastic Oscillator и MACD сигналы на покупку и продажу образуются в момент пересечения двух индикаторных линий. В данном случае для определения торговых критериев используются одновременно два индикатора. Вероятность того, что в некоторый момент времени произойдёт пересечение индикаторных линий одновременно в двух индикаторах, очень невелика. Более вероятно, что пересечения могут произойти последовательно одно за другим - сначала в одном индикаторе, а несколько позднее - в другом. В случае, если пересечения индикаторных линий происходят через небольшой промежуток времени, можно считать, что вместе два индикатора сформировали торговый критерий.

Например, критерий на покупку вычисляется так (блок 5-6):

if(M_0>S_0 && -M_0>Opn && St_M_0>St_S_0 && St_S_0<St_min)

В соответствии с этой записью, критерий на покупку является значимым, если соблюдаются условия:

  • в индикаторе MACD индикаторная линия MAIN (гистограмма) находится выше индикаторной линии SIGNAL и при этом находится ниже нижнего уровня Open_Level (рис. 157);
  • в индикаторе Stochastic Oscillator индикаторная линия MAIN находится выше индикаторной линии SIGNAL и при этом находится ниже минимального уровня St_min (рис. 158).


Рис. 157. Необходимое условие положения индикаторных линий MACD для подтверждения факта значимости торговых критериев для открытия и закрытия ордеров.

В левой части рис. 157 показано положение индикаторных линий MACD, при котором срабатывают два критерия - открытие Buy и закрытие Sell. Индикаторная линия MAIN находится ниже уровня 0.0005 в период времени T1 = t 1 - t 0. Если в этот период сложатся необходимые показания индикатора Stochastic Oscillator, то сработает критерий для открытия Buy. В течение времени T2 = t 2 - t 0 линия MAIN находится также ниже уровня 0.0004. Если в это время произойдёт подтверждение индикатора Stochastic Oscillator, то сработает критерий для закрытия Sell.

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

В данном случае (согласно рассматриваемой торговой стратегии) приоритет у критерия открытия Buy выше, чем у критерия закрытия Sell. Поэтому в блоке 5-6 программная строка, в которой вычисляется критерий для открытия ордера Buy находится выше по тексту. Если в период T1 (рис. 157) получено подтверждение индикатора Stochastic Oscillator, то функция возвращает значение 10, поставленное в соответствие этому критерию. В период времени с момента t 1 до момента t 2 функция вернёт значение 21, поставленное в соответствие критерию закрытия Sell.

Одновременно с этим, при исполнении торговых функций будут сформированы необходимые торговые приказы. При срабатывании критерия открытия Buy прежде всего будут сформированы торговые приказы для закрытия всех имеющихся ордеров Sell, и когда не останется ни одного из них, будет отдан торговый приказ на открытие одного ордера Buy. Соответственно, при срабатывании критерия на закрытие Sell будет сформирована последовательность торговых приказов только на закрытие всех ордеров Sell (см. Торговые функции).

Условия, при которых срабатывает подтверждение индикатора Stochastic Oscillator, показаны на рис. 158.


Рис. 158. Необходимое условие положения индикаторных линий Stochastic Oscillator для подтверждения факта значимости торговых критериев для открытия и закрытия ордеров.

Согласно программному коду, указанному в блоке 5-6, критерии для открытия Buy и закрытия Sell могут оказаться значимыми при условии, если в индикаторе Stochastic Oscillator индикаторная линия MAIN окажется выше сигнальной линии SIGNAL, причём линия MAIN будет находиться ниже минимального уровня St_min. На рис. 158 такие условия складываются в течение периода времени Ts. Зеркальные условия подтверждают срабатывание критериев для открытия ордера Sell и закрытия ордеров Buy (в правой части рис. 158). Если ни один из критериев не сработал, то функция возвращает 0. При этих условиях могут выполняться другие торговые операции, например, корректировка заявленных значений стоп-приказов.

Отдельно нужно заметить, что рассматриваемая торговая стратегия предполагает использование показаний индикатора MACD, рассчитанного на часовом таймфрейме, а Stochastic Oscillator - на 15-минутном. В период тестирования с целью оптимизации таймфрейм может быть изменён. Однако по окончании тестирования в окончательном коде функции Criterion() обязательно необходимо указать константные значения для всех вычисленных параметров, в том числе, для таймфреймов. Эксперт должен использоваться только в тех условиях, для которых он создавался. В представленном варианте (с явно указанными в индикаторах значениями PERIOD_H1 и PERIOD_M15) эксперт будет учитывать только необходимые параметры независимо от текущего таймфрейма, установленного в окне финансового инструмента, где запущен эксперт.

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