//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
// AG_AT.mq4                                             Пример 1 (инструменты 1,2,6,7)
// Пользовательская функция Автоматической Торговли.
// Используется при построении функции автоматической торговли для приложения 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 ==
   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    = 25;       
      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 ==
   int Crit = AG_Trade_Criterion_1(); // Вызов функции вычисления торговых критериев
   if (OrdersTotal()==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);              // Открылись и отдаём управление AG для учёта ордеров
      }
   if (OrdersTotal()==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);              // Открылись и отдаём управление AG для учёта ордеров
      }
//---------------------------------------------------------------------------------- 7 --
                              // Пример использования инструментов 1 и 2
                              // Если тип ордера Buy и критерий откр.Buy значим  
   if (NormalizeDouble(Order[1][6],0) == 0 && Crit == 10 && Ticket > 0) 
      {                       // .. и ордер только что установлен
                              // Если инстр. Подтяжка_Вверх на StopLoss не установлен
      if( NormalizeDouble(Instrument[1][2][1][0],0)==0.0 )
         // 1  = индекс ордера
         // 2  = индекс ордерной линии (SL)
         // 1  = индекс инструмента Подтяжка_Вверх
         // 0  = признак установки инструмента
         // 0.0= инструмент не установлен (1.0 = установлен)
         {
         AG_Set_Instr(Manager, 1, 15, 0, 78, 3, 0, 0, Ticket, 2);// Устанавливаем Инстр.1
         // 1  = индекс инструмента
         // 15 = индекс бара
         // 0  = параметр отсутствует
         // 78 = дистанция преследования
         // 3  = шаг модификации
         // 0  = параметр отсутствует
         // 0  = параметр отсутствует
         // Ticket  = номер ордера
         // 2  = индекс ордерной линии (SL=2)
         AG_Message(Message, "На StopLoss Buy " + Ticket+ " ");// Сообщение(макс.62 симв)
         AG_Message(Message, "устанавливается инструмент Подтяжка_Вверх.");// Сообщение
                              // Устанавливаем Инструмент 6 на тот же SL
         AG_Set_Instr(Manager, 6, 18, Order[1][2]+ 50*Point, 0, 0, 0, 0, Ticket, 2);
         // 6  = индекс инструмента
         // 18 = индекс бара (ну, понравился нам 18, а можно на любом, в т.ч. и -5 и -25)
         // Order[1][2]+ 50*Point  = на 50 пунктов выше заявленной цены StopLoss. 
         //                   Когда SL достигнет цели, инстр 1 и 6 авт. удаляются.
         // 0  = параметр отсутствует
         // 0  = параметр отсутствует
         // 0  = параметр отсутствует
         // 0  = параметр отсутствует
         // Ticket  = номер ордера
         // 2  = индекс ордерной линии (SL=2)
         Ticket = 0;    // Простой технический приём (чтоб не ставить инстр. многократно)
         }
      }
        // Если тип ордера Sell и критерий откр.Sell значим и ордер только что установлен
   if (NormalizeDouble(Order[1][6],0) == 1 && Crit == 20 && Ticket > 0) 
      {  
                        // Если Инстр. Подтяжка_Вниз на StopLoss не установлен
      if( NormalizeDouble(Instrument[1][2][2][0],0)==0.0 )
         {
         AG_Set_Instr(Manager, 2, 13, 0, 84, 3, 0, 0, Ticket, 2);// Устанавливаем Инстр 2
         AG_Message(Message, "На StopLoss Sell " + Ticket+ " ");//Сообщение(макс.62 симв)
         AG_Message(Message, "устанавливается инструмент Подтяжка_Вниз.");// Сообщение 
                        // Устанавливаем Инструмент 7 на тот же SL
         AG_Set_Instr(Manager, 7, 18, Order[1][2]- 50*Point, 0, 0, 0, 0, Ticket, 2);
         Ticket = 0;    // Простой технический приём (чтоб не ставить инстр. многократно)
         }
      }      
//---------------------------------------------------------------------------------- 8 --
   int TT = TimeCurrent();                // Текущее время
   int Tm_Cls = StrToTime("23:10");       // Абсолютное время удаления инструмента

   if (TT >= Tm_Cls)                      // Если сработало условие удаления инструмента
      {
      bool Sell = false;                  // Пока считаем, что ордеров Sell в окне нет
      int My_Ord = NormalizeDouble(Order[0][0],0); // Количество ордеров в нашем окне
      for (int i=1; i<=My_Ord; i++)                // По списку ордеров
         {
         if (NormalizeDouble(Order[i][6],0) == 1.0)// Попался ордер Sell
            Sell = true;
            break;                                 // Выносим индекс ордера i
         }
                                     // Если Sell есть и инстр.2 на StopLoss установлен:
      if(Sell == true && NormalizeDouble(Instrument[i][2][2][0],0)==1.0)
         // i  = индекс ордера
         // 2  = индекс ордерной линии (SL)
         // 2  = индекс инструмента Подтяжка_Вниз
         // 0  = признак установки инструмента
         // 1.0= инструмент установлен (0.0 = не установлен)
         {
         Ticket = Order[i][4];
         AG_Delete_Instr(Manager, 2, Ticket, 2);//Удаляем Инстр.2 со StopLoss ордера Sell
         // 2  = индекс инструмента             Для всех ордерных инструментов аналогично
         // Ticket  = номер ордера              При удалении инструментов 1,2,3,9,10 и 11  
         // 2  = индекс ордерной линии (SL=2)   автомат удаляются сопряжённые инстр 6 и 7
         AG_Message(Message, "Удаление инструмента Подтяжка_Вниз ");// Сообщение
         AG_Message(Message, "со StopLoss ордера Sell "+Ticket+".");// Сообщение
         Ticket = 0;    // Простой технический приём (чтоб не ставить инстр. многократно)
         }
      }
//================================================================================== 9 ==
   return(1);
   }
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж Конец модуля жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж 10 жж

