//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
// AG_AT.mq4                                             Пример 13 (инструменты 17,20)
// Пользовательская функция Автоматической Торговли.
// Используется при построении функции автоматической торговли для приложения 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    = 50;       
      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 ==
                              // Пример использования инструмента 17
                              // Если тип ордера Buy и критерий откр.Buy значим  
   if (NormalizeDouble(Order[1][6],0) == 0 && Crit == 10 && Ticket > 0) 
      {
                              // Если инстр. 17 Торговый_разворот на ордер не установлен
      if( NormalizeDouble(Instrument[1][1][17][0],0)==0.0 )
         // 1  = индекс ордера
         // 1  = индекс ордерной линии (Order)
         // 17 = индекс инструмента
         // 0  = признак установки инструмента
         // 0.0= инструмент не установлен (1.0 = установлен)
         {
                              // Устанавливаем Инструмент 17
         AG_Set_Instr(Manager,17,10,Order[1][1]+20*Point,50,20,0,Lot*0.7,Ticket,1); 
         // 17 = индекс инструмента
         // 10 = индекс бара
         // Order[1][1]+20*Point  = Цена исполнения Инструмента
         // 50 = StopLoss в отрываемом ордере Sell
         // 20 = TakeProfit в отрываемом ордере Sell
         // 0  = параметр отсутствует
         // Lot*0.7 = количество лотов в отрываемом ордере Sell
         // Ticket  = номер ордера
         // 1  = индекс ордерной линии (Or=1)
         AG_Message(Message, "На Order Buy " + Ticket+ " ");// Сообщение(макс 62сим)
         AG_Message(Message, "устанавливается инструмент Торговый_разворот.");//Сообщение
         Ticket = 0;    // Простой технический приём (чтоб не ставить инстр. многократно)
         }
      }
//---------------------------------------------------------------------------------- 8 --
                              // Если тип ордера Sell и критерий откр.Sell значим  
   if (NormalizeDouble(Order[1][6],0) == 1 && Crit == 20 && Ticket > 0)
      {
                              // Если инстр. 17 Трговый_разворот на ордер не установлен
      if( NormalizeDouble(Instrument[1][1][17][0],0)==0.0 )             
         {
                              // Устанавливаем Инструмент 17
         AG_Set_Instr(Manager,17,10,Order[1][1]-20*Point,50,20,0,Lot*0.7,Ticket,1); 
         AG_Message(Message, "На Order Sell " + Ticket+ " ");// Сообщение(макс 62сим)
         AG_Message(Message, "устанавливается инструмент Торговый_разворот.");//Сообщение
         Ticket = 0;    // Простой технический приём (чтоб не ставить инстр. многократно)
         }
      }      
//================================================================================== 9 ==
/*
                              // Пример использования инструмента 20 (снять комментарии 
                              // с этого блока и закомментировать блок 7-9)
                              // Если тип ордера Buy и критерий откр.Buy значим  
   if (NormalizeDouble(Order[1][6],0) == 0 && Crit == 10 && Ticket > 0)
      {
                              // Если инстр. 20 Стоп_Переворот на ордер не установлен
      if( NormalizeDouble(Instrument[1][2][20][0],0)==0.0 )
         {
                              // Устанавливаем Инструмент 20
         AG_Set_Instr(Manager,20,10,Order[1][1]-20*Point,49,25,0,Lot*0.7,Ticket,1);
         Ticket = 0;          // Простой технич. приём (чтоб не ставить инстр. многократно)
         }
      }
//--------------------------------------------------------------------------------- 10 --
   // Если тип ордера Sell и критерий откр.Sell значим  
   if (NormalizeDouble(Order[1][6],0) == 1 && Crit == 20 && Ticket > 0) 
      {
                              // Если инстр. 20 Стоп_Переворот на ордер не установлен
      if( NormalizeDouble(Instrument[1][2][20][0],0)==0.0 )
         {
                              // Устанавливаем Инструмент 20
         AG_Set_Instr(Manager,20,10,Order[1][1]+20*Point,49,25,0,Lot*0.7,Ticket,1);
         Ticket = 0;          // Простой техн. приём (чтоб не ставить инстр. многократно)
         }
      }      
*/ 
//================================================================================= 11 ==
   return(1);           // Нормальный выход
// return(0);           // Функция АТ будет закрыта в приложении AutoGraf 4
   }
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж Конец модуля жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж 12 жж