//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
// AG_AT.mq4                                          Пример 15 (инструменты 23,14)
// Пользовательская функция Автоматической Торговли.
// Используется при построении функции автоматической торговли для приложения AutoGraf 4
// Сергей Ковалёв, Днепропетровск, sk@autograf.dp.ua, ICQ 64015987, http://autograf.dp.ua
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж
// Это не реализация торговой стратегии. Это технический пример управления.. 
// ..инструментами для построения собственной торговой системы.
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж 0 жж
#property library   
 
#import "AG_Lib.ex4"
   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;                           // Счётчик 
   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;        
/*
      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 ==
   bool BLim = false;                           // Считаем, что ордеров BuyLimit нет
   bool SLim = false;                           // Считаем, что ордеров SellLimit нет
   int My_Ord = NormalizeDouble(Order[0][0],0); // Количество ордеров в нашем окне
   for (int i=1; i<=My_Ord; i++)                // По списку ордеров
      {
      if (NormalizeDouble(Order[i][6],0) == 2.0)// Попался ордер BuyLimit
         BLim = true;
      if (NormalizeDouble(Order[i][6],0) == 3.0)// Попался ордер SellLimit
         SLim = true;
      }

   bool Plan_BLim = false;                      // Считаем, что План.орд BuyLimit нет
   bool Plan_SLim = false;                      // Считаем, что План.орд SellLimit нет
   int Plan_Ord = NormalizeDouble(Instrument[0][1][0][0],0);// Количество инстр. в окне
   for (int p=1; p<=Plan_Ord; p++)              // По списку ордеров
      {
                                                // Если План.ордер BuyLimit уже есть
      if (NormalizeDouble(Instrument[0][1][p][5],0) == 2.0)
         Plan_BLim = true;
                                                // Если План.ордер SellLimit уже есть
      if (NormalizeDouble(Instrument[0][1][p][5],0) == 3.0)
         Plan_SLim = true;
      }
//================================================================================== 7 ==
   int TT = TimeCurrent();          // Текущее время
   int Tm1 =  StrToTime("15:15");   // Хотим установить Планируемый_Ордер в период ..
   int Tm2 =  StrToTime("16:00");   // .. от 15:15 до 16:00
   int Tm  =  StrToTime("18:30");   // Абсолютное время исполн инстр 23 Планируемый_Ордер
   int Tm_Cls = StrToTime("23:59"); // Абсолютное время исполнения инстр 14 Закрыть_Всё
//================================================================================== 8 ==
   // Устанавка инструментов План_Ордер в заданный период при отсутствии в окне ордеров
   if (TT > Tm1 && TT < Tm2 && NormalizeDouble(Order[0][0],0) == 0.0)
      {
      // Если BuyLimit нет и Планируемый_Ордер BuyLimit ещё не установлен 
      if( BLim == false && Plan_BLim == false )
         {
         double Price = Ask - 25*Point;// Цена исполнения инструмента 
                                    // Устанавливаем Инструмент 23 Планируемый_Ордер
         AG_Set_Instr(Manager, 23, Tm, Price, 50, 20, 2, Lot*0.5, 0, 0);
         // 23 = индекс инструмента
         // Tm = абсолютное время исполнения инструмента
         // Price = цена исполнения инструмента (ордер будет открыт по этой цене, либо
         //                                      по ближайшей возможной, если цена уйдёт)
         // 50 = StopLoss в отрываемом ордере (пунктов)
         // 20 = TakeProfit в отрываемом ордере (пунктов)
         // 2  = тип ордера BuyLimit
         // Lot*0.5 = количество лотов в отрываемом ордере 
         // 0  = параметр отсутствует
         // 0  = параметр отсутствует
         }
//---------------------------------------------------------------------------------- 9 --
      // Если BuyLimit нет и Планируемый_Ордер BuyLimit ещё не установлен 
      if( SLim == false && Plan_SLim == false )                         
         {
         Price = Bid + 25*Point;    // Цена исполнения инструмента
                                    // Устанавливаем Инструмент 23 Планируемый_Ордер
         AG_Set_Instr(Manager, 23, Tm, Price, 50, 20, 3, Lot*0.5, 0, 0);
         }
                                    // Если инструмент Закрыть_Всё ещё не установлен 
//--------------------------------------------------------------------------------- 10 --
      if( NormalizeDouble(Instrument[0][2][32][0],0) == 0.0 )
         // 0  = жёстко заданный индекс для инстр.14
         // 2  = жёстко заданный индекс для инстр.14
         // 32 = жёстко заданный индекс для инстр.14
         // 0  = признак установки инструмента
         // 0.0= инструмент не установлен (1.0 = установлен)
                                    // Устанавливаем Инструмент 14 Закрыть_Всё
         AG_Set_Instr(Manager, 14, Tm_Cls, 30, 0, 0, 0, 0, 0, 0);
         // 14 = индекс инструмента
         // Tm_Cls = абсолютное время исполнения инструмента
         // 30 = % от высоты экрана
         // 0  = параметр отсутствует 
      }
//================================================================================= 11 ==
   if (NormalizeDouble(Order[0][0],0)>0.0)
      {
      for (p=1; p<=Plan_Ord; p++) // По списку ордеров
         {
                                  // Если Планируемый ордер BuyLimit установлен
         if (NormalizeDouble(Instrument[0][1][p][5],0) == 2.0)
            {
            AG_Delete_Instr(Manager, 23, p, 0);// Удаляем Инстр.23 Планируемый_Ордер
            AG_Message(Message, "АТ: Удаляем Планируемый_Ордер BuyLimit.");// Сообщение
            }
         if (NormalizeDouble(Instrument[0][1][p][5],0) == 3.0)
            {
            AG_Delete_Instr(Manager, 23, p, 0);// Удаляем Инстр.23 Планируемый_Ордер
            AG_Message(Message, "АТ: Удаляем Планируемый_Ордер SellLimit.");// Сообщение
            }
         }
      }
//================================================================================= 12 ==
   return(1);           // Нормальный выход
// return(0);           // Функция АТ будет закрыта в приложении AutoGraf 4
   }
//жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж Конец модуля жжжжжжжжжжжжжжжжжжжжжжжжжжжжжжж 13 жж

