|
Пример 9 (код функции AG_AT()
для управления инструментом 12).
В
примере рассматривается программный код функции
AG_AT() для управления инструментом:
-Тянуть объект (12).
В представленном примере используются импортируемые функции,
содержащиеся в файле AG_Lib.ex4
Файл AG_Lib.ex4
содержит функции, обслуживающие исполнение функции автоматической
торговли AG_AT(). В общем случае использование этих функций не является
обязательным, но настоятельно рекомендуется.
Функция AG_Message() используется для записи текстов сообщений в массив
Message[].
Функция AG_Set_Instr() используется для записи параметров устанавливаемых
инструментов в массив Manager[][].
Функция AG_Delete_Instr() используется для записи удаляемых инструментов в
массив Manager[][].
Пример кода пользовательской функции автоматической
торговли AG_AT().
| |
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
// AG_AT.mq4 Пример 9 (инструмент 12)
// Пользовательская функция Автоматической Торговли.
// Используется при построении функции автоматической торговли для приложения 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
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж 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; // Счётчик
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 --
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;
//---------------------------------------------------------------------------------- 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 Channal = false; // Объекта заданного типа нет
bool Manage_12 = false; // Объект заданного типа не назначен под управление инстр12
int Obj_Total_AG = StrToInteger(Object[0]);// Колич. объектов, рассматриваемых AG 4
for(int k=1; k<=Obj_Total_AG; k++) // Пройдёмся по рассматриваемым объектам
{ // (для практич. использов. требуется более полный анализ)
string His_Name = Object[k]; // Имя текущего объекта
if (ObjectType(His_Name) == OBJ_STDDEVCHANNEL)// (можно также OBJ_REGRESSION)
{
// По массиву объектов, управляемых инструментом 12
for(int i=1; i<=Ddraw_Object[0][0]; i++)
{
if(k == Ddraw_Object[i][0])// Если объект уже назначен под управл. инстр. 12
{
Manage_12 = true; // Факт, что этот объект уже под управлением инстр 12
break; // Объект найден, дальше искать нет необходимости
}
}
Channal = true; // Факт, что объект такого типа уже имеется в окне
break; // Выходим из цикла перебора объектов (выносим индекс k)
}
}
//================================================================================== 7 ==
if (Channal == false) // Если объекта заданного типа нет
{
string My_Chan_Name = "Channel_for_AT"; // Имя создаваемого канала
ObjectCreate (My_Chan_Name, OBJ_STDDEVCHANNEL,0,0,0); // Создаём его..
int Сoor_X2 = Time[0]; // 1я точка СЛЕВА, 2я СПРАВА
int Сoor_X1 = Сoor_X2 - 24*60*60; // Канал длиной сутки
// Канал для практич. использов. расчиывать через бары
ObjectSet(My_Chan_Name, OBJPROP_TIME1, Сoor_X1); // Устанавливаем координаты
ObjectSet(My_Chan_Name, OBJPROP_TIME2, Сoor_X2); // Устанавливаем координаты
ObjectSet(My_Chan_Name, OBJPROP_COLOR, Orange); // Устанавливаем координаты
AG_Message(Message, "АТ: Устанавливаем объект OBJ_STDDEVCHANNEL.");// Сообщение
return(1); // Это необходимо, чтоб установл. канал был учтён AG 4
}
if (Manage_12 == false) // Объект есть, но не назначен под управление инстр 12
{
// Устанавливаем Инстр. 12 Тянуть объект на канал
AG_Set_Instr(Manager, 12, 0, 0, 0, 0, 0, 0, k, 0);
AG_Message(Message, "АТ: Устанавливаем инструмент Тянуть объект.");// Сообщение
}
//================================================================================== 8 ==
return(1);
}
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж Конец модуля жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж 9 жж
|
|
Описание входных и выходных переменных функции
AG_AT(), а также блок 2-3 подробно описаны в разделе:
Входные и выходные параметры функции AG_AT( )
В блоке 3-6 указаны новые значение настроечных параметров
приложения AutoGraf 4. Подробно об этом здесь:
Основной код, реализующий торговую стратегию, указан в блоках
6-9.
В данном примере рассматривается установка инструмента 12 Тянуть
объект на канал стандартных отклонений. Для установки полевого инструмента
Тянуть объект наличие ордеров в окне финансового инструмента не требуется. Для
правильного понимания представленного кода необходимо знать какие данные
содержатся в массивах Object[] и Ddraw_Object[][].
Кратко напомним, что массив Object[] содержит перечень названий объектов,
рассматриваемых приложением AutoGraf 4, а массив
Ddraw_Object[][] содержит сведения об объектах, на
которые установлен инструмент 12 Тянуть объект.
Массивы Object[] и
Ddraw_Object[][].
Блок 6-7. В рассматриваемом примере
полагается, что использоваться будет только один канал и на этом канале должен
быть установлен инструмент Тянуть объект.
В начале вычислений в этом блоке полагается, что канал не
установлен и инструмент на канале тоже не установлен. Для того, чтобы выяснить
так ли это в действительности, выполняется необходимый анализ. Общее количество
объектов, рассматриваемых приложением AutoGraf 4,
содержится в элементе массива Object[0]. В цикле по количеству объектов
выполняется перебор учитываемых объектов. Если объекта имеет тип канала
стандартных отклонений, то это значит, что интересующий нас объект уже
установлен на ценовом графике и устанавливать его не нужно.
Для каждого найденного объекта заданного типа необходимо выяснить
установлен ли на этом объекте инструмент Тянуть объект. Для этого во внутреннем
цикле анализируются данные массива Ddraw_Object[][].
Значение элемента массива Ddraw_Object[0][0] содержит
общее количество объектов, на которые уже установлен инструмент Тянуть объект. В
цикле перебираются все объекты, учтённые в массиве Ddraw_Object[][],
от первого до последнего.
В процессе вычислений во внутреннем цикле доступно для анализа
значение переменной k. Это - учётный индекс объекта
(канала стандартных отклонений) в массиве Object[]. Анализ, выполняемый во
внутреннем цикле, сводится к поиску ответа на простой вопрос: имеется ли в
массиве Ddraw_Object[][] запись, свидетельствующая о
том, что на этот объект уже установлен инструмент Тянуть объект. Для ответа на
этот вопрос нужно выполнить простое вычисление - сравнить значение индекса
k и значение элемента массива Ddraw_Object[i][0],
где i - индекс текущей строки во внутреннем цикле
перебора.
Обратите внимание, индекс k может не
совпадать с индексом i. Это очень просто понять: в
массиве Object[] учитываются все объекты, которые вообще умеет распознавать
приложение AutoGraf 4, - не только каналы, но и линии,
веер и др. Интересующий нас канал может быть учтён в этом общем списке,
например, под номером 17 (k=17). Если этот канал
является единственным каналом, на котором установлен инструмент Тянуть объект,
то в массиве Ddraw_Object[][] этот канал будет учтён в
первой же строке (i=1).
При программировании стратегий важно также принять во внимание принципиальное
правило технологии AutoGraf 4 - перед вызовом
пользовательской функции AG_AT() все массивы
упорядочиваются. В момент вызова на исполнение функции AG_AT()
ни один из массивов не содержит пустых строк. Это значит, что если в процессе
работы с объектами пользователь какие-то объекты удалил или какие-то установил,
то индексы массивов Object[] и Ddraw_Object[][] могут
измениться. Поэтому, учитывая объекты в функции AG_AT()
ни в коем случае нельзя связывать вычисления с какими бы то ни было конкретными
численными значениями индексов, а искомые индексы необходимо вычислять при
каждом исполнении функции AG_AT().
Результатом вычислений в блоке 6-7 являются значения переменных Manage_12 и
Channal, поставленные в соответствие фактам наличия искомого объекта и установки
на этот объект инструмента Тянуть объект.
Блок 7-8. В зависимости от значений переменных Manage_12 и Channal в этом
блоке могут быть установлены объект заданного типа и инструмент Тянуть объект.
Если значение переменной Manage_12 свидетельствует об отсутствии объекта
заданного типа, то устанавливается объект в соответствии с параметрами согласно
стратегии пользователя.
После установки любого объекта, а именно до того, как на этот объект будет
установлен инструмент Тянуть объект, необходимо вернуть управление приложению
AutoGraf 4 для упорядочивания массивов. Если этого не
сделать, то невозможно правильно установить инструмент, т.к. индексы массивов
Object[] и Ddraw_Object[][] ещё не изменены (т.е.
вновь установленный объект ещё не учтён). После упорядочивания массивов
приложение AutoGraf 4 снова вызовет на исполнение
функцию AG_AT(). И только на этом этапе на канал можно
устанавливать инструмент Тянуть объект. В общем случае возвращать управление в
приложение AutoGraf 4 следует всякий раз при установке
любых объектов и ордеров, а именно до выполнения любых других действий,
связанных с ордерами, объектами и инструментами.
При последующем исполнении функции AG_AT()
установленный объект будет правильно учтён в массивах Object[] и Ddraw_Object[][].
Это значит, что возможно исполнять часть программного кода, реализующую
установку инструмента Тянуть объект. Если в блоке 6-7 вычислено, что инструмент
ещё не установлен, то вызывается для исполнения функция AG_Set_Instr(). Среди
параметров этой функции указывается индекс k,
однозначно определяющий на какой именно объект устанавливается инструмент Тянуть
объект.
Блок 8-9. После того, как исполнение функции AG_AT()
закончится, управление будет возвращено в приложение AutoGraf
4. На основании данных, записанных в массив Manager[][], будут установлены и
удалены
указанные инструменты. Для правильного понимания соответствия значений параметров
инструментов и индексов, используемых в массиве Manager[][], следует обратиться
к описанию параметров инструментов в массивах Instrument [][][][] и Manager[][]:
Приложение AutoGraf 4 анализирует
значение, возвращаемое функцией AG_AT(). В обычном
режиме (как и в данном случае) функция возвращает значение 1. Это значение
воспринимается приложением как указание на продолжение работы, т.е. на каждой
следующей итерации (большого цикла) снова будет вызвана для исполнения
пользовательская функция AG_AT().
Если же функция AG_AT() возвращает
значение 0, то это является указанием для приложения AutoGraf
4 отключить автоматический режим исполнения (управляющий значок
AT будет переведен вниз).
Это значит, что функция AG_AT() больше не будет
вызываться для исполнения приложением AutoGraf 4 до
тех пор, пока пользователь не установит автоматический режим (значок
АТ вверх).
|
|