//+------------------------------------------------------------------+
//|                                          A_TargertBreakout 1.mq4 |
//|                        Copyright 2013, MetaQuotes Software Corp. |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net"



extern string Logic = "--- Logic parameters ";



extern bool   UseMM = TRUE;
extern double BalanceStep = 50.0;
extern double LotsStep = 0.01;
extern double Lot = 0.01;
//extern bool   UseMartingale = true; // Увеличивать лот после проигрыша?
//extern double LotsFactor    = 2;     // Во сколько раз увеличить лот
//extern int    ProfitFactor  = 90;    //
//extern int    LossFactor    = 130;   //

extern int    TakeProfit = 50;
extern int    StopLoss = 20;
extern int    slip = 4;


extern string    _____= "Параметры ТРЕЙЛИНГ СТОП";
extern bool   UseTrail = FALSE;//Выключатель трейлинг стопа
// параметры без убытка
extern int    LevelProfit = 10;
extern int    LevelWLoss  = 1; 
// первая ступень
extern int    DistProfit = 40;    //порог включения трейлин стопа
extern int    TrailStep = 5; // шаг трейлинг стопа
// вторая ступень
extern int    LevelProfitTrail1 =100; //порог включения трейлин стопа
extern int    DistProfit1 = 100;   
extern int    TrailStep1 = 30; // шаг трейлинг стопа
// третья ступень
//--- Параметры торгового времени
extern string _TimeSet = "Настройка торгового времени";
extern bool   UseTradingTime = FALSE;
extern int    TimeStart = 10;             // Время начала работы советника
extern int    TimeEnd = 22;               // Время окончания работы советника
extern int    TimeStartMonday = 0;        // Время начало торговли в понидельник 
extern int    TimeEndFriday = 24;         // Время после которого не торгуем в пятницу

extern int    maxOrders =1;
extern int    DistBUY =0; 
extern int    DistSELL =0;
extern bool   CorSpred =TRUE;
extern bool   UseBarsHiLow = FALSE;
extern int    BarsHiLow = 8;
extern int    magic = 4123321;
extern string Comments		=	"Target Breakout";
extern int    CountBars    = 30;
extern bool   UseObjectDelete = TRUE;


extern bool   ShowHUD = FALSE;
extern string First = " Target Breakout System";
extern string lbl1 = "-- Heads Up Display Variables --";
extern int    FontSize = 10;
extern color  FontColor = White;
extern color  FontColor2 = Yellow;
extern bool   ShowPredictions = TRUE;



int tdelet,ticket; //тип удаляемого ордера
double prices,priceb,tp,sl,slippage,Lots;
//+-------------------------------
//+-------------------------------
double Tick;
double Tickvalue;
double Spread;
double StopLevel;
double FreezeLevel;
double MinLot;
double MaxLot;
double LotStep;
double fPoint;
double FPoint;
double fDigits;
int LotDigits;


double cSpread;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int gi_204 = -1;
double gd_208 = -1.0;
double gd_unused_216 = -1.0;
double gd_224 = -1.0;
double gd_unused_232 = -1.0;
double gd_unused_240 = -1.0;
double g_ibuf_248[];
double gd_252 = 2.0;
int gi_260 = 4;
double g_ibuf_264[];
double g_ibuf_268[];
int g_highest_272 = 0;
int g_lowest_276 = 0;
double gd_280 = 0.0;
double gd_288 = 0.0;
int gi_unused_296 = 0;
int gi_unused_300 = 0;
int gi_304 = 0;
int gi_308 = 0;
double g_ibuf_312[];
double g_ibuf_316[];
double g_ibuf_320[];
int gi_324 = -1;
int gi_328 = -1;
int gi_332 = -1;
int g_time_336 = -1;
bool gi_unused_340 = TRUE;
double gd_344;
bool gi_352 = TRUE;
int g_bars_356 = -1;
double gd_360;
int gi_unused_368 = -1;
int g_time_372 = 0;
bool gi_376 = FALSE;
int gi_380 = -1;
int gi_384 = -1;
int g_time_388 = -1;
int g_time_392 = -1;
double g_bid_396 = -1.0;
double g_bid_404 = -1.0;
double gd_412;
int gi_420 = -1;
int gi_424 = -1;
int g_bars_428 = -1;
double gda_432[5000];
double gda_436[5000];
double gda_440[5000];
double gda_444[5000];
double gda_448[5000];
double gda_452[5000];
double gda_456[5];
double gd_460 = 0.0;
double gda_468[5000];
double gda_472[5000];
int gi_476 = 0;
int gi_unused_480 = 0;
int gi_484 = 0;
int g_bars_488 = 0;
int g_bars_492 = -1;
















double f0_2(double ad_0, string a_symbol_8 = "") {
   if (a_symbol_8 == "") a_symbol_8 = Symbol();
   double l_lotstep_16 = MarketInfo(a_symbol_8, MODE_LOTSTEP);
   double l_minlot_24 = MarketInfo(a_symbol_8, MODE_MINLOT);
   double ld_32 = MathRound(ad_0 / l_lotstep_16) * l_lotstep_16;
   if (ld_32 < l_minlot_24) ld_32 = l_minlot_24;
   return (MathMin(ld_32, MarketInfo(a_symbol_8, MODE_MAXLOT)));
}

double GetLots() {
   double ld_ret_0 = Lot;
   int li_8 = AccountBalance() / BalanceStep;
   if (UseMM && li_8 > 0) {
      ld_ret_0 = MathMax(LotsStep * li_8, Lot);
      ld_ret_0 = f0_2(MathMin(ld_ret_0, MaxLot));
   }
   return (ld_ret_0);
}









//+------------------------------------------------------------------+
//| ФУГНКЦТИЯ ТРЕЙЛИНГ СТОПА И ПЕРЕНОСА В БЕЗУБЫТОК                  |
//+------------------------------------------------------------------+


void Trail()          
  {
           int j;
             for(j=0; j<OrdersTotal(); j++)
               {  
                  if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES)==false) break; 
                  if (OrderMagicNumber() == magic) {
        
                 // if (OrderSymbol() != Symbol() && AllSymbols == false) continue;
                                                                               
                  if(OrderType() == OP_BUY) // если ордер сэлл
                     
                 {        if (LevelProfitTrail1 !=0&&OrderStopLoss()>=OrderOpenPrice()+LevelProfitTrail1*FPoint&& ND(OrderStopLoss()+DistProfit1*FPoint+Spread+StopLevel) <=ND(MarketInfo(OrderSymbol(),MODE_BID)))
                         {
                          OrderModify(OrderTicket(),OrderOpenPrice(),ND(OrderStopLoss()+TrailStep*FPoint + Spread),OrderTakeProfit(),0,CLR_NONE);
                          continue;  
                         }  
                 
                 
                         if (DistProfit !=0&&OrderStopLoss()>OrderOpenPrice()&&ND(OrderStopLoss()+DistProfit*FPoint+StopLevel+Spread) <=ND(MarketInfo(OrderSymbol(),MODE_BID)))
                         {
                          OrderModify(OrderTicket(),OrderOpenPrice(),ND(OrderStopLoss()+TrailStep*FPoint+Spread) ,OrderTakeProfit(),0,CLR_NONE);
                          continue;  
                         }  
       
                       if (DistProfit !=0&&OrderStopLoss()<OrderOpenPrice()&&ND(MarketInfo(OrderSymbol(),MODE_BID))>= ND(OrderOpenPrice()+DistProfit*FPoint+Spread+StopLevel) )
                         {
                          OrderModify(OrderTicket(),OrderOpenPrice(),ND(OrderOpenPrice()+TrailStep*FPoint+Spread) ,OrderTakeProfit(),0,CLR_NONE);
                          continue;  
                           }
                          
                          if (LevelProfit!=0&&OrderStopLoss()<OrderOpenPrice()&&ND(MarketInfo(OrderSymbol(),MODE_BID))>= ND(OrderOpenPrice()+LevelProfit*FPoint+LevelWLoss*FPoint) )
                         {
                          OrderModify(OrderTicket(),OrderOpenPrice(),ND(OrderOpenPrice()+LevelWLoss*FPoint+Spread) ,OrderTakeProfit(),0,CLR_NONE);
                          continue;  
                          
                         }  
                  } 
                  
 //-------------------------------------------------------------------------------------------------------------------------------------------------                 
                if(OrderType() == OP_SELL) // если ордер сэлл
                     
             {         
                   if (LevelProfitTrail1 !=0  &&OrderStopLoss()<=ND(OrderOpenPrice()-LevelProfitTrail1*FPoint-Spread)&& ND(OrderStopLoss()-DistProfit1*FPoint-Spread-StopLevel) >ND(MarketInfo(OrderSymbol(),MODE_ASK)))//OrderStopLoss()< OrderOpenPrice()&&OrderStopLoss()-DistProfit>MarketInfo(OrderSymbol(),MODE_ASK)
                         { 
                          OrderModify(OrderTicket(),OrderOpenPrice(),ND(OrderStopLoss()-TrailStep1*FPoint-Spread),OrderTakeProfit(),0,CLR_NONE);
                          continue;  
                         }  
             
             
             
             
                
                   if (DistProfit !=0&&OrderStopLoss()< OrderOpenPrice()&&ND(OrderStopLoss()-DistProfit*FPoint-Spread -StopLevel)>=ND(MarketInfo(OrderSymbol(),MODE_ASK)))//OrderStopLoss()-DistProfit>MarketInfo(OrderSymbol(),MODE_ASK)
                         { 
                          OrderModify(OrderTicket(),OrderOpenPrice(),ND(OrderStopLoss()-TrailStep*FPoint-Spread) ,OrderTakeProfit(),0,CLR_NONE);
                          continue;  
                         }  
                       
                       if (DistProfit !=0&&OrderStopLoss()>OrderOpenPrice()&&ND(MarketInfo(OrderSymbol(),MODE_ASK))<=ND(OrderOpenPrice()-DistProfit*FPoint-Spread-StopLevel)) //&&MarketInfo(OrderSymbol(),MODE_ASK)<= OrderOpenPrice()-DistProfit
                         {
                          OrderModify(OrderTicket(),OrderOpenPrice(),ND(OrderOpenPrice()-TrailStep*FPoint -Spread) ,OrderTakeProfit(),0,CLR_NONE);
                          continue;  
                         }  
               
                            if (LevelProfit!=0&&OrderStopLoss()>OrderOpenPrice()&&ND(OrderOpenPrice()-LevelProfit*FPoint-LevelWLoss*FPoint)>=ND(MarketInfo(OrderSymbol(),MODE_ASK))
                            ) 
                         {
                    
                          OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-LevelWLoss*FPoint-Spread  ,OrderTakeProfit(),0,CLR_NONE);
                          continue;  
                         }  
             }     
                  
  }                
 }   

}


//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+

int init()
 {      // - 1 - == Сбор информации об условиях торговли ===========================================   
            Tick = MarketInfo(Symbol(), MODE_TICKSIZE);                            // минимальный тик 
            Tickvalue = MarketInfo(Symbol(), MODE_TICKVALUE);//миним изменения цены в валюте депозита   
           // Spread = ND(MarketInfo(Symbol(), MODE_SPREAD)*Point);                    // текущий спрэд
            StopLevel = ND(MarketInfo(Symbol(), MODE_STOPLEVEL)*Point);     // текущий уровень стопов
            FreezeLevel = ND(MarketInfo(Symbol(), MODE_FREEZELEVEL)*Point);      // уровень заморозки
            MinLot  = MarketInfo(Symbol(), MODE_MINLOT);      // минимальный разрешенный объем сделки
            MaxLot  = MarketInfo(Symbol(), MODE_MAXLOT);     // максимальный разрешенный объем сделки
            LotStep = MarketInfo(Symbol(), MODE_LOTSTEP);             // шаг приращения объема сделки
            fDigits = MarketInfo(Symbol(), MODE_DIGITS);   // Количество цифр после десятичного точки
            fPoint  = MarketInfo(Symbol(), MODE_POINT);            //Размер пункта в валюте котировки.
         // - 1 - == Окончание блока ================================================================


        // - 2 - == Вычисление =========================================== 
           if (fDigits == 5) FPoint = 10.0 * fPoint;
           if (fDigits == 4) FPoint = fPoint;
           if (fDigits < 4)  FPoint = 0.01;
    
           if (MinLot < 0.1) LotDigits =2;
           if (MinLot >=1.0) LotDigits =0;

        // - 2 - ================= Окончание блока ========================
             
             tdelet=OP_BUYSTOP;DeletOrders(tdelet);
             tdelet=OP_SELLSTOP;DeletOrders(tdelet);
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit() 
{
   ObjectsDeleteAll();
   tdelet=OP_BUYSTOP;DeletOrders(tdelet);
   tdelet=OP_SELLSTOP;DeletOrders(tdelet);
   return (0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start() 
  {   Spread = ND(MarketInfo(Symbol(), MODE_SPREAD)*Point);
       if(UseTrail)Trail();
      //if (TradeStatuse() > 0) return (0);    
      TargetBreaakout();
          
//----      
   
//----
   return(0);
  }
//+------------------------------------------------------------------+   
//+------------------------------------------------------------------+
//+--------- Функция торгового времени  -----------------------------+ 
//+------------------------------------------------------------------+
int TradeStatuse()
{
   if (!UseTradingTime) return(FALSE);
   if (Hour() < TimeStartMonday && DayOfWeek() == 1) return (4); //--- Проверка на торговое время в понидельник.
   if (Hour() >= TimeEndFriday && DayOfWeek() == 5) return (5); //--- Проверка на торговое время в пятницу.
   if (TimeEnd < TimeStart) 
      {  
      if(Hour() >= TimeEnd && Hour() < TimeStart) return (6);
      }
   else
      {
      if ((Hour() < TimeStart) || (Hour() >= TimeEnd)) return (6); //--- Проверка на торговое время.
      }
   if ((DayOfWeek() == 0) || (DayOfWeek() == 6)) return (7); //--- Выходные, некоторые брокеры как RVD торговля начинаеться в воскресение вечером
   //---
   return(0);
}  
  
  
//+------------------------------------------------------------------+

int TargetBreaakout() {
   

  int l_ind_counted_0 = IndicatorCounted();
   if (g_bars_428 != Bars) {
      if (g_bars_428 != -1) {
         if (Bars - g_bars_428 > 1) {
            Print("More than 1 bar fed to indicator -- reloading!!");
            deinit();
            l_ind_counted_0 = 0;
            gi_352 = TRUE;
            gi_376 = FALSE;
            gi_380 = -1;
            gi_384 = -1;
            g_time_388 = -1;
            g_time_392 = -1;
            g_bid_396 = -1;
            g_bid_404 = -1;
            g_bars_356 = -1;
            g_time_336 = -1;
            gi_332 = -1;
            gi_324 = -1;
            gi_328 = -1;
         }
         g_bars_428 = Bars;
      } else g_bars_428 = Bars;
   }
   if (g_time_388 != Time[0]) {
      g_time_388 = -1;
      g_bid_396 = -1;
   }
   if (g_time_392 != Time[0]) {
      g_time_392 = -1;
      g_bid_404 = -1;
   }
   if (!gi_352 && MathAbs(Bars - g_bars_356) > 1.0) {
      gi_332 = -1;
      int limit = MathMin(Bars-l_ind_counted_0,CountBars);
      for (int l_index_4 = limit; l_index_4 <= gi_304; l_index_4++) ObjectDelete("[FXI]Target Breakout Long Line #" + l_index_4);
      for (l_index_4 = limit; l_index_4 <= gi_308; l_index_4++) ObjectDelete("[FXI]Target Breakout Short Line #" + l_index_4);
      l_ind_counted_0 = 0;
 /*     ArrayInitialize(g_ibuf_316, EMPTY_VALUE);
      ArrayInitialize(g_ibuf_320, EMPTY_VALUE);
      ArrayInitialize(g_ibuf_264, EMPTY_VALUE);
      ArrayInitialize(g_ibuf_268, EMPTY_VALUE);*/
   }
   ArrowPlacement();
   int li_8 = MathMin(Bars-l_ind_counted_0,CountBars);
   if (li_8 > 0) li_8--;
   if (li_8 < 0) return (-1);
   for (l_index_4 = li_8; l_index_4 >= 0; l_index_4--) {
      if (gi_376 && l_index_4 != 0) continue;
      if (l_index_4 == 0) {
         if (gi_332 != -1) {
         if (g_time_336 == Time[l_index_4]) drawArrows(gi_332, l_index_4);
        else gi_332 = -1;
          
         }
      }
      if (l_index_4 == 0) {
         if (g_time_372 < Time[0]) {
            g_time_372 = Time[0];
            checkLP(l_index_4);
         }
      } else checkLP(l_index_4);
      doPatterns(l_index_4);
      drawLines(l_index_4);
   }
   gi_352 = FALSE;
   g_bars_356 = Bars;
   if (ShowHUD) drawHUD();
  
   return (0);
}

void drawLines(int ai_0) {

   if (gi_324 == 1) {
      g_ibuf_264[ai_0] = gd_280 + gd_360;
      if (High[ai_0] > gd_280 + gd_360) {
         gi_324 = 0;
         ObjectSet("[FXI]Target Breakout Long Line #" + gi_304, OBJPROP_COLOR, Green);
            if (ai_0 == 0) {
            //doAlerts(1, ai_0);
            gi_332 = 1;
            g_time_336 = Time[ai_0];
         }
      }
      ObjectSet("[FXI]Target Breakout Long Line #" + gi_304, OBJPROP_TIME2, Time[ai_0]);
   }
   if (gi_328 == 1) {
      g_ibuf_268[ai_0] = gd_288 - 1.0 * Point;
      if (Low[ai_0] < gd_288 - 1.0 * Point) {
         gi_328 = 0;
        // Print("произошло пробитие поддержки ");
         ObjectSet("[FXI]Target Breakout Short Line #" + gi_308, OBJPROP_COLOR, Red);
       
    if (ai_0 == 0) {
           // doAlerts(2, ai_0);
            gi_332 = 2;
            g_time_336 = Time[ai_0];
         }
      }
      ObjectSet("[FXI]Target Breakout Short Line #" + gi_308, OBJPROP_TIME2, Time[ai_0]);
   }
}







void doPatterns(int ai_0) {
   int l_datetime_4 = 0;
   int l_datetime_8 = 0;
   double priceb,prices;
   if (!(CorSpred))Spread=0;
   if (gi_332 == -1 || gi_332 == 2) {
      gi_424 = gi_260;
    if(UseBarsHiLow == FALSE){  
      if (Period() != PERIOD_W1 && Period() != PERIOD_D1 && gi_260 == 4)
         if (gi_420 == 1) gi_424 = 8;
      if (Period() == PERIOD_W1 || Period() == PERIOD_D1 && gi_260 == 1)
         if (gi_420 == 1) gi_424 = 4;}
         else gi_424 = BarsHiLow;
      g_highest_272 = iHighest(NULL, 0, MODE_HIGH, 2 * gi_424 + 1, ai_0 + 1);
      if (g_highest_272 == ai_0 + gi_424 + 1 && Time[ai_0] != gi_380) {
         gi_380 = Time[ai_0];
         gd_280 = High[g_highest_272];
         gi_unused_296 = g_highest_272;
         gi_304++;
         gi_324 = 1;
         l_datetime_4 = Time[g_highest_272];
         l_datetime_8 = Time[ai_0];
         if (l_datetime_4 > l_datetime_8) l_datetime_8 = Time[0];


         if (gd_280!=0){tdelet=OP_BUYSTOP;DeletOrders (tdelet);
         priceb = ND(gd_280 + gd_360+DistBUY*FPoint+Spread);OpenOrdersBay(priceb);}
      
         
         
         //for (int li_12 = ai_0; li_12 <= g_highest_272; li_12++) g_ibuf_264[li_12] = gd_280 + gd_360;
         ObjectCreate("[FXI]Target Breakout Long Line #" + gi_304, OBJ_TREND, 0, l_datetime_4, gd_280 + gd_360, l_datetime_8, gd_280 + gd_360);
         ObjectSet("[FXI]Target Breakout Long Line #" + gi_304, OBJPROP_RAY, FALSE);
         ObjectSet("[FXI]Target Breakout Long Line #" + gi_304, OBJPROP_COLOR,  LightGreen);
         ObjectSet("[FXI]Target Breakout Long Line #" + gi_304, OBJPROP_WIDTH, 2);
         ObjectSetText("[FXI]Target Breakout Long Line #" + gi_304, "[FXI]Target Breakout Long");
         int gi_304_1=gi_304-1;
      if(UseObjectDelete )   ObjectDelete("[FXI]Target Breakout Long Line #" + gi_304_1);
     }
   }
   if (gi_332 == -1 || gi_332 == 1) {
      gi_424 = gi_260;
   if(UseBarsHiLow == FALSE){
      if (Period() != PERIOD_W1 && Period() != PERIOD_D1 && gi_260 == 4)
         if (gi_420 == 0) gi_424 = 8;
      if (Period() == PERIOD_W1 || Period() == PERIOD_D1 && gi_260 == 1)
         if (gi_420 == 0) gi_424 = 4;}
     else   gi_424 = BarsHiLow; 
      g_lowest_276 = iLowest(NULL, 0, MODE_LOW, 2 * gi_424 + 1, ai_0 + 1);
      if (g_lowest_276 == ai_0 + gi_424 + 1 && gi_384 != Time[ai_0]) {
         gi_384 = Time[ai_0];
         gd_288 = Low[g_lowest_276];
         gi_unused_300 = g_lowest_276;
         gi_308++;
         gi_328 = 1;
         l_datetime_4 = Time[g_lowest_276];
         l_datetime_8 = Time[ai_0];
         if (l_datetime_4 < l_datetime_8) l_datetime_8 = Time[0];
         // Print("значение переменной селл",gd_288);
          

         if (gd_288!=0){tdelet=OP_SELLSTOP;DeletOrders (tdelet);
         prices = ND(gd_288 - 1.0 * Point - DistSELL*FPoint-Spread);OpenOrdersSell(prices);} 
         
         
         //for (li_12 = ai_0; li_12 <= g_lowest_276; li_12++) g_ibuf_268[li_12] = gd_288 - 1.0 * Point;
         ObjectCreate("[FXI]Target Breakout Short Line #" + gi_308, OBJ_TREND, 0, l_datetime_4, gd_288 - 1.0 * Point, l_datetime_8, gd_288 - 1.0 * Point);
         ObjectSet("[FXI]Target Breakout Short Line #" + gi_308, OBJPROP_RAY, FALSE);
         ObjectSet("[FXI]Target Breakout Short Line #" + gi_308, OBJPROP_COLOR, LightSalmon);
         ObjectSet("[FXI]Target Breakout Short Line #" + gi_308, OBJPROP_WIDTH, 2);
         ObjectSetText("[FXI]Target Breakout Short Line #" + gi_308, "[FXI]Target Breakout Long");
         int gi_308_1=gi_308-1;
     if(UseObjectDelete ) ObjectDelete("[FXI]Target Breakout Short Line #" + gi_308_1);
      }
   }
}



//+------------------------------------------------------------------+
//+----           Функция  удаления отложенных ордеров      ---------+ 
//+------------------------------------------------------------------+  
int DeletOrders (int tdelet)
{  int ordertotal = OrdersTotal();
   int t = OrderType();
   int i;
 
    if (ordertotal!=0)
  { for (i=ordertotal-1; i>=0; i--)
    { if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) 
     { if (OrderSymbol()==Symbol())
      { if ( OrderMagicNumber()==magic)
       { if (OrderType()==tdelet) OrderDelete(OrderTicket());
       }
      }
     }
    }
   } 
}   
//+------------------------------------------------------------------+
//+----           Функция  открытия ордера                  ---------+ 
//+------------------------------------------------------------------+     
int OpenOrdersBay(double priceb)
{   if (TradeStatuse() > 0) return (0); 
    int t=OrdersTotal();
    int tb=0;
    sl=StopLoss*FPoint;
    tp=TakeProfit*FPoint;
    slippage=slip*FPoint;
    Lots = GetLots();
    
    for (int i=0; i<t; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if ( OrderSymbol() == Symbol() && OrderMagicNumber() == magic&&OrderType()==OP_BUY) tb++;}}
    
    if (tb<maxOrders||tb==0 )ticket =  OrderSend(Symbol(), OP_BUYSTOP, Lots, priceb , slippage, priceb-sl-Spread,priceb+tp+Spread , Comments, magic, 0, Blue);
    
}

//+------------------------------------------------------------------+
//+----           Функция  открытия ордера                  ---------+ 
//+------------------------------------------------------------------+     
int OpenOrdersSell(double prices)
{   
    if (TradeStatuse() > 0) return (0);
    int t=OrdersTotal();
    int ts=0;
    sl =StopLoss*FPoint:;
    tp =TakeProfit*FPoint;
    slippage=slip*FPoint;
    Lots = GetLots();
   
    for (int i=0; i<t; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
    if ( OrderSymbol() == Symbol() && OrderMagicNumber() == magic&&OrderType()==OP_SELL) ts++;}}  
    if (ts<maxOrders||ts==0 )ticket =  OrderSend(Symbol(), OP_SELLSTOP, Lots, prices , slippage, prices+sl+Spread,prices-tp - Spread, Comments, magic, 0, Blue);
           
}

//+-------------------------------------------------------------------------------------+
//| Приведение значений к точности одного пункта                                        |
//+-------------------------------------------------------------------------------------+
double ND(double A)
{
   return(NormalizeDouble(A, Digits));
}  


//+-------------------------------------------------------------------------------------+
//| Приведение значений к точности одного тика                                          |
//+-------------------------------------------------------------------------------------+
/*double NP(double A)
{
   return(MathRound(A/Tick)*Tick);
}  */







double lineaPlanus_Predictor(double ad_0, double ad_8, int ai_16) {
   gi_476 = IndicatorCounted();
   if (Bars > g_bars_488 + 1) {
      gi_unused_480 = 0;
      for (int li_20 = Bars - 1; li_20 > Bars - ai_16; li_20--) {
         if (li_20 == 0) gda_452[li_20] = (ad_0 + ad_8) / 2.0;
         else gda_452[li_20] = (High[li_20] + Low[li_20]) / 2.0;
      }
   }
   g_bars_488 = Bars;
   if (gi_476 < 0) return (-1);
   if (gi_476 > 0) gi_476--;
   gi_484 = Bars - gi_476;
  // Laguerre(ad_0, ad_8, ai_16);
   return (0);
}

void drawArrows(int ai_0, int ai_4) {
   if (ai_0 == 1) {
      g_ibuf_316[ai_4] = Low[ai_4] - gd_344;
      return;
   }
   g_ibuf_320[ai_4] = High[ai_4] + gd_344;
}


void ArrowPlacement() {
   if (Period() == PERIOD_M1 || Period() == PERIOD_M5) gd_344 = 2.0 * Point;
   if (Period() == PERIOD_M15) gd_344 = 3.0 * Point;
   if (Period() == PERIOD_M30) gd_344 = 5.0 * Point;
   if (Period() == PERIOD_H1) gd_344 = 10.0 * Point;
   if (Period() == PERIOD_H4) gd_344 = 20.0 * Point;
   if (Period() == PERIOD_D1) gd_344 = 40.0 * Point;
   if (Period() == PERIOD_W1) gd_344 = 100.0 * Point;
   if (Period() == PERIOD_MN1) gd_344 = 240.0 * Point;
}
void checkLP(int ai_0) {
   if (ai_0 == 0) gi_376 = TRUE;
   if (gi_376) ai_0 = 0;
   lineaPlanus_Predictor(High[ai_0], Low[ai_0], 4);
   g_ibuf_312[ai_0] = gda_452[ai_0];
   g_ibuf_312[ai_0 + 1] = gda_452[ai_0 + 1];
   double ld_4 = MathAbs(g_ibuf_312[ai_0] - (g_ibuf_312[ai_0 + 1]));
   if (g_ibuf_312[ai_0] > g_ibuf_312[ai_0 + 1]) gi_420 = 0;
   else {
      if (g_ibuf_312[ai_0] < g_ibuf_312[ai_0 + 1]) gi_420 = 1;
      else gi_420 = -1;
   }
   if (Period() == PERIOD_D1) {
      if (Digits == 3 || Digits == 5) {
         if (ld_4 < 100.0 * Point) gi_260 = 4;
         if (ld_4 >= 100.0 * Point) gi_260 = 1;
      } else {
         if (ld_4 < 10.0 * Point) gi_260 = 4;
         if (ld_4 >= 10.0 * Point) gi_260 = 1;
      }
   } else {
      if (Period() == PERIOD_W1) {
         if (Digits == 3 || Digits == 5) {
            if (ld_4 < 100.0 * Point) gi_260 = 4;
            if (ld_4 >= 100.0 * Point) gi_260 = 1;
         } else {
            if (ld_4 < 10.0 * Point) gi_260 = 4;
            if (ld_4 >= 10.0 * Point) gi_260 = 1;
         }
      } else {
         if (Period() == PERIOD_H4) {
            if (Digits == 3 || Digits == 5) {
               if (ld_4 < 100.0 * Point) gi_260 = 8;
               if (ld_4 >= 100.0 * Point) gi_260 = 4;
            } else {
               if (ld_4 < 10.0 * Point) gi_260 = 8;
               if (ld_4 >= 10.0 * Point) gi_260 = 4;
            }
         }
      }
   }
   string ls_12 = "LP Difference -- " + ld_4 
   + "\n";
   ls_12 = StringConcatenate(ls_12, "Qualifying Bars -- " + gi_260 
   + "\n");
   ls_12 = StringConcatenate(ls_12, "Qualifying Bars -- " + gi_260 
   + "\n");
   ls_12 = StringConcatenate(ls_12, "LP Zero -- " + g_ibuf_312[ai_0] 
   + "\n");
   ls_12 = StringConcatenate(ls_12, "LP One -- " + ((g_ibuf_312[ai_0 + 1])) 
   + "\n");
}

void drawHUD() {
   int l_y_0 = 0;
   if (ObjectFind("TargetTitle1") == -1) {
      ObjectCreate("TargetTitle1", OBJ_LABEL, 0, 0, 0);
      ObjectSetText("TargetTitle1", ">> Target Breakout System <<", FontSize, "Tahoma", FontColor2);
      ObjectSet("TargetTitle1", OBJPROP_XDISTANCE, 25);
      ObjectSet("TargetTitle1", OBJPROP_YDISTANCE, 15);
      ObjectSet("TargetTitle1", OBJPROP_CORNER, 0);
      ObjectSet("TargetTitle1", OBJPROP_COLOR, FontColor2);
   }
   if (ObjectFind("TargetTitle2") == -1) {
      ObjectCreate("TargetTitle2", OBJ_LABEL, 0, 0, 0);
      ObjectSetText("TargetTitle2", Symbol()+"       "+Period(), FontSize, "Tahoma", FontColor);
      ObjectSet("TargetTitle2", OBJPROP_XDISTANCE, 5);
      ObjectSet("TargetTitle2", OBJPROP_YDISTANCE, 35);
      ObjectSet("TargetTitle2", OBJPROP_CORNER, 0);
      ObjectSet("TargetTitle2", OBJPROP_COLOR, FontColor);
   }
       cSpread = MarketInfo(Symbol(), MODE_SPREAD);    
   if (ObjectFind("TargetTitle3") == -1) {
      ObjectCreate("TargetTitle3", OBJ_LABEL, 0, 0, 0);
      ObjectSetText("TargetTitle3","Spred"+"          "+DoubleToStr(cSpread,2), FontSize, "Tahoma", FontColor);
      ObjectSet("TargetTitle3", OBJPROP_XDISTANCE, 5);
      ObjectSet("TargetTitle3", OBJPROP_YDISTANCE, 50);
      ObjectSet("TargetTitle3", OBJPROP_CORNER, 0);
      ObjectSet("TargetTitle3", OBJPROP_COLOR, FontColor);
   }

   if (ObjectFind("TargetTitle4") == -1) {
      ObjectCreate("TargetTitle4", OBJ_LABEL, 0, 0, 0);
      ObjectSetText("TargetTitle4", "Stoplevel" + "     " +DoubleToStr(StopLevel,2), FontSize, "Tahoma", FontColor);
      ObjectSet("TargetTitle4", OBJPROP_XDISTANCE, 5);
      ObjectSet("TargetTitle4", OBJPROP_YDISTANCE, 65);
      ObjectSet("TargetTitle4", OBJPROP_CORNER, 0);
      ObjectSet("TargetTitle4", OBJPROP_COLOR, FontColor);
   }  double balance=AccountBalance();
   if (ObjectFind("TargetTitle5") == -1) {
      ObjectCreate("TargetTitle5", OBJ_LABEL, 0, 0, 0);
      ObjectSetText("TargetTitle5", "Balance" + "       " +DoubleToStr(balance,2), FontSize, "Tahoma", FontColor);
      ObjectSet("TargetTitle5", OBJPROP_XDISTANCE, 5);
      ObjectSet("TargetTitle5", OBJPROP_YDISTANCE, 80);
      ObjectSet("TargetTitle5", OBJPROP_CORNER, 0);
      ObjectSet("TargetTitle5", OBJPROP_COLOR, FontColor);
   }
   if (ObjectFind("TargetTitle6") == -1) {
      ObjectCreate("TargetTitle6", OBJ_LABEL, 0, 0, 0);
      ObjectSetText("TargetTitle6", "Trade Status" + "       " , FontSize, "Tahoma", FontColor);
      ObjectSet("TargetTitle6", OBJPROP_XDISTANCE, 5);
      ObjectSet("TargetTitle6", OBJPROP_YDISTANCE, 95);
      ObjectSet("TargetTitle6", OBJPROP_CORNER, 0);
      ObjectSet("TargetTitle6", OBJPROP_COLOR, FontColor);
   }
   if (ObjectFind("TargetTitle7") == -1) {
      ObjectCreate("TargetTitle7", OBJ_LABEL, 0, 0, 0);
      ObjectSetText("TargetTitle7", "TRADE", FontSize, "Tahoma", LawnGreen);
      ObjectSet("TargetTitle7", OBJPROP_XDISTANCE, 90);
      ObjectSet("TargetTitle7", OBJPROP_YDISTANCE, 95);
      ObjectSet("TargetTitle7", OBJPROP_CORNER, 0);
      ObjectSet("TargetTitle7", OBJPROP_COLOR, LawnGreen);
   }
   
   if (ObjectFind("BKGR4") < 0) {
      ObjectCreate("BKGR4", OBJ_LABEL, 0, 0, 0);
      ObjectSetText("BKGR4", "g", 180, "Webdings", DimGray);
      ObjectSet("BKGR4", OBJPROP_CORNER, 0);
      ObjectSet("BKGR4", OBJPROP_BACK, TRUE);
      ObjectSet("BKGR4", OBJPROP_XDISTANCE, 0);
      ObjectSet("BKGR4", OBJPROP_YDISTANCE, 10);
   }
 
   l_y_0 = 90;
 
      if (ObjectFind("TarOpenOrderTitle1") == -1) {
         ObjectCreate("TarOpenOrderTitle1", OBJ_LABEL, 0, 0, 0);
         ObjectSetText("TarOpenOrderTitle1", "=========================", FontSize, "Tahoma", FontColor);
         ObjectSet("TarOpenOrderTitle1", OBJPROP_XDISTANCE, 5);
         ObjectSet("TarOpenOrderTitle1", OBJPROP_YDISTANCE, l_y_0+ 15);
         ObjectSet("TarOpenOrderTitle1", OBJPROP_CORNER, 0);
         ObjectSet("TarOpenOrderTitle1", OBJPROP_COLOR, FontColor2);
      }
      if (ObjectFind("TarOpenOrderTitle2") == -1) {
         ObjectCreate("TarOpenOrderTitle2", OBJ_LABEL, 0, 0, 0);
         ObjectSetText("TarOpenOrderTitle2", "Order Lot:"+ DoubleToStr(Lot,2),FontSize, "Tahoma", FontColor);
         ObjectSet("TarOpenOrderTitle2", OBJPROP_XDISTANCE, 5);
         ObjectSet("TarOpenOrderTitle2", OBJPROP_YDISTANCE, l_y_0 + 30);
         ObjectSet("TarOpenOrderTitle2", OBJPROP_CORNER, 0);
         ObjectSet("TarOpenOrderTitle2", OBJPROP_COLOR, FontColor);
      }
      
      if (ObjectFind("TarOpenOrderTitle3") == -1) {
         ObjectCreate("TarOpenOrderTitle3", OBJ_LABEL, 0, 0, 0);
         ObjectSetText("TarOpenOrderTitle3","Order StopLoss:"+StopLoss, FontSize, "Tahoma", FontColor2);
         ObjectSet("TarOpenOrderTitle3", OBJPROP_XDISTANCE, 5);
         ObjectSet("TarOpenOrderTitle3", OBJPROP_YDISTANCE, l_y_0 + 45);
         ObjectSet("TarOpenOrderTitle3", OBJPROP_CORNER, 0);
         ObjectSet("TarOpenOrderTitle3", OBJPROP_COLOR, FontColor);
      }
      if (ObjectFind("TarOpenOrderTitle4") == -1) {
         ObjectCreate("TarOpenOrderTitle4", OBJ_LABEL, 0, 0, 0);
         ObjectSetText("TarOpenOrderTitle4","Order TakeProfit:"+TakeProfit, FontSize, "Tahoma", FontColor2);
         ObjectSet("TarOpenOrderTitle4", OBJPROP_XDISTANCE, 5);
         ObjectSet("TarOpenOrderTitle4", OBJPROP_YDISTANCE, l_y_0 + 60);
         ObjectSet("TarOpenOrderTitle4", OBJPROP_CORNER, 0);
         ObjectSet("TarOpenOrderTitle4", OBJPROP_COLOR, FontColor);
      }
      string trailtrig;
      if(UseTrail) trailtrig="ON"; else trailtrig="OFF";
      if (ObjectFind("TarOpenOrderTitle5") == -1) {
         ObjectCreate("TarOpenOrderTitle5", OBJ_LABEL, 0, 0, 0);
         ObjectSetText("TarOpenOrderTitle5","Trail:"+"  "+trailtrig, FontSize, "Tahoma", FontColor2);
         ObjectSet("TarOpenOrderTitle5", OBJPROP_XDISTANCE, 5);
         ObjectSet("TarOpenOrderTitle5", OBJPROP_YDISTANCE, l_y_0 + 75);
         ObjectSet("TarOpenOrderTitle5", OBJPROP_CORNER, 0);
         ObjectSet("TarOpenOrderTitle5", OBJPROP_COLOR, FontColor);
      }

      l_y_0 += 90;
   
   if (ShowPredictions) {
      if (ObjectFind("TarPredictLabel1") == -1) {
         ObjectCreate("TarPredictLabel1", OBJ_LABEL, 0, 0, 0);
         ObjectSet("TarPredictLabel1", OBJPROP_XDISTANCE, 5);
         ObjectSet("TarPredictLabel1", OBJPROP_YDISTANCE, l_y_0);
         ObjectSet("TarPredictLabel1", OBJPROP_CORNER, 0);
         ObjectSet("TarPredictLabel1", OBJPROP_COLOR, FontColor2);
         ObjectSetText("TarPredictLabel1", "=========================", FontSize, "Tahoma", FontColor2);
      }
   
      if (ObjectFind("TarPredictLabelHigh") == -1) {
         ObjectCreate("TarPredictLabelHigh", OBJ_LABEL, 0, 0, 0);
         ObjectSet("TarPredictLabelHigh", OBJPROP_XDISTANCE, 5);
         ObjectSet("TarPredictLabelHigh", OBJPROP_YDISTANCE, l_y_0 + 15);
         ObjectSet("TarPredictLabelHigh", OBJPROP_CORNER, 0);
         ObjectSet("TarPredictLabelHigh", OBJPROP_COLOR, FontColor);
      }
      int type,types;double profit,profits; 
      int orderstotal= OrdersTotal();
      color FontColorBay,FontColorSell;
      string buy="";string sell="",profit1="",profit2="";
      for (int i = 0; i<orderstotal; i++) {
      OrderSelect(i, SELECT_BY_POS);                        
      if (OrderMagicNumber() == magic&&OrderSymbol() == Symbol()&&OrderType()== OP_BUYSTOP||OrderType()== OP_BUY )
      {priceb=OrderOpenPrice();profit=OrderProfit();type=OrderType();
      if (type== OP_BUYSTOP){FontColorBay=FontColor; buy="BUY_STOP";profit1="";}
      if (type== OP_BUY&&profit>0.0){FontColorBay= LawnGreen; buy="BUY";profit1=DoubleToStr(profit,2);}
      if (type== OP_BUY&&profit<0.0){FontColorBay= Red; buy="BUY";profit1=DoubleToStr(profit,2);}}
      }
     
      if (priceb != 0)ObjectSetText("TarPredictLabelHigh", buy+"  Order  At: " + DoubleToStr(priceb, Digits)+"     "+profit1, FontSize, "Tahoma", FontColorBay);
      if (prices==0)ObjectSetText("TarPredictLabelHigh", "BUY NO SIGNAL", FontSize, "Tahoma", FontColor);
      if (ObjectFind("TarPredictLabelLow") == -1) {
         ObjectCreate("TarPredictLabelLow", OBJ_LABEL, 0, 0, 0);
         ObjectSet("TarPredictLabelLow", OBJPROP_XDISTANCE, 5);
         ObjectSet("TarPredictLabelLow", OBJPROP_YDISTANCE, l_y_0 + 30);
         ObjectSet("TarPredictLabelLow", OBJPROP_CORNER, 0);
         ObjectSet("TarPredictLabelLow", OBJPROP_COLOR, FontColorBay);
      }
      
      for ( i = 0; i<orderstotal; i++) {
      OrderSelect(i, SELECT_BY_POS);                        
      if (OrderMagicNumber() == magic&&OrderSymbol() == Symbol()&&OrderType()== OP_SELLSTOP||OrderType()== OP_SELL )
      {prices=OrderOpenPrice();profits=OrderProfit();types=OrderType();
      if (types== OP_SELLSTOP){FontColorSell=FontColor;sell="SELL_STOP";}
      if (types== OP_SELL&&profits>0.0){FontColorSell= LawnGreen;sell="SELL";profit2=DoubleToStr(profits,2);}
      if (types== OP_SELL&&profits<0.0){FontColorSell= Red;sell="SELL";profit2=DoubleToStr(profits,2);}}
     }
      if (prices != 0) ObjectSetText("TarPredictLabelLow",sell+ " Order  At: " + DoubleToStr(prices, Digits)+"     "+profit2, FontSize, "Tahoma", FontColorSell);
      if (prices==0)ObjectSetText("TarPredictLabelLow", "SELL NO SIGNAL ", FontSize, "Tahoma", FontColor);
     }
   
}
/*
void Laguerre(double ad_0, double ad_8, int ai_16) {
   int li_20;
   if (g_bars_492 == Bars) li_20 = 0;
   else {
      li_20 = Bars - 1;
      g_bars_492 = Bars;
   }
   if (li_20 > 4950) li_20 = 4950;
   for (int li_24 = li_20; li_24 >= 0; li_24--) {
      gda_432[li_24] = MathAbs((High[li_24] + Low[li_24]) / 2.0 - (gda_452[li_24 + 1]));
      if (li_24 == 0) gda_432[0] = MathAbs((ad_0 + ad_8) / 2.0 - gda_452[1]);
      gda_468[li_24] = gda_432[li_24];
      gda_472[li_24] = gda_432[li_24];
      if (li_24 < Bars - 2 - ai_16) {
         for (int l_count_28 = 0; l_count_28 < ai_16; l_count_28++) {
            if (gda_432[li_24 + l_count_28] > gda_468[li_24]) gda_468[li_24] = gda_432[li_24 + l_count_28];
            if (gda_432[li_24 + l_count_28] < gda_472[li_24]) gda_472[li_24] = gda_432[li_24 + l_count_28];
         }
      }
      if (gda_468[li_24] - gda_472[li_24] != 0.0 && li_24 < Bars - 7 - ai_16) {
         gda_456[0] = (gda_432[li_24] - gda_472[li_24]) / (gda_468[li_24] - gda_472[li_24]);
         if (gda_468[li_24 + 1] - (gda_472[li_24 + 1]) == 0.0) gda_456[1] = gda_456[0];
         else gda_456[1] = (gda_432[li_24 + 1] - (gda_472[li_24 + 1])) / (gda_468[li_24 + 1] - (gda_472[li_24 + 1]));
         if (gda_468[li_24 + 2] - (gda_472[li_24 + 2]) == 0.0) gda_456[2] = gda_456[1];
         else gda_456[2] = (gda_432[li_24 + 2] - (gda_472[li_24 + 2])) / (gda_468[li_24 + 2] - (gda_472[li_24 + 2]));
         if (gda_468[li_24 + 3] - (gda_472[li_24 + 3]) == 0.0) gda_456[3] = gda_456[2];
         else gda_456[3] = (gda_432[li_24 + 3] - (gda_472[li_24 + 3])) / (gda_468[li_24 + 3] - (gda_472[li_24 + 3]));
         if (gda_468[li_24 + 4] - (gda_472[li_24 + 4]) == 0.0) gda_456[4] = gda_456[3];
         else gda_456[4] = (gda_432[li_24 + 4] - (gda_472[li_24 + 4])) / (gda_468[li_24 + 4] - (gda_472[li_24 + 4]));
         ArraySort(gda_456, 5);
         gd_460 = gda_456[2];
      }
      if (li_24 < Bars - 7 - ai_16) {
         if (li_24 == Bars - 8 - ai_16) gda_436[li_24] = gd_460 * ((High[li_24] + Low[li_24]) / 2.0) + (1 - gd_460) * (gda_436[li_24 + 1]);
         else {
            if (li_24 == Bars - 9 - ai_16) {
               gda_436[li_24] = gd_460 * ((High[li_24] + Low[li_24]) / 2.0) + (1 - gd_460) * (gda_436[li_24 + 1]);
               gda_440[li_24] = (-(1 - gd_460)) * gda_436[li_24] + (gda_436[li_24 + 1]) + (1 - gd_460) * (gda_440[li_24 + 1]);
            } else {
               if (li_24 == Bars - 10 - ai_16) {
                  gda_436[li_24] = gd_460 * ((High[li_24] + Low[li_24]) / 2.0) + (1 - gd_460) * (gda_436[li_24 + 1]);
                  gda_440[li_24] = (-(1 - gd_460)) * gda_436[li_24] + (gda_436[li_24 + 1]) + (1 - gd_460) * (gda_440[li_24 + 1]);
                  gda_444[li_24] = (-(1 - gd_460)) * gda_440[li_24] + (gda_440[li_24 + 1]) + (1 - gd_460) * (gda_444[li_24 + 1]);
               } else {
                  if (li_24 == Bars - 11 - ai_16) {
                     gda_436[li_24] = gd_460 * ((High[li_24] + Low[li_24]) / 2.0) + (1 - gd_460) * (gda_436[li_24 + 1]);
                     gda_440[li_24] = (-(1 - gd_460)) * gda_436[li_24] + (gda_436[li_24 + 1]) + (1 - gd_460) * (gda_440[li_24 + 1]);
                     gda_444[li_24] = (-(1 - gd_460)) * gda_440[li_24] + (gda_440[li_24 + 1]) + (1 - gd_460) * (gda_444[li_24 + 1]);
                     gda_448[li_24] = (-(1 - gd_460)) * gda_444[li_24] + (gda_444[li_24 + 1]) + (1 - gd_460) * (gda_448[li_24 + 1]);
                  } else {
                     if (li_24 <= Bars - 12 - ai_16) {
                        if (li_24 == 0) gda_436[li_24] = gd_460 * ((ad_0 + ad_8) / 2.0) + (1 - gd_460) * gda_436[1];
                        else gda_436[li_24] = gd_460 * ((High[li_24] + Low[li_24]) / 2.0) + (1 - gd_460) * (gda_436[li_24 + 1]);
                        gda_440[li_24] = (-(1 - gd_460)) * gda_436[li_24] + (gda_436[li_24 + 1]) + (1 - gd_460) * (gda_440[li_24 + 1]);
                        gda_444[li_24] = (-(1 - gd_460)) * gda_440[li_24] + (gda_440[li_24 + 1]) + (1 - gd_460) * (gda_444[li_24 + 1]);
                        gda_448[li_24] = (-(1 - gd_460)) * gda_444[li_24] + (gda_444[li_24 + 1]) + (1 - gd_460) * (gda_448[li_24 + 1]);
                        gda_452[li_24] = (gda_436[li_24] + 2.0 * gda_440[li_24] + 2.0 * gda_444[li_24] + gda_448[li_24]) / 6.0;
                     }
                  }
               }
            }
         }
      }
   }
}*/