//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2018, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
#include<Controls/Button.mqh>

CButton buyButton;
CButton sellButton;
CButton buyButton2;
CButton sellButton2;
CButton exitButton;
CButton exitSButton;

enum enum_slTpType {
   Fixed,
   AtrBased,
   None
};

extern int        magic          = 1234;            //Magic Number
extern double     Lots           = 0.01;            //Lot Size
extern enum_slTpType SLTP        = AtrBased;        // Type of SL/TP to use
extern double     Take_Profit    = 0;              //Take Profit in Points, AtrBased = nr of Atrs
extern double     Stop_Loss      = 0;              //Stop Loss in Points, AtrBased = nr of Atrs
extern int        AtrPeriod      = 18;             //Atr period to use in AtrBased SL/TP

extern int        BuyX           = 500;               // X
extern int        BuyY           = 0;                 // Y
extern int        BuyX1          = 590;               // Width

extern int        BuyX2           = 400;               //Buy Button Height Start
extern int        BuyY2           = 90;             //Buy Button Width Start
extern int        BuyX12          = 200;               //Buy Button Height Finish

extern int        SellX           = 600;              //Sell Button Height Start
extern int        SellY           = 0;            //Sell Button Width Start
extern int        SellX1          = 690;              //Sell Button Height Finish

extern int        SellX2           = 600;              //Sell Button Height Start
extern int        SellY2           = 90;            //Sell Button Width Start
extern int        SellX12          = 690;              //Sell Button Height Finish

extern int        ExitX           = 700;              //Close Long Button Height Start
extern int        ExitY           = 0;
extern int        ExitX1          = 790;

extern int        ExitSX           = 800;              //Close Short Button Height Start
extern int        ExitSY           = 0;
extern int        ExitSX1          = 890;

double ticket1, ticket2;

int P = 1;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit() {
   if(Digits == 5 || Digits == 3 || Digits == 1)
      P = 10;
   else
      P = 1; // To account for 5 digit brokers

   buyButton.Create(0,"buyButton", 0, BuyX, BuyY, BuyX1,25);
   buyButton.Text("Buy");
   buyButton.FontSize(12);
   buyButton.Color(clrWhite);
   buyButton.ColorBackground(clrGreen);
// X1,  Y1,  X2, Y2
   buyButton2.Create(0,"buyButton2", 0, 500, 35, 590, 70);
   buyButton2.Text("B: SL+TP");
   buyButton2.FontSize(12);
   buyButton2.Color(clrWhite);
   buyButton2.ColorBackground(clrGreen);

   sellButton.Create(0,"sellButton", 0, SellX,SellY,SellX1,25);
   sellButton.Text("Sell");
   sellButton.FontSize(12);
   sellButton.Color(clrWhite);
   sellButton.ColorBackground(clrRed);

   sellButton2.Create(0,"sellButton2", 0, SellX2,35,SellX12,70);
   sellButton2.Text("S: SL+TP");
   sellButton2.FontSize(12);
   sellButton2.Color(clrWhite);
   sellButton2.ColorBackground(clrRed);

   sellButton.Create(0,"exitButton", 0, ExitX,ExitY,ExitX1,25);
   sellButton.Text("Exit L");
   sellButton.FontSize(12);
   sellButton.Color(clrWhite);
   sellButton.ColorBackground(clrDodgerBlue);

   sellButton.Create(0,"exitSButton", 0, ExitSX,ExitSY,ExitSX1,25);
   sellButton.Text("Exit S");
   sellButton.FontSize(12);
   sellButton.Color(clrWhite);
   sellButton.ColorBackground(clrDodgerBlue);

   return(0);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason) {
//---
   ObjectDelete(0, "exitSButton");
   ObjectDelete(0, "exitButton");
   ObjectDelete(0, "buyButton");
   ObjectDelete(0, "sellButton");
   ObjectDelete(0, "buyButton2");
   ObjectDelete(0, "sellButton2");
}
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick() {
//---
   if(IsVisualMode()) {
      long   lparam = 0;
      double dparam = 0.0;
      string sparam = "";
      //---
      sparam = "exitSButton";
      if(bool(ObjectGetInteger(0, sparam, OBJPROP_STATE)))
         OnChartEvent(CHARTEVENT_OBJECT_CLICK, lparam, dparam, sparam);
      //---
      sparam = "exitButton";
      if(bool(ObjectGetInteger(0, sparam, OBJPROP_STATE)))
         OnChartEvent(CHARTEVENT_OBJECT_CLICK, lparam, dparam, sparam);
      //---
      sparam = "buyButton";
      if(bool(ObjectGetInteger(0, sparam, OBJPROP_STATE)))
         OnChartEvent(CHARTEVENT_OBJECT_CLICK, lparam, dparam, sparam);
      //---
      sparam = "buyButton2";
      if(bool(ObjectGetInteger(0, sparam, OBJPROP_STATE)))
         OnChartEvent(CHARTEVENT_OBJECT_CLICK, lparam, dparam, sparam);
      //---
      sparam = "sellButton";
      if(bool(ObjectGetInteger(0, sparam, OBJPROP_STATE)))
         OnChartEvent(CHARTEVENT_OBJECT_CLICK, lparam, dparam, sparam);
      //---
      sparam = "sellButton2";
      if(bool(ObjectGetInteger(0, sparam, OBJPROP_STATE)))
         OnChartEvent(CHARTEVENT_OBJECT_CLICK, lparam, dparam, sparam);
   }
//   } //-- end for loop
}


//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam) {
//   Print("Clicked on "+ sparam);

   if(id==CHARTEVENT_OBJECT_CLICK && sparam=="buyButton") { // && ticket1==0 && ticket2==0)
      //Print("Clicked on "+ sparam);
      ticket1 = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,0,Bid + (Take_Profit*Point*P),NULL,magic,0,clrBlue);
      if(ticket1<=0)
         Print("did not place buy orderticket="+IntegerToString(ticket1));

      ObjectSet("buyButton", OBJPROP_STATE, 0);
      buyButton.Pressed(false);
      ChartRedraw(0);
   } else if(id==CHARTEVENT_OBJECT_CLICK && sparam=="sellButton") { // && ticket1==0 && ticket2==0)
      //Print("Clicked on "+ sparam);
      ticket2 = OrderSend(Symbol(),OP_SELL,Lots,Bid,3,0,Ask-(Take_Profit*Point*P),NULL,magic,0,clrRed);
      if(ticket2<=0)
         Print("did not place sell order ticket="+IntegerToString(ticket2));

      ObjectSet("sellButton", OBJPROP_STATE, 0);
      sellButton.Pressed(false);
      ChartRedraw(0);
   } else if(id==CHARTEVENT_OBJECT_CLICK && sparam=="buyButton2") { // && ticket1==0 && ticket2==0)
      //Print("Clicked on "+ sparam);
      ticket1 = OrderSend(Symbol(),OP_BUY,Lots,Ask,3,getSL(1),getTP(1),NULL,magic,0,clrBlue);
      if(ticket1<=0)
         Print("did not place buy orderticket="+IntegerToString(ticket1));

      ObjectSet("buyButton2", OBJPROP_STATE, 0);
      buyButton2.Pressed(false);
      ChartRedraw(0);
   } else if(id==CHARTEVENT_OBJECT_CLICK && sparam=="sellButton2") { // && ticket1==0 && ticket2==0)
      //Print("Clicked on "+ sparam);
      ticket2 = OrderSend(Symbol(),OP_SELL,Lots,Bid,3,getSL(-1), getTP(-1),NULL,magic,0,clrRed);
      if(ticket2<=0)
         Print("did not place sell order ticket="+IntegerToString(ticket2));

      ObjectSet("sellButton2", OBJPROP_STATE, 0);
      sellButton2.Pressed(false);
      ChartRedraw(0);
   } else if(id==CHARTEVENT_OBJECT_CLICK && sparam=="exitButton") {
      //    Print("Exit Long Button pressed");

      long order = 0;
      if(OrderSelect(0, SELECT_BY_POS)) {
         order=OrderTicket();
      } else {
         Print("OrderSelect failed error code is",GetLastError());
      }

      if(order>0) {
         Close_All_Buy_Trades();
         order=0;
      }

      ObjectSet("exitButton", OBJPROP_STATE, 0);
      exitButton.Pressed(false);
      ChartRedraw(0);
   } else if(id==CHARTEVENT_OBJECT_CLICK && sparam=="exitSButton") {
      //    Print("Exit Short Button pressed");

      order = 0;
      if(OrderSelect(0, SELECT_BY_POS)) {
         order=OrderTicket();
      } else {
         Print("OrderSelect failed error code is",GetLastError());
      }

      if(order>0) {
         Close_All_Sell_Trades();
         order=0;
      }

      ObjectSet("exitSButton", OBJPROP_STATE, 0);
      exitSButton.Pressed(false);
      ChartRedraw(0);
   }

}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Close_All_Buy_Trades() {
   for(int i = OrdersTotal() - 1; i >= 0; i--) {
      bool hasLongOrder = OrderSelect(i, SELECT_BY_POS);
      if(hasLongOrder && OrderType() == OP_BUY) {
         bool hasClosed = OrderClose(OrderTicket(), OrderLots(), Bid, 3);
      }
   }
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Close_All_Sell_Trades() {
   for(int i = OrdersTotal() - 1; i >= 0; i--) {
      bool hasShortOrder = OrderSelect(i, SELECT_BY_POS);
      if(hasShortOrder && OrderType() == OP_SELL) {
         bool hasClosed = OrderClose(OrderTicket(), OrderLots(), Ask, 3);
      }
   }
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double getSL(int longShort) {
   double sl;

   switch (SLTP) {
      case AtrBased: {
         // Calc SL & TP based on the atr
         double atr = iATR(_Symbol, PERIOD_CURRENT, AtrPeriod, 0);
         sl = longShort>0? Bid-Stop_Loss*atr: Ask+Stop_Loss*atr;
         break;
      }
      case Fixed: {
         double points = Stop_Loss/_Point;
         sl = longShort>0? Bid-points: Ask+points;
         break;
      }
   }

   return(NormalizeDouble(sl, _Digits));
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double getTP(int longShort) {
   double tp;

   switch (SLTP) {
      case AtrBased: {
         // Calc TP based on the atr
         double atr = iATR(_Symbol, PERIOD_CURRENT, AtrPeriod, 0);
         tp = longShort>0? Bid+Take_Profit*atr: Ask-Take_Profit*atr;
         break;
      }
      case Fixed: {
         double points = Take_Profit/_Point;
         tp = longShort>0? Bid+points: Ask-points;
         break;
      }
   }

   return(NormalizeDouble(tp, _Digits));
}
//+------------------------------------------------------------------+
