//+------------------------------------------------------------------+
//|                                                                  |
//|           ONE CLICK BUTTONS                                      |
//|                                                                  |
//+------------------------------------------------------------------+
#property strict

//--- input parameters
extern int    MAGIC = 20161001;
extern double SLIP  = 2.5;        // in pips
extern double SL    = 50.0;       // in pips
extern double TP    = 25.0;       // in pips
extern double GAP   = 15.0;       // in pips gap for pending orders 
extern double LOT   = 0.02;       //
extern double PartialClose = 0.5; // Fraction to Close When PartialClose Button is pressed 
extern int    SimOrders  = 1;     // Simultaneous order to submit   
extern int    XPOS  = 400;        // to position buttons on screen   

int i_Digits,i_Slippage;
double d_Pip2Double;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   i_Digits=(int)MarketInfo(Symbol(),MODE_DIGITS);
   d_Pip2Double=MarketInfo(Symbol(),MODE_POINT)*MathPow(10,i_Digits%2);
   i_Slippage=Calc_Slippage(SLIP);

//---CLOSE BUTTON 
   ObjectCreate(0,"CloseButton",OBJ_BUTTON,0,0,0);
   ObjectSetInteger(0,"CloseButton",OBJPROP_XDISTANCE,XPOS);
   ObjectSetInteger(0,"CloseButton",OBJPROP_YDISTANCE,20);
   ObjectSetInteger(0,"CloseButton",OBJPROP_XSIZE,50);
   ObjectSetInteger(0,"CloseButton",OBJPROP_YSIZE,20);
   ObjectSetString(0,"CloseButton",OBJPROP_TEXT,"Close All");

   ObjectSetInteger(0,"CloseButton",OBJPROP_COLOR,White);
   ObjectSetInteger(0,"CloseButton",OBJPROP_BGCOLOR,Orange);
   ObjectSetInteger(0,"CloseButton",OBJPROP_BORDER_COLOR,Orange);
   ObjectSetInteger(0,"CloseButton",OBJPROP_BORDER_TYPE,BORDER_FLAT);
   ObjectSetInteger(0,"CloseButton",OBJPROP_BACK,false);
   ObjectSetInteger(0,"CloseButton",OBJPROP_HIDDEN,true);
   ObjectSetInteger(0,"CloseButton",OBJPROP_STATE,false);
   ObjectSetInteger(0,"CloseButton",OBJPROP_FONTSIZE,8);

//---CLOSE BUTTON 
   ObjectCreate(0,"PartialCloseButton",OBJ_BUTTON,0,0,0);
   ObjectSetInteger(0,"PartialCloseButton",OBJPROP_XDISTANCE,XPOS);
   ObjectSetInteger(0,"PartialCloseButton",OBJPROP_YDISTANCE,60);
   ObjectSetInteger(0,"PartialCloseButton",OBJPROP_XSIZE,50);
   ObjectSetInteger(0,"PartialCloseButton",OBJPROP_YSIZE,20);
   ObjectSetString(0,"PartialCloseButton",OBJPROP_TEXT,"Partial Close All");

   ObjectSetInteger(0,"PartialCloseButton",OBJPROP_COLOR,White);
   ObjectSetInteger(0,"PartialCloseButton",OBJPROP_BGCOLOR,Orange);
   ObjectSetInteger(0,"PartialCloseButton",OBJPROP_BORDER_COLOR,Orange);
   ObjectSetInteger(0,"PartialCloseButton",OBJPROP_BORDER_TYPE,BORDER_FLAT);
   ObjectSetInteger(0,"PartialCloseButton",OBJPROP_BACK,false);
   ObjectSetInteger(0,"PartialCloseButton",OBJPROP_HIDDEN,true);
   ObjectSetInteger(0,"PartialCloseButton",OBJPROP_STATE,false);
   ObjectSetInteger(0,"PartialCloseButton",OBJPROP_FONTSIZE,8);
   
//---BUY BUTTON
   ObjectCreate(0,"BuyButton",OBJ_BUTTON,0,0,0);
   ObjectSetInteger(0,"BuyButton",OBJPROP_XDISTANCE,XPOS);
   ObjectSetInteger(0,"BuyButton",OBJPROP_YDISTANCE,100);
   ObjectSetInteger(0,"BuyButton",OBJPROP_XSIZE,50);
   ObjectSetInteger(0,"BuyButton",OBJPROP_YSIZE,20);
   ObjectSetString(0,"BuyButton",OBJPROP_TEXT,"Buy");

   ObjectSetInteger(0,"BuyButton",OBJPROP_COLOR,White);
   ObjectSetInteger(0,"BuyButton",OBJPROP_BGCOLOR,LimeGreen);
   ObjectSetInteger(0,"BuyButton",OBJPROP_BORDER_COLOR,LimeGreen);
   ObjectSetInteger(0,"BuyButton",OBJPROP_BORDER_TYPE,BORDER_FLAT);
   ObjectSetInteger(0,"BuyButton",OBJPROP_BACK,false);
   ObjectSetInteger(0,"BuyButton",OBJPROP_HIDDEN,true);
   ObjectSetInteger(0,"BuyButton",OBJPROP_STATE,false);
   ObjectSetInteger(0,"BuyButton",OBJPROP_FONTSIZE,8);

//---SELL BUTTON
   ObjectCreate(0,"SellButton",OBJ_BUTTON,0,0,0);
   ObjectSetInteger(0,"SellButton",OBJPROP_XDISTANCE,XPOS);
   ObjectSetInteger(0,"SellButton",OBJPROP_YDISTANCE,140);
   ObjectSetInteger(0,"SellButton",OBJPROP_XSIZE,50);
   ObjectSetInteger(0,"SellButton",OBJPROP_YSIZE,20);
   ObjectSetString(0,"SellButton",OBJPROP_TEXT,"Sell");

   ObjectSetInteger(0,"SellButton",OBJPROP_COLOR,White);
   ObjectSetInteger(0,"SellButton",OBJPROP_BGCOLOR,Red);
   ObjectSetInteger(0,"SellButton",OBJPROP_BORDER_COLOR,Red);
   ObjectSetInteger(0,"SellButton",OBJPROP_BORDER_TYPE,BORDER_FLAT);
   ObjectSetInteger(0,"SellButton",OBJPROP_BACK,false);
   ObjectSetInteger(0,"SellButton",OBJPROP_HIDDEN,true);
   ObjectSetInteger(0,"SellButton",OBJPROP_STATE,false);
   ObjectSetInteger(0,"SellButton",OBJPROP_FONTSIZE,8);

//---SELLSTOP BUTTON
   ObjectCreate(0,"SellStopButton",OBJ_BUTTON,0,0,0);
   ObjectSetInteger(0,"SellStopButton",OBJPROP_XDISTANCE,XPOS+60);
   ObjectSetInteger(0,"SellStopButton",OBJPROP_YDISTANCE,140);
   ObjectSetInteger(0,"SellStopButton",OBJPROP_XSIZE,50);
   ObjectSetInteger(0,"SellStopButton",OBJPROP_YSIZE,20);
   ObjectSetString(0,"SellStopButton",OBJPROP_TEXT,"SellStop");

   ObjectSetInteger(0,"SellStopButton",OBJPROP_COLOR,White);
   ObjectSetInteger(0,"SellStopButton",OBJPROP_BGCOLOR,Red);
   ObjectSetInteger(0,"SellStopButton",OBJPROP_BORDER_COLOR,Red);
   ObjectSetInteger(0,"SellStopButton",OBJPROP_BORDER_TYPE,BORDER_FLAT);
   ObjectSetInteger(0,"SellStopButton",OBJPROP_BACK,false);
   ObjectSetInteger(0,"SellStopButton",OBJPROP_HIDDEN,true);
   ObjectSetInteger(0,"SellStopButton",OBJPROP_STATE,false);
   ObjectSetInteger(0,"SellStopButton",OBJPROP_FONTSIZE,8);

//---BUYSTOP BUTTON
   ObjectCreate(0,"BuyStopButton",OBJ_BUTTON,0,0,0);
   ObjectSetInteger(0,"BuyStopButton",OBJPROP_XDISTANCE,XPOS+60);
   ObjectSetInteger(0,"BuyStopButton",OBJPROP_YDISTANCE,100);
   ObjectSetInteger(0,"BuyStopButton",OBJPROP_XSIZE,50);
   ObjectSetInteger(0,"BuyStopButton",OBJPROP_YSIZE,20);
   ObjectSetString(0,"BuyStopButton",OBJPROP_TEXT,"BuyStop");

   ObjectSetInteger(0,"BuyStopButton",OBJPROP_COLOR,White);
   ObjectSetInteger(0,"BuyStopButton",OBJPROP_BGCOLOR,LimeGreen);
   ObjectSetInteger(0,"BuyStopButton",OBJPROP_BORDER_COLOR,LimeGreen);
   ObjectSetInteger(0,"BuyStopButton",OBJPROP_BORDER_TYPE,BORDER_FLAT);
   ObjectSetInteger(0,"BuyStopButton",OBJPROP_BACK,false);
   ObjectSetInteger(0,"BuyStopButton",OBJPROP_HIDDEN,true);
   ObjectSetInteger(0,"BuyStopButton",OBJPROP_STATE,false);
   ObjectSetInteger(0,"BuyStopButton",OBJPROP_FONTSIZE,8);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

   ObjectDelete(0,"CloseButton");
   ObjectDelete(0,"PartialCloseButton");
   ObjectDelete(0,"BuyButton");
   ObjectDelete(0,"SellButton");
   ObjectDelete(0,"SellStopButton");
   ObjectDelete(0,"BuyStopButton");

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {

  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
   int _result=0;
   double d_SL=0,d_TP=0,d_BuyStop=0,d_SellStop=0;
   int i = 0;

   RefreshRates();

   if(sparam=="CloseButton")
     {
      CloseAllOpenPositions(i_Slippage);
      ObjectSetInteger(0,"CloseButton",OBJPROP_STATE,false);
     }
   if(sparam=="PartialCloseButton")
     {
      PartialCloseAllOpenPositions(i_Slippage, PartialClose);
      ObjectSetInteger(0,"PartialCloseButton",OBJPROP_STATE,false);
     }
   if(sparam=="BuyButton")
     {
      d_SL=NormalizeDouble(Bid-SL*d_Pip2Double,i_Digits);
      d_TP=NormalizeDouble(Ask+TP*d_Pip2Double,i_Digits);

      while(i<=SimOrders)
	  {
		_result=OrderSend(Symbol(),OP_BUY,LOT,Ask,i_Slippage,d_SL,d_TP,"One-Click OP_BUY",MAGIC,0,LimeGreen);
		i++;
	   }

      ObjectSetInteger(0,"BuyButton",OBJPROP_STATE,false);
     }
   if(sparam=="SellButton")
     {
      d_SL=NormalizeDouble(Ask+SL*d_Pip2Double,i_Digits);
      d_TP=NormalizeDouble(Bid-TP*d_Pip2Double,i_Digits);

      while(i<=SimOrders)
	  {
		_result=OrderSend(Symbol(),OP_SELL,LOT,Bid,i_Slippage,d_SL,d_TP,"One-Click OP_SELL",MAGIC,0,LimeGreen);
		i++;
	   }
	   
      ObjectSetInteger(0,"SellButton",OBJPROP_STATE,false);
     }
   if(sparam=="BuyStopButton")
     {
      d_BuyStop=NormalizeDouble(Ask+GAP*d_Pip2Double,i_Digits);
      d_SL=NormalizeDouble(Ask+GAP*d_Pip2Double-SL*d_Pip2Double,i_Digits);
      d_TP=NormalizeDouble(Ask+GAP*d_Pip2Double+TP*d_Pip2Double,i_Digits);

	  while(i<=SimOrders)
	  {
		_result=OrderSend(Symbol(),OP_BUYSTOP,LOT,d_BuyStop,i_Slippage,d_SL,d_TP,"One-Click OP_BUYSTOP",MAGIC,0,LimeGreen);
		i++;
	   }
	   
      ObjectSetInteger(0,"BuyStopButton",OBJPROP_STATE,false);
     }
   if(sparam=="SellStopButton")
     {
      d_SellStop=NormalizeDouble(Bid-GAP*d_Pip2Double,i_Digits);
      d_SL=NormalizeDouble(Bid-GAP*d_Pip2Double+SL*d_Pip2Double,i_Digits);
      d_TP=NormalizeDouble(Bid-GAP*d_Pip2Double-TP*d_Pip2Double,i_Digits);

      while(i<=SimOrders)
	  {
		_result=OrderSend(Symbol(),OP_SELLSTOP,LOT,d_SellStop,i_Slippage,d_SL,d_TP,"One-Click OP_SELLSTOP",MAGIC,0,LimeGreen);
		i++;
	   }
	   
      ObjectSetInteger(0,"SellStopButton",OBJPROP_STATE,false);
     }

  }
//+------------------------------------------------------------------------------------------------+
//| Returns correct Slippage Value depending on Broker Digits
//+------------------------------------------------------------------------------------------------+
int Calc_Slippage(double _base_slippage)
  {
   int _slippage=0;
   double _point=MarketInfo(Symbol(),MODE_POINT);

   if(_point==0.00001 || _point==0.001) _slippage=(int)_base_slippage*10;
   else _slippage=(int)_base_slippage;

   return (_slippage);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAllOpenPositions(int intMaxSlippage)
  {
   for(int tpos=OrdersTotal()-1; tpos>=0; tpos--)
     {
      if(OrderSelect(tpos,SELECT_BY_POS,MODE_TRADES)==true)
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
           {
            bool checkOrderClose=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),intMaxSlippage,clrOrange);

            if(checkOrderClose==false)
              {
               int errorCode=GetLastError();

               if(errorCode==1 || 
                  errorCode==2 ||
                  errorCode==5 ||
                  errorCode==6 ||
                  errorCode==64 ||
                  errorCode==65 ||
                  errorCode==132 ||
                  errorCode==133 ||
                  errorCode==139)
                  break;
               else continue;
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PartialCloseAllOpenPositions(int intMaxSlippage, double PartialClose)
  {
   for(int tpos=OrdersTotal()-1; tpos>=0; tpos--)
     {
      if(OrderSelect(tpos,SELECT_BY_POS,MODE_TRADES)==true)
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC)
           {
            bool checkOrderClose=OrderClose(OrderTicket(),OrderLots()*PartialClose,OrderClosePrice(),intMaxSlippage,clrOrange);

            if(checkOrderClose==false)
              {
               int errorCode=GetLastError();

               if(errorCode==1 || 
                  errorCode==2 ||
                  errorCode==5 ||
                  errorCode==6 ||
                  errorCode==64 ||
                  errorCode==65 ||
                  errorCode==132 ||
                  errorCode==133 ||
                  errorCode==139)
                  break;
               else continue;
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+