|
Пример 15 (код функции AG_AT()
для управления инструментами 23 и 14).
В
примере рассматривается программный код функции
AG_AT() для управления инструментом:
- Планируемый ордер (23),
- Закрыть всё (14).
В представленном примере используются импортируемые функции,
содержащиеся в файлах AG_Lib.ex4
.
Файл AG_Lib.ex4
содержит функции, обслуживающие исполнение функции автоматической
торговли AG_AT(). В общем случае использование этих функций не является
обязательным, но настоятельно рекомендуется. В данном примере используются
функции:
Функция AG_Message() используется для записи текстов сообщений в массив
Message[].
Функция AG_Set_Instr() используется для записи параметров устанавливаемых
инструментов в массив Manager[][].
Функция AG_Delete_Instr() используется для записи удаляемых инструментов в
массив Manager[][].
Пример кода пользовательской функции автоматической
торговли AG_AT().
| |
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
// AG_AT.mq4 Пример 15 (инструменты 23,14)
// Пользовательская функция Автоматической Торговли.
// Используется при построении функции автоматической торговли для приложения AutoGraf 4
// Сергей Ковалёв, Днепропетровск, sk@autograf.dp.ua, ICQ 64015987, http://autograf.dp.ua
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
// Это не реализация торговой стратегии. Это технический пример управления..
// ..инструментами для построения собственной торговой системы.
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж 0 жж
#property library
#import "AG_Lib.ex4"
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
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж 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 ==
static int Count = 0; // Счётчик
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 --
if (Count==0) // Это можно делать один раз в начале
{ // Пример сообщения (максимум 62 симв):
AG_Message(Message, "Разработчик J.Smith, http://company.com");
Count++; // Количество посещений этого блока
Lot = 0.0; // 0.0 означает, что колич лотов высчитывается в AutoGraf
Per = 7; // .. на основе значения % (здесь 7%) суммы баланса
Slip = 1;
SL = 100;
TP = 75;
Ds = 20;
St = 3;
/*
Lot = 2.5; // Если количество лотов Lot (Tuning[1]) больше нуля, ..
Per = 0; // .. то значение % (Tuning[2]) в приложении AutoGraf ..
Per = 12; // .. не принимается во внимание и будет пересчитано ..
// .. независимо от значения переменной Per (Tuning[2]).
Lot = 0.0; // Если количество лотов Lot (Tuning[1]) в приложении ..
Per = 7; // .. AutoGraf требуется вычислять на основе ..
// .. заданного значения % (Tuning[2]),..
// .. то значение Lot (Tuning[1]) необходимо обнулить.
*/
//---------------------------------------------------------------------------------- 5 --
Tuning[1] = Lot; // Значение лотов
Tuning[2] = Per; // Значение % (целое)
Tuning[3] = Slip; // Проскальзывание (пунктов)
Tuning[4] = SL; // StopLoss (пунктов)
Tuning[5] = TP; // TakeProfit (пунктов)
Tuning[6] = Ds; // Дистанция (пунктов)
Tuning[7] = St; // Шаг модификации (пунктов)
AG_Message(Message,"Изменение настроек из АТ.");// Пример сообщения (макс.62 симв.)
return(1); // Выход после перенастроек параметров
}
// После того, как управление из AG_AT будет возвращено..
// .. в приложение AutoGraf, в окне индикатора AG_ind..
// .. можно наблюдать новые значения настроек.
//================================================================================== 6 ==
bool BLim = false; // Считаем, что ордеров BuyLimit нет
bool SLim = false; // Считаем, что ордеров SellLimit нет
int My_Ord = NormalizeDouble(Order[0][0],0); // Количество ордеров в нашем окне
for (int i=1; i<=My_Ord; i++) // По списку ордеров
{
if (NormalizeDouble(Order[i][6],0) == 2.0)// Попался ордер BuyLimit
BLim = true;
if (NormalizeDouble(Order[i][6],0) == 3.0)// Попался ордер SellLimit
SLim = true;
}
bool Plan_BLim = false; // Считаем, что План.орд BuyLimit нет
bool Plan_SLim = false; // Считаем, что План.орд SellLimit нет
int Plan_Ord = NormalizeDouble(Instrument[0][1][0][0],0);// Количество инстр. в окне
for (int p=1; p<=Plan_Ord; p++) // По списку ордеров
{
// Если План.ордер BuyLimit уже есть
if (NormalizeDouble(Instrument[0][1][p][5],0) == 2.0)
Plan_BLim = true;
// Если План.ордер SellLimit уже есть
if (NormalizeDouble(Instrument[0][1][p][5],0) == 3.0)
Plan_SLim = true;
}
//================================================================================== 7 ==
int TT = TimeCurrent(); // Текущее время
int Tm1 = StrToTime("15:15"); // Хотим установить Планируемый_Ордер в период ..
int Tm2 = StrToTime("16:00"); // .. от 15:15 до 16:00
int Tm = StrToTime("18:30"); // Абсолютное время исполн инстр 23 Планируемый_Ордер
int Tm_Cls = StrToTime("23:59"); // Абсолютное время исполнения инстр 14 Закрыть_Всё
//================================================================================== 8 ==
// Устанавка инструментов План_Ордер в заданный период при отсутствии в окне ордеров
if (TT > Tm1 && TT < Tm2 && NormalizeDouble(Order[0][0],0) == 0.0)
{
// Если BuyLimit нет и Планируемый_Ордер BuyLimit ещё не установлен
if( BLim == false && Plan_BLim == false )
{
double Price = Ask - 25*Point;// Цена исполнения инструмента
// Устанавливаем Инструмент 23 Планируемый_Ордер
AG_Set_Instr(Manager, 23, Tm, Price, 50, 20, 2, Lot*0.5, 0, 0);
// 23 = индекс инструмента
// Tm = абсолютное время исполнения инструмента
// Price = цена исполнения инструмента (ордер будет открыт по этой цене, либо
// по ближайшей возможной, если цена уйдёт)
// 50 = StopLoss в отрываемом ордере (пунктов)
// 20 = TakeProfit в отрываемом ордере (пунктов)
// 2 = тип ордера BuyLimit
// Lot*0.5 = количество лотов в отрываемом ордере
// 0 = параметр отсутствует
// 0 = параметр отсутствует
}
//---------------------------------------------------------------------------------- 9 --
// Если BuyLimit нет и Планируемый_Ордер BuyLimit ещё не установлен
if( SLim == false && Plan_SLim == false )
{
Price = Bid + 25*Point; // Цена исполнения инструмента
// Устанавливаем Инструмент 23 Планируемый_Ордер
AG_Set_Instr(Manager, 23, Tm, Price, 50, 20, 3, Lot*0.5, 0, 0);
}
// Если инструмент Закрыть_Всё ещё не установлен
//--------------------------------------------------------------------------------- 10 --
if( NormalizeDouble(Instrument[0][2][32][0],0) == 0.0 )
// 0 = жёстко заданный индекс для инстр.14
// 2 = жёстко заданный индекс для инстр.14
// 32 = жёстко заданный индекс для инстр.14
// 0 = признак установки инструмента
// 0.0= инструмент не установлен (1.0 = установлен)
// Устанавливаем Инструмент 14 Закрыть_Всё
AG_Set_Instr(Manager, 14, Tm_Cls, 30, 0, 0, 0, 0, 0, 0);
// 14 = индекс инструмента
// Tm_Cls = абсолютное время исполнения инструмента
// 30 = % от высоты экрана
// 0 = параметр отсутствует
}
//================================================================================= 11 ==
if (NormalizeDouble(Order[0][0],0)>0.0)
{
for (p=1; p<=Plan_Ord; p++) // По списку ордеров
{
// Если Планируемый ордер BuyLimit установлен
if (NormalizeDouble(Instrument[0][1][p][5],0) == 2.0)
{
AG_Delete_Instr(Manager, 23, p, 0);// Удаляем Инстр.23 Планируемый_Ордер
AG_Message(Message, "АТ: Удаляем Планируемый_Ордер BuyLimit.");// Сообщение
}
if (NormalizeDouble(Instrument[0][1][p][5],0) == 3.0)
{
AG_Delete_Instr(Manager, 23, p, 0);// Удаляем Инстр.23 Планируемый_Ордер
AG_Message(Message, "АТ: Удаляем Планируемый_Ордер SellLimit.");// Сообщение
}
}
}
//================================================================================= 12 ==
return(1); // Нормальный выход
// return(0); // Функция АТ будет закрыта в приложении AutoGraf 4
}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж Конец модуля жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж 13 жж
|
|
Описание входных и выходных переменных функции
AG_AT(), а также блок 2-3 подробно описаны в разделе:
Входные и выходные параметры функции AG_AT( )
В блоке 3-6 указаны новые значение настроечных параметров
приложения AutoGraf 4. Подробно об этом здесь:
Основной код, реализующий торговую стратегию, указан в блоках
6-12. Стратегия предполагает использование инструментов Планируемый ордер для
установки отложенных ордеров BuyLimit и
SellLimit. Инструменты Планируемый ордер
устанавливаются в течение заданного промежутка времени - с 15:15 до 16:00 и
только в том случае, если одноимённые отложенные ордера не установлены. Время
исполнения каждого инструмента 18:30. В конце рабочего дня (23:59) все рыночные
ордера должны быть закрыты, отложенные ордера удалены.
Блок 6-7. Чтобы принять решение об установке инструментов
Планируемый ордер, необходимо выяснить состав ордеров по финансовому
инструменту, в окне которого исполняется приложение AutoGraf
4, а также определить установлены ли на текущий момент инструменты
Планируемый ордер.
Для выявления отложенных ордеров BuyLimit
и SellLimit выполняется анализ всех ордеров.
Для этого в цикле по количеству ордеров проверяется тип каждого открытого
ордера. Общее количество ордеров определяется по значению элемента массива
Order[0][0]. Тип ордера определяется по значению элемента массива Order
[i][6]. i - это индекс ордера в общем списке ордеров массива Order[][]. 6 - индекс массива, определяющий тип ордера
(в соответствии с типами ордеров, принятыми в MQL
4) .
Полевые инструменты Планируемый ордер учитываются в массиве
Instrument[0][1][][]. Для того, чтобы определить установлены ли в окне
инструменты Планируемый ордер, выполняется анализ значений элементов этого
массива. Индексы в первом и во втором измерении массива (0 и 1) неизменны.
Индексы в третьем и четвёртом измерениях определяют соответственно порядковый
номер инструмента Планируемый ордер в общем списке этих инструментов (третье
измерение) и параметр инструмента (четвёртое измерение). Общее количество
инструментов Планируемый ордер вычисляется по значению Instrument[0][1][0][0].
Параметры инструментов указаны в разделе:
Массив Instrument [][][][].
Анализ факта установки инструментов с определёнными настройками
(тип открываемого ордера) выполняется в цикле по количеству установленных
инструментов Планируемый ордер. Тип ордера, открываемого в результате исполнения
инструмента Планируемый ордер, определяется по значению Instrument[0][1][p][5].
Например, в строке:
| |
if (NormalizeDouble(Instrument[0][1][p][5],0) == 2.0)
|
|
вычисляется факт, что при исполнении этого инструмента (учтённого
с индексом p) будет открыт ордер
BuyLimit (== 2, тип ордера по правилам классификации типов ордеров,
принятых в MQL 4). А в строке:
| |
if (NormalizeDouble(Instrument[0][1][p][5],0) == 3.0)
|
|
вычисляется факт, что при исполнении этого инструмента будет
открыт ордер SellLimit (== 3).
Согласно стратегии инструменты не должны устанавливаться, если в
окне уже есть ордера BuyLimit и
SellLimit или инструменты Планируемый ордер, устанавливающие эти ордера.
Факт наличия ордеров и инструментов учитывается в значениях переменных BLim,
SLim (для ордеров) и Plan_BLim,
Plan_SLim (для инструментов).
В Блоке 7-8 согласно стратегии заданы значения времени,
при которых инструменты должны быть установлены и удалены, а также время
исполнения для всех инструментов Планируемый ордер.
Блок 8-10. Указание на установку инструментов Планируемый
ордер формируется в блоках 8-9 для инструментов, открывающих ордера
BuyLimit и 9-10 для инструментов, открывающих ордера
SellLimit. Если текущее время попадает в диапазон
времени для установки инструментов Планируемый ордер и в окне нет никаких
ордеров, то управление передаётся
на вычисление следующего условия для установки инструмента.
Блок 8-9. Если в окне нет ордеров типа
BuyLimit и не установлено ни одного инструмента Планируемый ордер для
установки ордера типа BuyLimit, то вызывается для
исполнения функция AG_Set_Instr(). Согласно данной стратегии цена исполнения
инструмента задаётся на 25п ниже Правильной цены (Ask).
При реализации стратегии для практического использования значение указанного
параметра инструмента (а также время исполнения) должно быть вычислено на
основании собственных правил стратегии.
При исполнении функции AG_Set_Instr() параметры устанавливаемого
инструмента записываются в массив Manager[][]. По окончании исполнения функции
AG_AT() этот массив будет прочитан в приложении AutoGraf 4. Если параметры
инструментов указаны без ошибок, то инструменты будут установлены. При
обнаружении ошибок приложение AutoGraf 4 выведет
сообщение пользователю о некорректных значениях параметров.
Блок 9-10. Вычисления, связанные с указаниями на установку инструмента Планируемый
ордер, устанавливающего отложенный ордер SellLimit,
аналогичны вычислениям в блоке 8-9.
Блок 10-11. Согласно стратегии в конце рабочего дня все
ордера должны быть удалены. В период, предусмотренный стратегией (с 15:15 до
16:00), инструмент Закрыть всё устанавливается при условии, что ранее инструмент
не установлен (напомним, что инструмент Закрыть всё может быть установлен на
ценовом графике только один). Факт установки инструмента Закрыть всё вычисляется
в строке:
| |
if( NormalizeDouble(Instrument[0][2][32][0],0) == 0.0 )
|
|
Здесь 0, 2 и 32 - неизменяемый индексы в первом, втором и третьем
измерениях. Индекс 0 в четвёртом измерении массива Instrument[0][2][32][0]
определяет значение параметра факта установки инструмента на ценовой график.
Если условие оказывается истинным, т.е. инструмент Закрыть всё ещё не
установлен, то вызывается на исполнение функция AG_Set_Instr().
При исполнении функции AG_Set_Instr() параметры устанавливаемого
инструмента записываются в массив Manager[][]. По окончании исполнения функции
AG_AT() этот массив будет прочитан в приложении AutoGraf 4. Если параметры
инструментов указаны без ошибок, то инструменты будут установлены. При
обнаружении ошибок приложение AutoGraf 4 выведет
сообщение пользователю о некорректных значениях параметров.
Блок 11-12. Стратегия предусматривает удаление
инструментов Планируемый ордер, настроенных на установку ордеров BuyLimit и
SellLimit, если в окне финансового инструмента открыт хотя бы один ордер любого
типа. Для вычисления факта наличия в окне ордеров используется простое
вычисление:
| |
if (NormalizeDouble(Order[0][0],0)>0.0)
|
|
Здесь анализируется значение элемента массива Order[0][0], и если
оно оказывается больше нуля, то выполняется поиск инструментов Планируемый
ордер, настроенных на установку ордеров искомого типа.
Вычисления выполняются в цикле подобно тому, как это сделано в
блоке 6-7. Анализируется значение параметра, соответствующее типу ордера. Если
текущий анализируемый инструмент Планируемый ордер настроен на открытие ордера
типов BuyLimit или SellLimit, то вызывается на исполнение функция
AG_Set_Instr(). При исполнении функции AG_Set_Instr() параметры удаляемого
инструмента записываются в массив Manager[][].
Блок 12-13. После того, как исполнение функции
AG_AT() закончится, управление будет возвращено в
приложение AutoGraf 4. На основании данных, записанных
в массив Manager[][], будут установлены и удалены указанные инструменты. Для
правильного понимания соответствия значений параметров инструментов и индексов,
используемых в массиве Manager[][], следует обратиться к описанию параметров
инструментов в массивах Instrument [][][][] и Manager[][]:
При исполнении инструмента Закрыть всё в приложении
AutoGraf 4вызывается на исполнение функция Закрыть всё. При исполнении
этой функции никакие другие
инструменты не исполняются. После того, как все ордера будут закрыты, функция
Закрыть всё отключается и восстанавливается режим автоматической торговли.
Приложение AutoGraf 4 анализирует
значение, возвращаемое функцией AG_AT(). В обычном
режиме (как и в данном случае) функция возвращает значение 1. Это значение
воспринимается приложением как указание на продолжение работы, т.е. на каждой
следующей итерации (большого цикла) снова будет вызвана для исполнения
пользовательская функция AG_AT().
Если же функция AG_AT() возвращает
значение 0, то это является указанием для приложения AutoGraf
4 отключить автоматический режим исполнения (управляющий значок
AT будет переведен вниз).
Это значит, что функция AG_AT() больше не будет
вызываться для исполнения приложением AutoGraf 4 до
тех пор, пока пользователь не установит автоматический режим (значок
АТ вверх).
|
|