//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
// AG_AT.mq4                                             Пример 2 (инструменты 1,2,14)
// Пользовательская функция Автоматической Торговли.
// Используется при построении функции автоматической торговли для приложения 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    = 55;       
      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 ==
   int TT = TimeCurrent();                   // Текущее время
   int TH = TimeHour(TT);                    // Текущий час
   int TM = TimeMinute(TT);                  // Текущая минута
   int Crit = AG_Trade_Criterion_1();        // Вызов функции вычисления торг. критериев
   int Ord = NormalizeDouble(Order[0][0],0); // Количество ордеров под AutoGraf

   if (Ord==0 && Crit == 10 &&               // Открытых орд. нет + сработал критерий Buy
       (TH<17 || (TH==17 && TM<10) )     )   // Открываемся до 17:10
      {
      AG_Message(Message, "АТ: сработал критерий открытия Buy.");// Сообщение(макс 62сим)
      MN = AG_Magic_Number();                // Вычисление MagicNumber (рекомендуется)
                                             // Открытие ордера Buy
      OrderSend( Symbol(), OP_BUY, Lot, Ask, 2, Bid-SL*Point, Bid+TP*Point, Comm, MN); 
      return(1);                             // Открылись и отдаём управл. в AG для учёта
      }
   if (Ord==0 && Crit == 20 &&               // Открытых орд. нет +сработал критерий Sell
       (TH<17 || (TH==17 && TM<10) )     )   // Открываемся до 17:10
      {
      AG_Message(Message, "АТ: сработал критерий открытия Sell.");//Сообщение(макс 62сим)
      MN = AG_Magic_Number();                // Вычисление MagicNumber (рекомендуется)
                                             // Открытие ордера Sell
      OrderSend( Symbol(), OP_SELL, Lot, Bid, 2, Ask+SL*Point, Ask-TP*Point, Comm, MN);
      return(1);                             // Открылись и отдаём управл. в AG для учёта
      }
//---------------------------------------------------------------------------------- 7 --
                                             // Если в окне есть 1 ордер и тип ордера Buy 
   if (NormalizeDouble(Order[0][0],0)==1.0 && NormalizeDouble(Order[1][6],0)==0.0)
      {                                                                 
      Ticket = NormalizeDouble(Order[1][4],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, 23, 0, 66, 3, 0, 0, Ticket, 2);// Установка Инструм. 1
         // 1  = индекс инструмента
         // 23 = индекс бара
         // 0  = параметр отсутствует
         // 66 = дистанция преследования
         // 3  = шаг модификации
         // 0  = параметр отсутствует
         // 0  = параметр отсутствует
         // Ticket  = номер ордера
         // 2  = индекс ордерной линии (SL=2)
         AG_Message(Message, "На StopLoss Buy " + Ticket+ " ");// Сообщение(макс 62сим)
         AG_Message(Message, "устанавливается инструмент Подтяжка_Вверх.");//Сообщение
         }
      }
                                             // Если в окне есть 1 ордер и его тип Sell
   if (NormalizeDouble(Order[0][0],0)==1.0 && NormalizeDouble(Order[1][6],0)==1.0)
      {
      Ticket = NormalizeDouble(Order[1][4],0);// Номер ордера
                                             // Инстр-а Подтяжка_Вниз на StopLoss нет
      if( NormalizeDouble(Instrument[1][2][2][0],0)==0.0 )
         {
         AG_Set_Instr(Manager, 2, 23, 0, 66, 3, 0, 0, Ticket, 2);// Установка Инструм. 2
         AG_Message(Message, "На StopLoss Sell " + Ticket+ " ");// Сообщение(макс 62сим)
         AG_Message(Message, "устанавливается инструмент Подтяжка_Вниз.");// Сообщение
         }
      }      
   if( NormalizeDouble(Instrument[0][2][32][0],0) == 0.0 &&// Инструмента Закрыть_Всё нет
      // 0  = жёстко заданный индекс для инстр.14
      // 2  = жёстко заданный индекс для инстр.14
      // 32 = жёстко заданный индекс для инстр.14
      // 0  = признак установки инструмента
      // 0.0= инструмент не установлен (1.0 = установлен)
       (TH<13 || (TH==13 && TM<05) ))        // Устанавливаем инстр Закрыть_Всё до 13:05
      {
      int Tm =  StrToTime("21:20");          // Абсолютное время исполнения инстр.= 21:20
      AG_Set_Instr(Manager, 14, Tm, 30, 0, 0, 0, 0, 0, 0);// Устанавливаем Инструмент 14
      // 14 = индекс инструмента
      // Tm = абсолютное время исполнения инструмента
      // 30 = % от высоты экрана
      // 0  = параметр отсутствует
      }
//---------------------------------------------------------------------------------- 8 --
   Tm =  StrToTime("18:40");                 // Абсолютное время 18:40
   if( NormalizeDouble(Instrument[0][2][32][0],0) == 1.0 &&// Инструмент 14 установлен и
       Ord == 0 && TT > Tm)                  // Если нет ордеров и время больше 18:40
      { 
      AG_Delete_Instr(Manager, 14, 0, 0);    // Удаляем Инстр.14 Закрыть_Всё
      AG_Message(Message, "АТ: Удаляем инструмент Закрыть_Всё.");// Сообщение(макс 62сим)
      }
//================================================================================== 9 ==
   return(1);
   }
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж Конец модуля жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж 10 жж

