Проект
AutoGraf 4

Краткая характеристика

Пуск и настройка
Сервисные функции
Управление ордерами
Инструменты
Настроечные параметры
Тестирование стратегий

История поддержки

Продукты
Распространение
Брокеры-партнёры
Для трейдеров
Ссылки
Форум

Пример 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 до тех пор, пока пользователь не установит автоматический режим (значок АТ вверх).

 

 

Copyright © SK 2006 - 2011