//+------------------------------------------------------------------+
//| COGS Ultimate Grid EA - Warnings Fixed                           |
//| Fixes: Check OrderSend/Close returns, remove unused vars, casts  |
//+------------------------------------------------------------------+
#property copyright "AndreaA"
#property version   "1.00"
#property strict

// Protection
bool Use_Protection = false;
int Account = 549493;
string Expiral_Time = "2029.08.19 12:00";

// General settings
extern string ________________________________________________gs = "General settings";
double Min_lot = 0.1;
extern int Magic_Number = 1523;
extern int Magic_Number_ = 1524;
extern bool Restart_Objects = true;
extern int Panel_yd = 0;
double Grid = 10; 
double Grid2 = 10; 
double Grid3 = 10; 
double Take_Profit = 40;
double Take_Profit2 = 40;
double Take_Profit3 = 40;
double Multiplier, Multiplier2 = 1.8;
double Multiplier3 = 2.0;
int Overlap_Number = 7;
double OverLap_Percentage = 70;
double BE_Value = 4;
int Max_Orders = 8;
int bt, st;

// Panel settings
extern color Panel_BG_Color = clrDimGray;
extern color Panel_Border_Color = clrBlack;
extern int Font_Size = 8;
extern int Input_Width = 40;
extern int Input_Height = 20;
extern int Panel_Width = 350;
extern int Panel_Height = 500;

// Draggable panel globals
bool isDragging = false;
int mouseStartX = 0;
int mouseStartY = 0;
bool wasDragged = false;

//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init() {
   ChartSetInteger(ChartID(), CHART_EVENT_MOUSE_MOVE, 1);
   if(!Restart_Objects) return(0);
   
   CreatePanel(0, 100 + Panel_yd, Panel_Width, Panel_Height, Input_Width, Input_Height, Panel_BG_Color, Font_Size, Panel_Border_Color);
   
return(0);
}

//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit() {
   return(0);
}

//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start() {
    int i, cc = 0; // Initialized cc here to avoid unused warning
    int ticket = -1;
    bool closed;
   
if(Use_Protection)
if(AccountNumber() != Account && Account != 0) {
Comment("Wrong Account Number");
return(0);
}
if(Use_Protection)
if(iBarShift(NULL,0,StringToTime(Expiral_Time),false) != 0) {
Comment("Expire Time is over");
return(0);
}

  string n;
  double pb, ps, lb, ls;
  lb=TotLots(OP_BUY,Magic_Number);
  ls=TotLots(OP_SELL,Magic_Number_);
  pb=TOTProfit(OP_BUY,Magic_Number)+TOTProfit(OP_SELL,Magic_Number);
  ps=TOTProfit(OP_SELL,Magic_Number_)+TOTProfit(OP_BUY,Magic_Number_);

  n=n+"\nLots Buy = "+ DoubleToStr(lb,2)+" Profits = "+DoubleToStr(pb,2); // Explicit DoubleToStr to fix implicit conversion
  n=n+"\nLots Sell = "+ DoubleToStr(ls,2)+" Profits = "+DoubleToStr(ps,2);
  n=n+"\nTOTAL PROFIT =" + DoubleToStr((pb+ps),2);
  n=n+"\nFree Capital  "+DoubleToStr(AccountFreeMargin(),2);
  
  if (lb == 0) bt=0;
  if (ls == 0) st=0;

  Comment(n);


      tester();

      double Auto_Freeze=StringToDouble(ObjectGetString(0,"A13%|",OBJPROP_TEXT));
      double Auto_Freeze2=StringToDouble(ObjectGetString(0,"A23%|",OBJPROP_TEXT));
      bool FreezeBuys = (bool)ObjectGetInteger(0,"A04b%|",OBJPROP_STATE);
      bool FreezeSells = (bool)ObjectGetInteger(0,"A14b%|",OBJPROP_STATE);
      Take_Profit=StringToDouble(ObjectGetString(0,"A00%|",OBJPROP_TEXT));
      Take_Profit2=StringToDouble(ObjectGetString(0,"A10%|",OBJPROP_TEXT));
      Take_Profit3=StringToDouble(ObjectGetString(0,"A44%|",OBJPROP_TEXT));
      double BuyGrid=StringToDouble(ObjectGetString(0,"A01%|",OBJPROP_TEXT));
      double SellGrid=StringToDouble(ObjectGetString(0,"A01s%|",OBJPROP_TEXT));
      double BuyGrid2=StringToDouble(ObjectGetString(0,"A11%|",OBJPROP_TEXT));
      double SellGrid2=StringToDouble(ObjectGetString(0,"A11s%|",OBJPROP_TEXT));
      double BuyGrid3=StringToDouble(ObjectGetString(0,"A45%|",OBJPROP_TEXT));
      double SellGrid3=StringToDouble(ObjectGetString(0,"A45s%|",OBJPROP_TEXT));
      double equi=StringToDouble(ObjectGetString(0,"A12%|",OBJPROP_TEXT));
      Multiplier=StringToDouble(ObjectGetString(0,"A20%|",OBJPROP_TEXT));
      Multiplier2=StringToDouble(ObjectGetString(0,"A20a%|",OBJPROP_TEXT));
      Multiplier3=StringToDouble(ObjectGetString(0,"A46%|",OBJPROP_TEXT));
      double max_1=StringToDouble(ObjectGetString(0,"A200%|",OBJPROP_TEXT));
      double max_2=StringToDouble(ObjectGetString(0,"A20b%|",OBJPROP_TEXT));
      double max_3=StringToDouble(ObjectGetString(0,"A46b%|",OBJPROP_TEXT));
      Overlap_Number=(int)StringToDouble(ObjectGetString(0,"A24%|",OBJPROP_TEXT));
      OverLap_Percentage=StringToDouble(ObjectGetString(0,"A34%|",OBJPROP_TEXT));
      BE_Value=StringToDouble(ObjectGetString(0,"A21%|",OBJPROP_TEXT));
      Max_Orders=(int)StringToDouble(ObjectGetString(0,"A30%|",OBJPROP_TEXT));
      
      int BE_Buys=(int)StringToDouble(ObjectGetString(0,"A05d%|",OBJPROP_TEXT));
      int BE_Sells=(int)StringToDouble(ObjectGetString(0,"A15d%|",OBJPROP_TEXT));
      
      int Orders_Next=(int)StringToDouble(ObjectGetString(0,"A02%|",OBJPROP_TEXT));
      int Orders_Next2=(int)StringToDouble(ObjectGetString(0,"A07%|",OBJPROP_TEXT));
      
      double max_spread=StringToDouble(ObjectGetString(0,"A40%|",OBJPROP_TEXT));
      double max_loss=StringToDouble(ObjectGetString(0,"A41%|",OBJPROP_TEXT));
      string pause_start=ObjectGetString(0,"A42%|",OBJPROP_TEXT);
      string pause_end=ObjectGetString(0,"A43%|",OBJPROP_TEXT);
  
      if(Open[0]-Bid>Auto_Freeze*10*Point) 
         {
         FreezeBuys=true;
         ObjectSetInteger(0,"A04b%|",OBJPROP_STATE, (long)true);
         }
         
      if(Bid-Open[0]>Auto_Freeze*10*Point) 
         {
         FreezeSells=true;
         ObjectSetInteger(0,"A14b%|",OBJPROP_STATE, (long)true);
         }
   if(Count(OP_BUY,Magic_Number)>Orders_Next)
      if(Open[0]-Bid>Auto_Freeze2*10*Point) 
         {
         FreezeBuys=true;
         ObjectSetInteger(0,"A04b%|",OBJPROP_STATE, (long)true);
         }
   if(Count(OP_SELL,Magic_Number_)>Orders_Next)
      if(Bid-Open[0]>Auto_Freeze2*10*Point) 
         {
         FreezeSells=true;
         ObjectSetInteger(0,"A14b%|",OBJPROP_STATE, (long)true);
         }

     if(AccountEquity()<equi){
         Alert("Closing orders - Equity");
          for(i=(OrdersTotal()-1);i>=0;i--)
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               if(OrderMagicNumber()==Magic_Number && OrderSymbol()==Symbol()) {
                  closed = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),MarketInfo(OrderSymbol(),MODE_SPREAD),CLR_NONE);
                  if (!closed) Print("OrderClose failed: ", GetLastError());
               }
          for(i=(OrdersTotal()-1);i>=0;i--)
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               if(OrderMagicNumber()==Magic_Number_ && OrderSymbol()==Symbol()) {
                  closed = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),MarketInfo(OrderSymbol(),MODE_SPREAD),CLR_NONE);
                  if (!closed) Print("OrderClose failed: ", GetLastError());
               }
      }
      
      if(AccountProfit() < -max_loss){
         Alert("Closing orders - Max Loss");
          for(i=(OrdersTotal()-1);i>=0;i--)
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               if(OrderMagicNumber()==Magic_Number && OrderSymbol()==Symbol()) {
                  closed = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),MarketInfo(OrderSymbol(),MODE_SPREAD),CLR_NONE);
                  if (!closed) Print("OrderClose failed: ", GetLastError());
               }
          for(i=(OrdersTotal()-1);i>=0;i--)
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               if(OrderMagicNumber()==Magic_Number_ && OrderSymbol()==Symbol()) {
                  closed = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),MarketInfo(OrderSymbol(),MODE_SPREAD),CLR_NONE);
                  if (!closed) Print("OrderClose failed: ", GetLastError());
               }
      }

  double ll, u, d;                 
      ll=StringToDouble(ObjectGetString(0,"A05%|",OBJPROP_TEXT));
  if(ll!=0){
         u=StringToDouble(ObjectGetString(0,"A22%|",OBJPROP_TEXT));
         d=StringToDouble(ObjectGetString(0,"A32%|",OBJPROP_TEXT));
   if((u==0 && d==0) || (u!=0 && Bid>u) || (d!=0 && Bid<d)){
      if (!IsPauseTime(pause_start, pause_end) && (Ask - Bid)/Point <= max_spread) {
         ticket = OrderSend(Symbol(),OP_BUY,ll,Ask,MarketInfo(NULL,MODE_SPREAD),0,0,NULL,Magic_Number);
         if (ticket < 0) Print("OrderSend BUY failed: ", GetLastError());
      }
      ObjectSetString(0,"A05%|",OBJPROP_TEXT,"0");
      ObjectSetString(0,"A22%|",OBJPROP_TEXT,"0");
      ObjectSetString(0,"A32%|",OBJPROP_TEXT,"0");
   }
  }
  
  ll=StringToDouble(ObjectGetString(0,"A15%|",OBJPROP_TEXT));
  if(ll!=0){
    u=StringToDouble(ObjectGetString(0,"A22%|",OBJPROP_TEXT));
    d=StringToDouble(ObjectGetString(0,"A32%|",OBJPROP_TEXT));
   if((u==0 && d==0) || (u!=0 && Bid>u) || (d!=0 && Bid<d)){
      if (!IsPauseTime(pause_start, pause_end) && (Ask - Bid)/Point <= max_spread) {
         ticket = OrderSend(Symbol(),OP_SELL,ll,Bid,MarketInfo(NULL,MODE_SPREAD),0,0,NULL,Magic_Number_);
         if (ticket < 0) Print("OrderSend SELL failed: ", GetLastError());
      }
      ObjectSetString(0,"A15%|",OBJPROP_TEXT,"0");
      ObjectSetString(0,"A22%|",OBJPROP_TEXT,"0");
      ObjectSetString(0,"A32%|",OBJPROP_TEXT,"0");
      }
  }
  
  double Lot=Min_lot;
  int s=Count(OP_SELL,Magic_Number_);
  
  if(!FreezeSells){
     if(s>0 && s<Orders_Next)
     if(s<Max_Orders && Bid-CheckLastPrice(OP_SELL,Magic_Number_)>SellGrid*10*Point){
      Lot=MaxLot(OP_SELL,Magic_Number_)*Multiplier;
      if(Lot>max_1) Lot=max_1;
      //Lot=Min_lot*pow(Multiplier,s);
      Lot=NormalizeDouble(Lot,2);
        if (!IsPauseTime(pause_start, pause_end) && (Ask - Bid)/Point <= max_spread) {
           ticket = OrderSend(Symbol(),OP_SELL,Lot,Bid,MarketInfo(NULL,MODE_SPREAD),0,0,NULL,Magic_Number_);
           if (ticket < 0) Print("OrderSend SELL grid failed: ", GetLastError());
        }
     }
     else if(s>0 && s<Orders_Next2)
     if(s<Max_Orders && Bid-CheckLastPrice(OP_SELL,Magic_Number_)>SellGrid2*10*Point){
      Lot=MaxLot(OP_SELL,Magic_Number_)*Multiplier2;
      if(Lot>max_2) Lot=max_2;
      //Lot=Min_lot*pow(Multiplier,s);
      Lot=NormalizeDouble(Lot,2);
        if (!IsPauseTime(pause_start, pause_end) && (Ask - Bid)/Point <= max_spread) {
           ticket = OrderSend(Symbol(),OP_SELL,Lot,Bid,MarketInfo(NULL,MODE_SPREAD),0,0,NULL,Magic_Number_);
           if (ticket < 0) Print("OrderSend SELL grid2 failed: ", GetLastError());
        }
     }
     else if(s>0 && s>=Orders_Next2)
     if(s<Max_Orders && Bid-CheckLastPrice(OP_SELL,Magic_Number_)>SellGrid3*10*Point){
      Lot=MaxLot(OP_SELL,Magic_Number_)*Multiplier3;
      if(Lot>max_3) Lot=max_3;
      //Lot=Min_lot*pow(Multiplier,s);
      Lot=NormalizeDouble(Lot,2);
        if (!IsPauseTime(pause_start, pause_end) && (Ask - Bid)/Point <= max_spread) {
           ticket = OrderSend(Symbol(),OP_SELL,Lot,Bid,MarketInfo(NULL,MODE_SPREAD),0,0,NULL,Magic_Number_);
           if (ticket < 0) Print("OrderSend SELL grid3 failed: ", GetLastError());
        }
     }
  }
  
  
  int b=Count(OP_BUY,Magic_Number);
  
  if(!FreezeBuys){
     if(b>0 && b<Orders_Next)
     if(b<Max_Orders && CheckLastPrice(OP_BUY,Magic_Number)-Bid>BuyGrid*10*Point){
      Lot=MaxLot(OP_BUY,Magic_Number)*Multiplier;
      if(Lot>max_1) Lot=max_1;
      //Lot=Min_lot*pow(Multiplier,b);
      Lot=NormalizeDouble(Lot,2);
        if (!IsPauseTime(pause_start, pause_end) && (Ask - Bid)/Point <= max_spread) {
           ticket = OrderSend(Symbol(),OP_BUY,Lot,Ask,MarketInfo(NULL,MODE_SPREAD),0,0,NULL,Magic_Number);
           if (ticket < 0) Print("OrderSend BUY grid failed: ", GetLastError());
        }
     }
     else if(b>0 && b<Orders_Next2)
     if(b<Max_Orders && CheckLastPrice(OP_BUY,Magic_Number)-Bid>BuyGrid2*10*Point){
      Lot=MaxLot(OP_BUY,Magic_Number)*Multiplier2;
      if(Lot>max_2) Lot=max_2;
      //Lot=Min_lot*pow(Multiplier,b);
      Lot=NormalizeDouble(Lot,2);
        if (!IsPauseTime(pause_start, pause_end) && (Ask - Bid)/Point <= max_spread) {
           ticket = OrderSend(Symbol(),OP_BUY,Lot,Ask,MarketInfo(NULL,MODE_SPREAD),0,0,NULL,Magic_Number);
           if (ticket < 0) Print("OrderSend BUY grid2 failed: ", GetLastError());
        }
     }
     else if(b>0 && b>=Orders_Next2)
     if(b<Max_Orders && CheckLastPrice(OP_BUY,Magic_Number)-Bid>BuyGrid3*10*Point){
      Lot=MaxLot(OP_BUY,Magic_Number)*Multiplier3;
      if(Lot>max_3) Lot=max_3;
      //Lot=Min_lot*pow(Multiplier,b);
      Lot=NormalizeDouble(Lot,2);
        if (!IsPauseTime(pause_start, pause_end) && (Ask - Bid)/Point <= max_spread) {
           ticket = OrderSend(Symbol(),OP_BUY,Lot,Ask,MarketInfo(NULL,MODE_SPREAD),0,0,NULL,Magic_Number);
           if (ticket < 0) Print("OrderSend BUY grid3 failed: ", GetLastError());
        }
     }
  }
  double fl;
  if(FreezeBuys){
      fl=TotLots(OP_BUY,Magic_Number)-TotLots(OP_SELL,Magic_Number);
      if(fl!=0){
        if (!IsPauseTime(pause_start, pause_end) && (Ask - Bid)/Point <= max_spread) {
           ticket = OrderSend(Symbol(),OP_SELL,fl,Bid,MarketInfo(NULL,MODE_SPREAD),0,0,NULL,Magic_Number);
           if (ticket < 0) Print("OrderSend Freeze SELL failed: ", GetLastError());
        }
        Alert("Freeze Buys");
        }
  }
  
  if(FreezeSells){
      fl=TotLots(OP_SELL,Magic_Number_)-TotLots(OP_BUY,Magic_Number_);
      if(fl!=0){
        if (!IsPauseTime(pause_start, pause_end) && (Ask - Bid)/Point <= max_spread) {
           ticket = OrderSend(Symbol(),OP_BUY,fl,Ask,MarketInfo(NULL,MODE_SPREAD),0,0,NULL,Magic_Number_);
           if (ticket < 0) Print("OrderSend Freeze BUY failed: ", GetLastError());
        }
        Alert("Freeze Sells");
        }
  }
  
  //BUYS
double Be=breakeven(OP_BUY,Magic_Number);
   ObjectDelete("BE");
   ObjectCreate("BE",OBJ_ARROW_RIGHT_PRICE,0,Time[0],Be);
   ObjectSet ("BE",OBJPROP_COLOR,clrGreen);
   
   cc=0;
   double Tp;
  if(!FreezeBuys)
   if(b!=0){
    if(b<Orders_Next)
       Tp=Be+Take_Profit*10*Point;
    else if(b<Orders_Next2)
       Tp=Be+Take_Profit2*10*Point;
    else
       Tp=Be+Take_Profit3*10*Point;
    if(Bid>Tp){
     Alert("Closing orders - TP");
     for(i=(OrdersTotal()-1);i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==Magic_Number && OrderSymbol()==Symbol()) {
            closed = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),MarketInfo(OrderSymbol(),MODE_SPREAD),CLR_NONE);
            if (!closed) Print("OrderClose BUY TP failed: ", GetLastError());
         }
    }
   }

   ObjectDelete("TP");
   ObjectCreate("TP",OBJ_ARROW_RIGHT_PRICE,0,Time[0],Tp);
   ObjectSet ("TP",OBJPROP_COLOR,clrRed);
   
   //SELLS!
   Be=breakeven(OP_SELL,Magic_Number_);
   ObjectDelete("BE_");
   ObjectCreate("BE_",OBJ_ARROW_RIGHT_PRICE,0,Time[0],Be);
   ObjectSet ("BE_",OBJPROP_COLOR,clrGreen);
   cc=0;
    if(!FreezeSells)
   if(s!=0){
   if(s<Orders_Next)
    Tp=Be-Take_Profit*10*Point;
   else if(s<Orders_Next2)
    Tp=Be-Take_Profit2*10*Point;
   else
    Tp=Be-Take_Profit3*10*Point;
   if(Bid<Tp){
     Alert("Closing orders - TP");
     for(i=(OrdersTotal()-1);i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==Magic_Number_ && OrderSymbol()==Symbol()) {
            closed = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),MarketInfo(OrderSymbol(),MODE_SPREAD),CLR_NONE);
            if (!closed) Print("OrderClose SELL TP failed: ", GetLastError());
         }
    }
   }

   ObjectDelete("TP_");
   ObjectCreate("TP_",OBJ_ARROW_RIGHT_PRICE,0,Time[0],Tp);
   ObjectSet ("TP_",OBJPROP_COLOR,clrRed);
   
   if(BE_Buys!=0)   if(b>bt){
      if(b>BE_Buys){
         ObjectSetString(0,"A00%|",OBJPROP_TEXT,NormalizeDouble(Take_Profit-Take_Profit/BE_Value,1));
         ObjectSetString(0,"A10%|",OBJPROP_TEXT,NormalizeDouble(Take_Profit2-Take_Profit2/BE_Value,1));
         ObjectSetString(0,"A44%|",OBJPROP_TEXT,NormalizeDouble(Take_Profit3-Take_Profit3/BE_Value,1));
      }
   bt=b;
   }
   
   if(BE_Sells!=0)   if(s>st){
      if(s>BE_Sells){
         ObjectSetString(0,"A00%|",OBJPROP_TEXT,NormalizeDouble(Take_Profit-Take_Profit/BE_Value,1));
         ObjectSetString(0,"A10%|",OBJPROP_TEXT,NormalizeDouble(Take_Profit2-Take_Profit2/BE_Value,1));
         ObjectSetString(0,"A44%|",OBJPROP_TEXT,NormalizeDouble(Take_Profit3-Take_Profit3/BE_Value,1));
      }
   st=s;
   }
   
   
  if(!FreezeSells)
   if(s>=Overlap_Number) OverLap(OP_SELL,Magic_Number_);
  if(!FreezeBuys)
   if(b>=Overlap_Number) OverLap(OP_BUY,Magic_Number);
   
return(0);
}

//+------------------------------------------------------------------+
//| Functions                                                        |
//+------------------------------------------------------------------+

void CreatePanel(int base_x, int base_y, int p_width, int p_height, int i_width, int i_height, color bg_col, int font_size, color border_col) {
   int row_height = i_height + 2;
   int title_offset = -5; // for title position
   int k = 105;
   string N="label%";
   ObjectDelete(N);
   ObjectCreate(0,N,OBJ_RECTANGLE_LABEL,0,0,0);
   ObjectSetInteger(0,N,OBJPROP_XDISTANCE,base_x);
   ObjectSetInteger(0,N,OBJPROP_YDISTANCE,base_y);
   ObjectSetInteger(0,N,OBJPROP_XSIZE,p_width);
   ObjectSetInteger(0,N,OBJPROP_YSIZE,p_height);
   ObjectSetInteger(0,N,OBJPROP_BGCOLOR,bg_col);
   ObjectSetInteger(0,N,OBJPROP_BORDER_COLOR,border_col);
   ObjectSetInteger(0,N,OBJPROP_BORDER_TYPE,BORDER_FLAT);
   ObjectSetInteger(0,N,OBJPROP_CORNER,0);
   
   int i = 10;
   int j = base_y + title_offset;
   Label("title%|",85 + base_x, j, "COGS's Ultimate Grid ", font_size);
   button("hideb|",i + base_x, j, i_width, i_height, "Panel", clrLightGray, clrBlack, false, font_size);
   j += row_height;
   Label("00%|",i + base_x, j, "TP pips 1", font_size);
   Entry("A00%|",i + k + base_x, j, i_width, i_height, "55", font_size);
   j += row_height;
   Label("01%|",i + base_x, j, "Buy Grid 1", font_size);
   Entry("A01%|",i + k + base_x, j, i_width, i_height, "17.5", font_size);
   j += row_height;
   Label("01s%|",i + base_x, j, "Sell Grid 1", font_size);
   Entry("A01s%|",i + k + base_x, j, i_width, i_height, "17.5", font_size);
   j += row_height;
   Label("02%|",i + base_x, j, "2nd Grid After Ord", font_size);
   Entry("A02%|",i + k + base_x, j, i_width, i_height, "7", font_size);
   j += row_height;
   Label("07%|",i + base_x, j, "3rd Grid After Ord", font_size);
   Entry("A07%|",i + k + base_x, j, i_width, i_height, "14", font_size);
   j += row_height;
   Label("03%|",i + base_x, j, "Close All Now", font_size);
   button("A03b%|",i + k + base_x, j, i_width, i_height, "X All", clrOrange, clrBlack, false, font_size);
   j += row_height;
   Label("04%|",i + base_x, j, "Freeze BUYs", font_size);
   button("A04b%|",i + k + base_x, j, i_width, i_height, "Frz", clrViolet, clrBlack, false, font_size);
   j += row_height;
   Label("05%|",i + base_x, j, "BUY Ord", font_size);
   Entry("A05%|",i + k + base_x, j, i_width, i_height, "0", font_size);
   button("A05c%|",i + k -42 + base_x, j, i_width, i_height, "X", clrOrange, clrBlack, false, font_size);
   j += row_height;
   Label("05d%|",i + base_x, j, "BUY BE After", font_size);
   Entry("A05d%|",i + k + base_x, j, i_width, i_height, "8", font_size);
   j += row_height;
   Label("20%|",i + base_x, j, "Multiplier 1", font_size);
   Entry("A20%|",i + k -30 + base_x, j, i_width, i_height, "1.2", font_size);
   Entry("A200%|",i + k +15 + base_x, j, i_width, i_height, "1111", font_size);
   j += row_height;
   Label("21%|",i + base_x, j, "BE value", font_size);
   Entry("A21%|",i + k + base_x, j, i_width, i_height, "4", font_size);
   j += row_height;
   Label("22%|",i + base_x, j, "UP Price", font_size);
   Entry("A22%|",i + k + base_x, j, i_width, i_height, "0", font_size);
   j += row_height;
   Label("24%|",i + base_x, j, "OverLap Num", font_size);
   Entry("A24%|",i + k + base_x, j, i_width, i_height, "7", font_size);

   i = 190;
   j = base_y + title_offset + row_height; // equivalent to 117 for initial
   Label("10%|",i + base_x, j, "TP pips 2", font_size);
   Entry("A10%|",i + k + base_x, j, i_width, i_height, "55", font_size);
   j += row_height;
   Label("11%|",i + base_x, j, "Buy Grid 2", font_size);
   Entry("A11%|",i + k + base_x, j, i_width, i_height, "8.5", font_size);
   j += row_height;
   Label("11s%|",i + base_x, j, "Sell Grid 2", font_size);
   Entry("A11s%|",i + k + base_x, j, i_width, i_height, "8.5", font_size);
   j += row_height;
   Label("12%|",i + base_x, j, "Min Equity", font_size);
   Entry("A12%|",i + k + base_x, j, i_width, i_height, "0", font_size);
   j += row_height;
   Label("13%|",i + base_x, j, "Auto Freeze", font_size);
   Entry("A13%|",i + k -20 + base_x, j, i_width, i_height, "600", font_size);
   Entry("A23%|",i + k +20 + base_x, j, i_width, i_height, "600", font_size);
   j += row_height;
   Label("14%|",i + base_x, j, "Freeze SELLs", font_size);
   button("A14b%|",i + k + base_x, j, i_width, i_height, "Frz", clrViolet, clrBlack, false, font_size);
   j += row_height;
   Label("15%|",i + base_x, j, "SELL Ord", font_size);
   Entry("A15%|",i + k + base_x, j, i_width, i_height, "0", font_size);
   button("A15c%|",i + k -42 + base_x, j, i_width, i_height, "X", clrOrange, clrBlack, false, font_size);
   j += row_height;
   Label("15d%|",i + base_x, j, "SELL BE After", font_size);
   Entry("A15d%|",i + k + base_x, j, i_width, i_height, "8", font_size);
   j += row_height;
   Label("20a%|",i + base_x, j, "Multiplier 2", font_size);
   Entry("A20a%|",i + k -30 + base_x, j, i_width, i_height, "1.8", font_size);
   Entry("A20b%|",i + k +15 + base_x, j, i_width, i_height, "1000", font_size);
   j += row_height;
   Label("30%|",i + base_x, j, "Max Orders", font_size);
   Entry("A30%|",i + k + base_x, j, i_width, i_height, "11", font_size);
   j += row_height;
   Label("32%|",i + base_x, j, "Down Price", font_size);
   Entry("A32%|",i + k + base_x, j, i_width, i_height, "0", font_size);
   j += row_height;
   Label("34%|",i + base_x, j, "OverLap_Per", font_size);
   Entry("A34%|",i + k + base_x, j, i_width, i_height, "75", font_size);
   j += row_height;
   Label("40%|",i + base_x, j, "Max Spread", font_size);
   Entry("A40%|",i + k + base_x, j, i_width, i_height, "5", font_size);
   j += row_height;
   Label("41%|",i + base_x, j, "Max Loss", font_size);
   Entry("A41%|",i + k + base_x, j, i_width, i_height, "1000", font_size);
   j += row_height;
   Label("42%|",i + base_x, j, "Pause Start", font_size);
   Entry("A42%|",i + k + base_x, j, i_width, i_height, "22:00", font_size);
   j += row_height;
   Label("43%|",i + base_x, j, "Pause End", font_size);
   Entry("A43%|",i + k + base_x, j, i_width, i_height, "08:00", font_size);
   j += row_height;
   Label("44%|",i + base_x, j, "TP pips 3", font_size);
   Entry("A44%|",i + k + base_x, j, i_width, i_height, "55", font_size);
   j += row_height;
   Label("45%|",i + base_x, j, "Buy Grid 3", font_size);
   Entry("A45%|",i + k + base_x, j, i_width, i_height, "12.5", font_size);
   j += row_height;
   Label("45s%|",i + base_x, j, "Sell Grid 3", font_size);
   Entry("A45s%|",i + k + base_x, j, i_width, i_height, "12.5", font_size);
   j += row_height;
   Label("46%|",i + base_x, j, "Multiplier 3", font_size);
   Entry("A46%|",i + k -30 + base_x, j, i_width, i_height, "2.0", font_size);
   Entry("A46b%|",i + k +15 + base_x, j, i_width, i_height, "2000", font_size);
}

void Label(string N, int xd, int yd, string text, int fs){
    ObjectDelete(N);
    ObjectCreate(ChartID(),N,OBJ_LABEL,0,0,0);
    ObjectSetInteger(0,N,OBJPROP_BGCOLOR,clrWhite);
    ObjectSetString(0,N,OBJPROP_TEXT,text);
    ObjectSetInteger(0,N,OBJPROP_CORNER,0);
    ObjectSetInteger(0,N,OBJPROP_XDISTANCE,xd);
    ObjectSetInteger(0,N,OBJPROP_YDISTANCE,yd);
    ObjectSetInteger(0,N,OBJPROP_COLOR,clrBlack);
    ObjectSetInteger(0,N,OBJPROP_FONTSIZE,fs);
    return;
}

void Entry(string N, int xd, int yd, int xs, int ys, string text, int fs){
    ObjectDelete(N);
    ObjectCreate(0,N,OBJ_EDIT,0,0,0);
    ObjectSetInteger(0,N,OBJPROP_BGCOLOR,clrWhite);
    ObjectSetString(0,N,OBJPROP_TEXT,text);
    ObjectSetInteger(0,N,OBJPROP_CORNER,0);
    ObjectSetInteger(0,N,OBJPROP_XDISTANCE,xd);
    ObjectSetInteger(0,N,OBJPROP_YDISTANCE,yd);
    ObjectSetInteger(0,N,OBJPROP_XSIZE,xs);
    ObjectSetInteger(0,N,OBJPROP_YSIZE,ys);   
    ObjectSetInteger(0,N,OBJPROP_COLOR,clrBlack);
    ObjectSetInteger(0,N,OBJPROP_FONTSIZE,fs);
}

void button(string N,int xd,int yd,int xs,int ys,string text,color col0,color col1,bool state, int fs) {
      ObjectDelete(N);

      ObjectCreate(0,N,OBJ_BUTTON,0,0,0);
      ObjectSetInteger(0,N,OBJPROP_XDISTANCE,xd);
      ObjectSetInteger(0,N,OBJPROP_YDISTANCE,yd);
      ObjectSetInteger(0,N,OBJPROP_XSIZE,xs);
      ObjectSetInteger(0,N,OBJPROP_YSIZE,ys);
      ObjectSetInteger(0,N,OBJPROP_CORNER,0);
      ObjectSetString(0,N,OBJPROP_TEXT,text);
      ObjectSetInteger(0,N,OBJPROP_COLOR,col1);
      ObjectSetInteger(0,N,OBJPROP_BGCOLOR,col0);
      ObjectSetInteger(0,N,OBJPROP_BORDER_COLOR,clrNONE);
      ObjectSetInteger(0,N,OBJPROP_BACK,false);
      ObjectSetInteger(0,N,OBJPROP_STATE,(long)state);
      ObjectSetInteger(0,N,OBJPROP_SELECTABLE,false);
      ObjectSetInteger(0,N,OBJPROP_HIDDEN,true);
      ObjectSetInteger(0,N,OBJPROP_FONTSIZE,fs);
}

bool IsPauseTime(string start_str, string end_str) {
   datetime now = TimeCurrent();
   string today = TimeToStr(now, TIME_DATE);
   datetime start_t = StrToTime(today + " " + start_str);
   datetime end_t = StrToTime(today + " " + end_str);
   if (start_t > end_t) { // overnight pause
      if (now >= start_t || now < end_t) return true;
   } else {
      if (now >= start_t && now < end_t) return true;
   }
   return false;
}

double CheckLastPrice(int T, int M){
   double d = 0;
    for(int i=(OrdersTotal()-1);i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==M && OrderSymbol()==Symbol()) if(OrderType()==T){
            if(T==OP_BUY) if(d==0 || d>OrderOpenPrice()) d=OrderOpenPrice();
            if(T==OP_SELL) if(d==0 || d<OrderOpenPrice()) d=OrderOpenPrice();
         }
   return(d);
}

int Count(int T, int M){
   int c=0;
    for(int i=(OrdersTotal()-1);i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==M && OrderSymbol()==Symbol()) if(OrderType()==T)
          c++;
return(c);
}

double breakeven(int T, int mag){
double x=0, x2=0;
double lots=0;
double lots2=0;

      for(int i=(OrdersTotal()-1);i>=0;i--)
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) if(OrderSymbol()==Symbol())
            if(OrderMagicNumber()==mag){
      if(OrderType()==OP_BUY && T==OP_BUY){
         x=x-OrderLots()*OrderOpenPrice();
         lots+=OrderLots();
      }
      if(OrderType()==OP_SELL && T==OP_SELL){
         x+=OrderLots()*OrderOpenPrice();
         lots-=OrderLots();
      }
      
      if(OrderType()==OP_BUY && T==OP_SELL){
         x2=x2-OrderLots()*OrderOpenPrice();
         lots2+=OrderLots();
      }
      if(OrderType()==OP_SELL && T==OP_BUY){
         x2+=OrderLots()*OrderOpenPrice();
         lots2-=OrderLots();
      }
   }
   if(lots==0) return(0);
   double ret=fabs(x/lots);
   if(lots2==0)
      return(ret);
   
   if(fabs(lots2)==fabs(lots)){
   if(T==OP_BUY)
      ret=ret-(fabs(x2/lots2)-Bid);
      
   if(T==OP_SELL)
      ret=ret+(Bid-fabs(x2/lots2));
   }
   else{
      ret=fabs((x+x2)/(lots+lots2));
   }
      
   return(ret);
}

void OverLap(int T, int M){
   int tickaux=0, tickaux2=0;
   double paux=0, paux2=0;
   int timeaux=0, timeaux2=0;
   bool closed;
   
    for(int i=(OrdersTotal()-1);i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==M && OrderSymbol()==Symbol()) if(OrderType()==T){
            if(timeaux==0 || timeaux>OrderOpenTime()){
               timeaux=OrderOpenTime();
               tickaux=OrderTicket();
               paux=OrderProfit();
            }
            if(timeaux2==0 || timeaux2<OrderOpenTime()){
               timeaux2=OrderOpenTime();
               tickaux2=OrderTicket();
               paux2=OrderProfit();
            }
         }
         int cc=0;
  if(paux2>0)
   if(fabs(paux)/fabs(paux2)<OverLap_Percentage/100){
     Alert("Closing orders - OverLap");
      if(OrderSelect(tickaux,SELECT_BY_TICKET,MODE_TRADES)){
         closed = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),MarketInfo(OrderSymbol(),MODE_SPREAD),CLR_NONE);
         if (!closed) Print("OrderClose OverLap1 failed: ", GetLastError());
      }
      if(OrderSelect(tickaux2,SELECT_BY_TICKET,MODE_TRADES)){
         closed = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),MarketInfo(OrderSymbol(),MODE_SPREAD),CLR_NONE);
         if (!closed) Print("OrderClose OverLap2 failed: ", GetLastError());
      }
         ObjectSetString(0,"A00%|",OBJPROP_TEXT,NormalizeDouble(Take_Profit-Take_Profit/BE_Value,1));
         ObjectSetString(0,"A10%|",OBJPROP_TEXT,NormalizeDouble(Take_Profit2-Take_Profit2/BE_Value,1));
         ObjectSetString(0,"A44%|",OBJPROP_TEXT,NormalizeDouble(Take_Profit3-Take_Profit3/BE_Value,1));
   }
}

double MaxLot(int T, int M){
   double d = 0;
    for(int i=(OrdersTotal()-1);i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==M && OrderSymbol()==Symbol()) if(OrderType()==T)
            if(d<OrderLots()) d=OrderLots();
   return(d);
}


double TOTProfit(int T, int M){
   double c=0;
    for(int i=(OrdersTotal()-1);i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==M && OrderSymbol()==Symbol()) if(OrderType()==T)
          c=c+OrderProfit()+OrderCommission()+OrderSwap();
return(c);
}

double TotLots(int T, int M){
   double c=0;
    for(int i=(OrdersTotal()-1);i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==M && OrderSymbol()==Symbol()) if(OrderType()==T)
          c=c+OrderLots();
return(c);
}

double Env(int T, int p, int k){
   double E = 0;
   for(int i=0;i<p;i++) E=0;//indi(i);
   E=E/p;
   if(T==1) E=E*(1+k/1000);
   if(T==-1) E=E*(1-k/1000);
   return(E);
}

void Label_(string N, int xd, int yd, int t){
   if(t==1){
    ObjectSet(N,OBJPROP_BGCOLOR,clrWhite);
    ObjectSet(N,OBJPROP_COLOR,White);
    ObjectSet(N,OBJPROP_XDISTANCE,xd);
    ObjectSet(N,OBJPROP_YDISTANCE,yd);
   }
   else{
    ObjectSet(N,OBJPROP_BGCOLOR,clrNONE);
    ObjectSet(N,OBJPROP_COLOR,clrNONE);
    ObjectSet(N,OBJPROP_XDISTANCE,0);
    ObjectSet(N,OBJPROP_YDISTANCE,0);
   }
    return;
}

void Entry_(string N, int xd, int yd, int xs, int ys, int t){
   if(t==1){
    ObjectSet(N,OBJPROP_BGCOLOR,clrWhite);
    ObjectSet(N,OBJPROP_COLOR,Black);
    ObjectSet(N,OBJPROP_XDISTANCE,xd);
    ObjectSet(N,OBJPROP_YDISTANCE,yd);
   }
   else{
    ObjectSet(N,OBJPROP_BGCOLOR,clrNONE);
    ObjectSet(N,OBJPROP_COLOR,clrNONE);
    ObjectSet(N,OBJPROP_XDISTANCE,0);
    ObjectSet(N,OBJPROP_YDISTANCE,0);
   }
}

void tester() {
   if(!IsTesting())return;
   
   buttons();
}

void buttons() {
int cc=0, i;
bool closed;
      if(ObjectGetInteger(0,"hideb|",OBJPROP_STATE)) {
         ObjectSetInteger(0,"hideb|",OBJPROP_STATE, false);
         if (!isDragging && !wasDragged) Panel("%");
      }
      if(ObjectGetInteger(0,"A03b%|",OBJPROP_STATE)){
       Alert("Closing orders - Button");
         for(i=(OrdersTotal()-1);i>=0;i--)
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               if(OrderMagicNumber()==Magic_Number && OrderSymbol()==Symbol()) {
                  closed = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),MarketInfo(OrderSymbol(),MODE_SPREAD),CLR_NONE);
                  if (!closed) Print("OrderClose button all BUY failed: ", GetLastError());
               }
          for(i=(OrdersTotal()-1);i>=0;i--)
            if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
               if(OrderMagicNumber()==Magic_Number_ && OrderSymbol()==Symbol()) {
                  closed = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),MarketInfo(OrderSymbol(),MODE_SPREAD),CLR_NONE);
                  if (!closed) Print("OrderClose button all SELL failed: ", GetLastError());
               }
      }
      


      if(ObjectGetInteger(0,"A05c%|",OBJPROP_STATE))   {    
       Alert("Closing orders - Button");
      for(i=(OrdersTotal()-1);i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==Magic_Number && OrderSymbol()==Symbol()) {
            closed = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),MarketInfo(OrderSymbol(),MODE_SPREAD),CLR_NONE);
            if (!closed) Print("OrderClose button BUY failed: ", GetLastError());
         }
           }

      if(ObjectGetInteger(0,"A15c%|",OBJPROP_STATE)){
       Alert("Closing orders - Button");
      for(i=(OrdersTotal()-1);i>=0;i--)
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         if(OrderMagicNumber()==Magic_Number_ && OrderSymbol()==Symbol()) {
            closed = OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),MarketInfo(OrderSymbol(),MODE_SPREAD),CLR_NONE);
            if (!closed) Print("OrderClose button SELL failed: ", GetLastError());
         }
      }
}

void refreshbutton() {      
      int i,tf;
      
      for(i=0;i<=ObjectsTotal();i++)
         {
         if(StringFind(ObjectName(i),"|",0)>=0)
            {
            tf=(int)ObjectGetInteger(0,ObjectName(i),OBJPROP_TIMEFRAMES);
            if(tf!=EMPTY)
               {
               ObjectSetInteger(0,ObjectName(i),OBJPROP_TIMEFRAMES,EMPTY);
               ObjectSetInteger(0,ObjectName(i),OBJPROP_TIMEFRAMES,tf);
               }
            }         
         }
      ChartRedraw();
}

void Panel(string prefix) {
      if(!ObjectGetInteger(0,"hideb|",OBJPROP_STATE))return;
      
      int i;
      string m;
      color col=(color)ObjectGetInteger(0,"hideb|",OBJPROP_COLOR);

      for(i=0;i<=ObjectsTotal();i++)
         {
         m=ObjectName(i);
         if(StringFind(m,prefix,0)>=0 && col==clrRed)ObjectSetInteger(0,m,OBJPROP_TIMEFRAMES,NULL);
         if(StringFind(m,prefix,0)>=0 && col==clrBlack)ObjectSetInteger(0,m,OBJPROP_TIMEFRAMES,EMPTY);
         }

      if(col==clrBlack)
         {
         ObjectSetInteger(0,"hideb|",OBJPROP_COLOR,clrRed); 
         ObjectSetInteger(0,"hideb|",OBJPROP_STATE,false);
         refreshbutton();    
         return;               
         }

      if(col==clrRed)
         {
         ObjectSetInteger(0,"hideb|",OBJPROP_COLOR,clrBlack);   
         ObjectSetInteger(0,"hideb|",OBJPROP_STATE,false);         
         refreshbutton();
         return;      
         }
}

bool MouseOverObject(string name, int x, int y) {
   if (ObjectFind(0, name) == -1) return false;
   long ox = ObjectGetInteger(0, name, OBJPROP_XDISTANCE);
   long oy = ObjectGetInteger(0, name, OBJPROP_YDISTANCE);
   long sx = ObjectGetInteger(0, name, OBJPROP_XSIZE);
   long sy = ObjectGetInteger(0, name, OBJPROP_YSIZE);
   if (x >= ox && x <= ox + sx && y >= oy && y <= oy + sy) return true;
   return false;
}

void OnChartEvent(const int id,const long& lparam,const double& dparam,const string& sparam) {
   if (id == CHARTEVENT_MOUSE_MOVE) {
      int x = (int)lparam;
      int y = (int)dparam;
      bool leftPressed = (StringFind(sparam, "1") != -1);
      
      if (!isDragging && leftPressed && MouseOverObject("hideb|", x, y)) {
         isDragging = true;
         wasDragged = false;
         mouseStartX = x;
         mouseStartY = y;
      }
      
      if (isDragging && leftPressed) {
         int deltaX = x - mouseStartX;
         int deltaY = y - mouseStartY;
         
         if (MathAbs(deltaX) + MathAbs(deltaY) > 5) wasDragged = true;
         
         string panelObjects[] = {"label%", "title%|", "hideb|", "00%|", "A00%|", "01%|", "A01%|", "01s%|", "A01s%|", "02%|", "A02%|", "07%|", "A07%|", "03%|", "A03b%|", "04%|", "A04b%|", "05%|", "A05%|", "A05c%|", "05d%|", "A05d%|", "20%|", "A20%|", "A200%|", "21%|", "A21%|", "22%|", "A22%|", "24%|", "A24%|", "10%|", "A10%|", "11%|", "A11%|", "11s%|", "A11s%|", "12%|", "A12%|", "13%|", "A13%|", "A23%|", "14%|", "A14b%|", "15%|", "A15%|", "A15c%|", "15d%|", "A15d%|", "20a%|", "A20a%|", "A20b%|", "30%|", "A30%|", "32%|", "A32%|", "34%|", "A34%|", "40%|", "A40%|", "41%|", "A41%|", "42%|", "A42%|", "43%|", "A43%|", "44%|", "A44%|", "45%|", "A45%|", "45s%|", "A45s%|", "46%|", "A46%|", "A46b|%"};
         
         for (int k = 0; k < ArraySize(panelObjects); k++) {
            string name = panelObjects[k];
            if (ObjectFind(0, name) != -1) {
               long oldX = ObjectGetInteger(0, name, OBJPROP_XDISTANCE);
               long oldY = ObjectGetInteger(0, name, OBJPROP_YDISTANCE);
               ObjectSetInteger(0, name, OBJPROP_XDISTANCE, oldX + deltaX);
               ObjectSetInteger(0, name, OBJPROP_YDISTANCE, oldY + deltaY);
            }
         }
         
         mouseStartX = x;
         mouseStartY = y;
         ChartRedraw(0);
      }
      
      if (isDragging && !leftPressed) {
         isDragging = false;
         wasDragged = false;
      }
   }
   
   buttons();      
}