|
|
Управление стратегиями.
Технология AutoGraf 4 предполагает
возможность использовать функцию автоматической торговли AG_AT(),
в которой указано
несколько алгоритмов различных стратегий. Во время практической работы любая из
этих стратегий может быть активизирована трейдером из окна финансового
инструмента.
В одной функции автоматической торговли может быть указано до 20
стратегий. Каждой стратегии ставится в соответствие название. Пользователь может
указать любые названия для стратегий по своему выбору в окне настроек эксперта.
Каждое название может состоять из произвольного сочетания символов. Общее количество символов в названии не должно превышать 3. Например: Box, F7, MQL и т.д.

Пользователь может задать произвольные названия для стратегий.
Для включения в работу желаемой стратегии пользователю необходимо выбрать соответствующее название
на шкале стратегий.
На шкале отображается 21 название. Первое из них (Fo)
означает, что стратегия не выбрана. Изменение этого названия пользователю
недоступно. Следующие 20 названий стратегий на шкале соответствуют тем, что
указаны пользователем в окне настроек эксперта.
Каждой стратегии
ставится в соответствие действительное значение, совпадающее с порядковым номером
стратегии в списке. Например, стратегии S_1 с
названием АА соответствует значение 1, стратегии S_2 с
названием ВВ соответствует значение 2 и т.д. Указанные значения не зависят от
названий стратегий. Например, пользователь может переименовать стратегию
S_1, а именно, изменить АА на QWE.
При этом значение, соответствующее стратегии, останется неизменным, равным 1 и в
том и в другом случае, а в списке названий на шкале стратегий будет отображаться
QWE. При первом включении приложения
AutoGraf 4 устанавливается стратегия с названием
Fo, которой соответствует значение 0.
Значение, соответствующее выбранной стратегии, передаётся из приложения
AutoGraf 4 в функцию автоматической торговли
AG_AT() через элемент массива Instrument [0][0][0][0].
Например, если пользователь выбрал на шкале стратегий название
BB, то значение Instrument [0][0][0][0] будет равным
2.0. Если в дальнейшем пользователь выберет другую стратегию, то значением
элемента массива Instrument [0][0][0][0] будет то, которое соответствует
порядковому номеру стратегии в списке (в окне настроек эксперта и на шкале).
Массив Instrument [][][][], внешние переменные
Обычно при разработке стратегии подбираются оптимальные значения настроечных
параметров, что позволяет повысить эффективность стратегии без изменения её
алгоритма. Технология тестера стратегий клиентского терминала MetaTrader
4 предусматривает возможность численно задать диапазон и шаг изменения
оптимизируемых параметров - внешних переменных, доступных пользователю в окне
настроек эксперта. Для этой цели в приложении
AutoGraf 4 имеется 32 внешних переменных АТ_1 - АТ_32,
которые пользователь может изменить по своему усмотрению. Значения этих
переменных в приложении AutoGraf 4 не обрабатываются,
а передаются в функцию автоматической торговли AG_AT()
через элементы массива Instrument [0][0][1][0] - Instrument [0][0][32][0].
Пример кода функции автоматической торговли
AG_AT(), содержащей несколько стратегий.
В представленном примере используются импортируемые функции,
содержащиеся в файлах AG_Lib.ex4
и AG_Trade_Criterion.ex4.
Файл AG_Lib.ex4
содержит функции, обслуживающие исполнение функции автоматической
торговли AG_AT(). В общем случае использование этих функций не является
обязательным, но настоятельно рекомендуется.
Функция AG_Magic_Number() используется для вычисления
MagicNumber. В приложении AutoGraf 4 принято правило, в соответствии с
которым каждому ордеру может быть присвоено только уникальное значение
MagicNumber. Это необходимо для успешной идентификации ордеров при переоткрытии
и частичном закрытии.
Функция AG_Message() используется для записи текстов сообщений в массив
Message[].
Функция AG_Set_Instr() используется для записи параметров устанавливаемых
инструментов в массив Manager[][].
Функция AG_Delete_Instr() используется для записи удаляемых инструментов в
массив Manager[][].
Файл
AG_Trade_Criterion.ex4
содержит пользовательские функции AG_Trade_Criterion_1() и AG_Trade_Criterion_2(),
применяемые для определения критериев открытия, закрытия и модификации ордеров.
Решение об использовании этих функций полностью зависит программиста. В случае,
если торговые критерии определяются непосредственно в коде функции
AG_AT(), то от использования этих функций можно
отказаться.
Описание входных и выходных переменных функции
AG_AT(), а также блок 2-3 подробно описаны в разделе:
Входные и выходные параметры функции AG_AT( )
В общем случае любая стратегия может быть реализована
в виде отдельной функции, в том числе, может быть включена в
исполняемый файл и вызываться из AG_AT().
В данном случае рассматривается простой вариант - коды стратегий
указаны непосредственно в коде функции автоматической торговли
AG_AT(). В представленном примере функция
AG_AT() содержит три стратегии.
| |
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
// AG_AT.mq4 Пример 16 (несколько стратегий)
// Пользовательская функция Автоматической Торговли.
// Используется при построении функции автоматической торговли для приложения AutoGraf 4
// Сергей Ковалёв, Днепропетровск, sk@autograf.dp.ua, ICQ 64015987, http://autograf.dp.ua
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж 0 жж
#property library
#import "AG_Lib.ex4"
int AG_Magic_Number(); // Вычисление MN
int AG_Message(string& Message[], string _Text);// Запись сообщений в массив Message[]
// Запись управляющих воздействий ф-ии АТ в массив Manager[][]:
int AG_Set_Instr(double& Manager[][], int ii, double v1, double v2, double v3,
double v4, double v5, double v6, int io , int ih);
int AG_Delete_Instr(double&Manager[][], int ii, int io,int ih);//Удаление инструментов
#import "AG_Trade_Criterion.ex4"
int AG_Trade_Criterion_1(); // Ф-ия определен. торгов. критериев 1
int AG_Trade_Criterion_2(); // Ф-ия определен. торгов. критериев 2
#import
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж 1 жж
int AG_AT(int Parol_AT, double Order[][], string Object[], double Instrument[][][][],
int Ddraw_Object[][], double& Tuning[], double& Manager[][], string& Message[])
{
//================================================================================== 2 ==
if (!IsDemo()) // Для демо без ограничений
{
if(Parol_AT != AccountNumber() + 1) // Если введен неправильный пароль
{ // Пример сообщения (макс. 62 симв)
AG_Message(Message, "Разработчик J.Smith, http://company.com "); // Сообщение
AG_Message(Message, "Введен неправильный пароль для функции АТ.");// Сообщение
return(0); // Выход из функции AT
} // AutoGraf автоматически отключит АТ
}
//================================================================================== 3 ==
int MN; // MagicNumber рекомендуется вычислять в ф-ии AG_Magic_Number()
static int Ticket; // Номер ордера
string Comm = "AG_AT"; // Комментарий (рекомендуется "AG_AT")
//- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
double Lot= NormalizeDouble(Tuning[1],2); // Значение лотов
int Per = NormalizeDouble(Tuning[2],0); // Значение % (целое)
int Slip = NormalizeDouble(Tuning[3],0); // Проскальзывание (пунктов)
int SL = NormalizeDouble(Tuning[4],0); // StopLoss (пунктов)
int TP = NormalizeDouble(Tuning[5],0); // TakeProfit (пунктов)
int Ds = NormalizeDouble(Tuning[6],0); // Дистанция (пунктов)
int St = NormalizeDouble(Tuning[7],0); // Шаг модификации (пунктов)
//================================================================================== 4 ==
double AT[33]; // Массив для внешних переменных
bool New_Parametr = false; // Обновления параметров пока не было
for (int i=0; i<=32; i++) // Поищем обновлённый параметр
{ // Если какой-то параметр обновлён..
if(NormalizeDouble(AT[i], 8) != NormalizeDouble(Instrument[0][0][i][0],8))
{
New_Parametr = true; // .. запоминаем этот факт..
for (i=0; i<=32; i++) // .. то присвоим новые значения всем
AT[i] = Instrument[0][0][i][0]; // Для удобства пользования
break; // .. и выходим из цикла перебора
}
}
//================================================================================== 5 ==
int Strategy = NormalizeDouble(AT[0],0);
switch(Strategy)
{
//================================================================================== 6 ==
case 1: // Srtategy 1
if (New_Parametr == true) // Если есть новое значен. параметра
{
AG_Message(Message,"Strategy № 1.");// Cообщение
Slip = 1; // Новое значение проскальзывания
SL = 100; // Новое значение StopLoss
TP = 25; // Новое значение TakeProfit
Lot = 0.1; // Если колич. лотов Lot больше нуля, ..
Per = 0; // .. то значение % в AutoGraf не ..
// .. принимается во внимание и будет ..
// .. пересчитано независимо от значения Per
Tuning[1] = Lot; // Значение лотов
Tuning[2] = Per; // Значение % (целое)
Tuning[3] = Slip; // Проскальзывание (пунктов)
Tuning[4] = SL; // StopLoss (пунктов)
Tuning[5] = TP; // TakeProfit (пунктов)
return(1); // После того, как управл. из AG_AT будет ..
} // .. возвращено в AutoGraf, в окне AG_ind..
// .. можно наблюдать новые знач. настроек.
//---------------------------------------------------------------------------------- 7 --
int Crit = AG_Trade_Criterion_1(); // Вызов функции вычисл. торговых критериев
if (OrdersTotal()==0 && Crit == 10) // Откр. орд. нет + есть критерий откр. Buy
{
AG_Message(Message, "АТ: сработал критерий открытия Buy.");//Сообщение.
MN = AG_Magic_Number(); // Вычисление MagicNumber (рекомендуется)
// Открытие ордера Buy:
OrderSend(Symbol(),OP_BUY, Lot, Ask, 2, Bid-SL*Point, Bid+TP*Point,Comm,MN);
}
if (OrdersTotal()==0 && Crit == 20) // Открытых орд. нет + есть крит. откр. Sell
{
AG_Message(Message, "АТ: сработал критерий открытия Sell.");//Сообщение
MN = AG_Magic_Number(); // Вычисление MagicNumber (рекомендуется)
// Открытие ордера Sell:
OrderSend(Symbol(),OP_SELL, Lot, Bid, 2, Ask+SL*Point, Ask-TP*Point,Comm,MN);
}
break; // End Srtategy 1
//================================================================================== 8 ==
case 2: // Srtategy 2
if (New_Parametr == true) // Если есть новое значен. параметра
{
AG_Message(Message,"Strategy № 2.");// Cообщение
Lot = 0.0; // 0.0 означает, что колич лотов ..
Per = 7; // .. высчитывается в AutoGraf на основе %
Slip = 1;
SL = 98;
TP = 55;
Ds = 20;
St = 3;
Tuning[1] = Lot; // Значение лотов
Tuning[2] = Per; // Значение % (целое)
Tuning[3] = Slip; // Проскальзывание (пунктов)
Tuning[4] = SL; // StopLoss (пунктов)
Tuning[5] = TP; // TakeProfit (пунктов)
Tuning[6] = Ds; // Дистанция (пунктов)
Tuning[7] = St; // Шаг модификации (пунктов)
return(1); // Выход после перенастроек параметров
}
//---------------------------------------------------------------------------------- 9 --
Crit = AG_Trade_Criterion_1(); // Вызов функции вычисл торговых критериев
if (Order[0][0]==0 && Crit == 10) // Открытых ордеров нет +сработал крит Buy
{
AG_Message(Message, "АТ: сработал критерий открытия Buy.");// Сообщение
MN = AG_Magic_Number(); // Вычисление MagicNumber (рекомендуется)
// Открытие ордера Buy:
Ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,2,Bid-SL*Point,Bid+TP*Point,Comm,MN);
return(1); // Открылись и отдаём управл для учёта орд
}
if (Order[0][0]==0 && Crit == 20) // Открытых орд нет+сработал крит откр Sell
{
AG_Message(Message, "АТ: сработал критерий открытия Sell.");// Сообщение
MN = AG_Magic_Number(); // Вычисление MagicNumber (рекомендуется)
// Открытие ордера Sell
Ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,2,Ask+SL*Point,Ask-TP*Point,Comm,MN);
return(1); // Открылись и отдаём управл для учёта орд
}
//--------------------------------------------------------------------------------- 10 --
// Если тип Buy и крит. откр. Buy значим
// .. и ордер только что установлен
if (NormalizeDouble(Order[1][6],0) == 0 && Crit == 10 && Ticket > 0)
{ // Инстр. Стоп_0_Buy на ордер не установлен
if( NormalizeDouble(Instrument[1][1][4][0],0)==0.0 )
{ // Устанавливаем Инстр 4 Стоп_0_Buy на ордер
AG_Set_Instr(Manager, 4, 15, Order[1][1]+20*Point, 0, 5, 0, 0, Ticket, 1);
AG_Message(Message, "На StopLoss Buy " + Ticket+ " "); // Сообщение
AG_Message(Message, "устанавливается инструмент Стоп_0_Buy.");// Сообщение
Ticket = 0; // Простой техн. приём
}
}
// Если тип Sell и критерий откр.Sell значим
// .. и ордер только что установлен
if (NormalizeDouble(Order[1][6],0) == 1 && Crit == 20 && Ticket > 0)
{ // Инстр. Стоп_0_Sell на ордер не установлен
if( NormalizeDouble(Instrument[1][1][5][0],0)==0.0 )
{ // Устанавливаем Инстр 5 Стоп_0_Sell на орд
AG_Set_Instr(Manager, 5, 15, Order[1][1]-20*Point, 0, 5, 0, 0, Ticket, 1);
AG_Message(Message, "На StopLoss Sell " + Ticket+ " "); //Сообщение
AG_Message(Message, "устанавливается инструмент Стоп_0_Sell.");//Сообщение
Ticket = 0; // Простой техн. приём
}
}
break; // End Srtategy 2
//================================================================================= 11 ==
case 3: // Srtategy 3
if (New_Parametr == true) // Если есть новое значен. параметра
{
AG_Message(Message,"Strategy № 3.");// Cообщение
Lot = 0.0; // 0.0 означает, что колич лотов ..
Per = 12; // .. высчитывается в AutoGraf на основе %
Slip = 1;
SL = 75;
TP = 45;
Ds = 25;
St = 3;
Tuning[1] = Lot; // Значение лотов
Tuning[2] = Per; // Значение % (целое)
Tuning[3] = Slip; // Проскальзывание (пунктов)
Tuning[4] = SL; // StopLoss (пунктов)
Tuning[5] = TP; // TakeProfit (пунктов)
Tuning[6] = Ds; // Дистанция (пунктов)
Tuning[7] = St; // Шаг модификации (пунктов)
return(1); // Выход после перенастроек параметров
}
//--------------------------------------------------------------------------------- 12 --
Crit = AG_Trade_Criterion_1(); // Вызов функции вычисл торговых критериев
if (Order[0][0]==0 && Crit == 10) // Открытых ордеров нет +сработал крит Buy
{
AG_Message(Message, "АТ: сработал критерий открытия Buy.");// Сообщение
MN = AG_Magic_Number(); // Вычисление MagicNumber (рекомендуется)
// Открытие ордера Buy:
Ticket=OrderSend(Symbol(),OP_BUY,Lot,Ask,2,Bid-SL*Point,Bid+TP*Point,Comm,MN);
return(1); // Открылись и отдаём управл для учёта орд
}
if (Order[0][0]==0 && Crit == 20) // Открытых орд нет+сработал крит откр Sell
{
AG_Message(Message, "АТ: сработал критерий открытия Sell.");// Сообщение
MN = AG_Magic_Number(); // Вычисление MagicNumber (рекомендуется)
// Открытие ордера Sell
Ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,2,Ask+SL*Point,Ask-TP*Point,Comm,MN);
return(1); // Открылись и отдаём управл для учёта орд
}
//--------------------------------------------------------------------------------- 13 --
// Пример использования инструмента 17
// Если тип орд. Buy и крит. откр.Buy значим
if (NormalizeDouble(Order[1][6],0) == 0 && Crit == 10 && Ticket > 0)
{ // Если инстр. 17 на ордер не установлен
if( NormalizeDouble(Instrument[1][1][17][0],0)==0.0 )
{ // Устанавливаем Инстр. 17 Торговый_разворот
AG_Set_Instr(Manager,17,10,Order[1][1]+20*Point,50,20,0,Lot*0.7,Ticket,1);
AG_Message(Message, "На Order Buy " + Ticket+ " ");
AG_Message(Message, "устанавливается инструмент Торговый_разворот.");
Ticket = 0; // Простой технический приём
}
}
// ................................................................................ 14 ..
// Если тип орд.Sell и крит.откр.Sell значим
if (NormalizeDouble(Order[1][6],0) == 1 && Crit == 20 && Ticket > 0)
{ // Если инстр. 17 на ордер не установлен
if( NormalizeDouble(Instrument[1][1][17][0],0)==0.0 )
{ // Устанавливаем Инстр. 17 Торговый_разворот
AG_Set_Instr(Manager,17,10,Order[1][1]-20*Point,50,20,0,Lot*0.7,Ticket,1);
AG_Message(Message, "На Order Sell " + Ticket+ " ");
AG_Message(Message, "устанавливается инструмент Торговый_разворот.");
Ticket = 0; // Простой технический приём
}
}
//--------------------------------------------------------------------------------- 15 --
// Пример использования инструмента 20
// Если тип орд. Buy и крит. откр.Buy значим
if (NormalizeDouble(Order[1][6],0) == 0 && Crit == 10 && Ticket > 0)
{ // Если инстр. 20 на ордер не установлен
if( NormalizeDouble(Instrument[1][2][20][0],0)==0.0 )
{ // Устанавливаем Инстр. 20 Стоп_Переворот
AG_Set_Instr(Manager,20,10,Order[1][1]-20*Point,49,25,0,Lot*0.7,Ticket,1);
Ticket = 0; // Простой технич. приём .
}
}
// ................................................................................ 16 ..
// Если тип орд Sell и крит откр.Sell значим
if (NormalizeDouble(Order[1][6],0) == 1 && Crit == 20 && Ticket > 0)
{ // Если инстр. 20 на ордер не установлен
if( NormalizeDouble(Instrument[1][2][20][0],0)==0.0 )
{ // Устанавливаем Инстр. 20 Стоп_Переворот
AG_Set_Instr(Manager,20,10,Order[1][1]+20*Point,49,25,0,Lot*0.7,Ticket,1);
Ticket = 0; // Простой техн. приём
}
}
break; // End Srtategy 3
//================================================================================= 17 ==
default: // No Srtategy
AG_Message(Message,"Strategy № "+ DoubleToStr(AT[0],0)+" не запрограммирована.");
return(0); // Функция АТ будет отключена в AutoGraf 4
//================================================================================= 18 ==
} // switch(Strategy)
return(1);
}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж Конец модуля жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж 19 жж
|
|
В блоке 3-4 инициализированы некоторые переменные. Для удобства
пользования значения настроечных параметров присвоены простым переменным с
интуитивно понятными названиями (см.
Массив Tuning []).
В блоке 4-5 открыт массив внешних переменных АТ[].
Текущие значения настроечных параметров внешних переменных передаются в функцию
AG_AT() через массив Instrument [][][][]. В блоке 4-5
вычисляется факт изменения настроечных параметров пользователем. Для этого
сравниваются значения переменных массивов АТ[i] и
Instrument [0][0][i][0].
Если хотя бы одно из значений не совпадает, то значения массива АТ[]
обновляются и в дальнейших вычислениях используются последние известные значения
настроечных параметров.
Основной код, реализующий торговые стратегии, указан в блоках
5-19. Переключение управления для исполнения той или иной стратегии выполняется
в операторе swtch() в зависимости от значения
переменной Strategy. Значение этой переменной прямо зависит от выбора
пользователем названия стратегии на шкале. Например, если пользователь выбрал на
шкале значение АА, то это вызовет следующую цепь событий:
1. Приложение AutoGraf 4 передаст в функцию
автоматической торговли AG_AT() массив Instrument
[][][][], в котором значение Instrument [0][0][0][0] будет равно 1.0.
2. При исполнении функции AG_AT() в блоке 5-6 будет
вычислено новое значение переменной Strategy, равное 1.
3. В операторе swtch() управление будет передано в
соответствии со значением Strategy на метку case1
(блок 6-8).
Если пользователь выберет на шкале стратегий другое название, то управление в
операторе swtch() будет передано в блок,
соответствующий выбранной стратегии. В случае, если пользователем выбрана
незапрограммированная стратегия, управление передаётся в блок 17-18 и функция
AG_AT() возвращает в приложение
AutoGraf 4 значение 0 (поэтому будет отключена в
AutoGraf 4).
Данный пример функции автоматической торговли AG_AT()
включает всего три стратегии, указанные соответственно в блоках 6-8, 8-11 и
11-17. Обратите внимание, стратегии представлены лишь для примера составления
кода функции AG_AT(), использовать их в реальной
работе настоятельно не рекомендуется.
Блок 6-8, стратегия 1. Стратегия 1 составлена на основе Примера 0,
представленного в разделе
Тестирование стратегий. В блоке 6-7
определяются новые общие настроечные параметры (см.
Массив Tuning []). В блоке 7-8
указан код самой стратегии 1. После выполнения блока операторов 7-8 управление
передаётся в блок 18-19 и функция AG_AT() заканчивает
работу.
Блок 8-11,
стратегия 2. Стратегия 2 составлена на основе
Примера 6 (код функции AG_AT() для управления инструментами 4 и 5).
Управление в блок 8 передаётся, если пользователь выбрал на шкале стратегию 2. В
блоке 8-9 определяются новые общие настроечные параметры (см.
Массив Tuning []). В блоке 9-10
вычисляются торговые критерии и открываются ордера. В блоке 10-11 на ордера
устанавливаются инструменты Стоп_0_Buy и Стоп_0_Sell.
После исполнения этих блоков управление передаётся в блок 18-19 и функция AG_AT() заканчивает
работу.
Блок 11-17,
стратегия 3. Стратегия 3 составлена на основе
Примера 13 (код функции AG_AT() для управления инструментами 17 и 20).
Управление в блок 11 передаётся, если пользователь выбрал на шкале стратегию 3. В
блоке 11-12 определяются новые общие настроечные параметры (см.
Массив Tuning []). В блоке
12-13
вычисляются торговые критерии и открываются ордера. В блоках 13-15
устанавливаются инструменты Торговый_разворот на ордера Buy
(блок 13-14) и Sell (блок 14-15). В блоках 15-17 на
ордера устанавливаются инструменты Стоп_Переворот.
После исполнения этих блоков управление передаётся в блок 18-19 и функция AG_AT() заканчивает
работу.
В общем случае
та или иная пользовательская стратегия может содержать и другие специальные
условия управления ордерами. Например, стратегия может содержать блок закрытия
всех ордеров, алгоритм установки графических объектов, использовать данные
индикаторов, а также выполнять любые другие вычисления в соответствии с
правилами языка MQL 4.
|