#property copyright "Copyright ?2008, lee.yan.au@gmail.com"
#property link      "lee.yan.au@gmail.com"

#include <WinUser32.mqh>

extern string EAName = "EquityGuard-V1.1";
extern bool MonitorEquity = TRUE;
extern string ss0 = "Maximal Target Sets:";
extern bool MaximalTargetON = TRUE;
extern double MaximalTarget = 4960.0;
extern bool CloseAllActiveOrders1 = TRUE;
extern bool DeleteAllPendingOrders1 = TRUE;
extern bool DisableAllEAs1 = TRUE;
extern string ss1 = "Minimal Target Sets:";
extern bool MinimalTargetON = TRUE;
extern double MinimalTarget = 4940.0;
extern bool CloseAllActiveOrders2 = TRUE;
extern bool DeleteAllPendingOrders2 = TRUE;
extern bool DisableAllEAs2 = TRUE;
extern string ss2 = "Percent Drawdown Sets:";
extern bool PercentDrawdownON = TRUE;
extern double PercentDrawdown = 15.0;
extern bool CloseAllActiveOrders3 = TRUE;
extern bool DeleteAllPendingOrders3 = TRUE;
extern bool DisableAllEAs3 = TRUE;
extern string ss3 = "Alert Sets:";
extern bool SoundON = TRUE;
extern string SoundFile = "alert.wav";
extern bool SendEmailON = FALSE;
extern color TxtColor = DarkOrange;
extern string ProgrammingService = "www.ea-programming.com";
int g_slippage_220 = 3;
int gi_224 = 5;
int gi_228 = 1000;
bool gi_232 = TRUE;
double gd_240;
bool gi_248 = FALSE;

int init() {
   gi_232 = TRUE;
   if (MonitorEquity) gd_240 = AccountEquity();
   else gd_240 = AccountBalance();
   if (MaximalTarget < gd_240) {
      gi_232 = FALSE;
      CreatLabel("eg3", "Wrong Parameter for MaximalTarget ! ", 0, 5, 35, TxtColor);
      return (0);
   }
   if (MinimalTarget > gd_240) {
      gi_232 = FALSE;
      CreatLabel("eg4", "Wrong Parameter for MinimalTarget ! ", 0, 5, 50, TxtColor);
      return (0);
   }
   if (!IsDllsAllowed()) {
      gi_232 = FALSE;
      CreatLabel("eg5", "DLL is not allowed ! ", 0, 5, 65, TxtColor);
      return (0);
   }
   if (!IsTradeAllowed()) {
      gi_232 = FALSE;
      CreatLabel("eg6", "Trade is not allowed ! ", 0, 5, 80, TxtColor);
      return (0);
   }
   GlobalVariableSet("HighestEquity", gd_240);
   gi_248 = FALSE;
   Print("iiiiiiiiiiiiiiiii" + Period());
   start();
   return (0);
}

int deinit() {
   DelAllTxts();
   return (0);
}

void DelAllTxts() {
   ObjectDelete("logo1");
   ObjectDelete("logo2");
   ObjectDelete("eg1");
   ObjectDelete("eg2");
   ObjectDelete("eg3");
   ObjectDelete("eg4");
   ObjectDelete("eg5");
   ObjectDelete("eg6");
   GlobalVariableDel("HighestEquity");
   ObjectsRedraw();
}

void ShowEAStatus() {
   string ls_0;
   string ls_8;
   string ls_16;
   string ls_24;
   string ls_unused_32;
   if (MonitorEquity) gd_240 = AccountEquity();
   else gd_240 = AccountBalance();
   CreatLabel("eg1", " " + EAName, 0, 5, 15, TxtColor);
   CreatLabel("eg2", "-------------------------------", 0, 5, 22, TxtColor);
   double ld_40 = GlobalVariableGet("HighestEquity") * (1 - PercentDrawdown / 100.0);
   if (MonitorEquity) ls_0 = "Current Equity:" + DoubleToStr(gd_240, 2) + "              Highest Equity:" + DoubleToStr(GlobalVariableGet("HighestEquity"), 2);
   else ls_0 = "Current Balance:" + DoubleToStr(gd_240, 2) + "          Highest Balance:" + DoubleToStr(GlobalVariableGet("HighestEquity"), 2);
   CreatLabel("eg3", ls_0, 0, 5, 35, TxtColor);
   if (MaximalTargetON) ls_8 = DoubleToStr(MaximalTarget, 2) + "       Distance:" + DoubleToStr(MaximalTarget - gd_240, 2);
   else ls_8 = "OFF";
   CreatLabel("eg4", "Maximal TargetON: " + ls_8, 0, 5, 50, TxtColor);
   if (MinimalTargetON) ls_16 = DoubleToStr(MinimalTarget, 2) + "        Distance:" + DoubleToStr(gd_240 - MinimalTarget, 2);
   else ls_16 = "OFF";
   CreatLabel("eg5", "Minimal TargetON: " + ls_16, 0, 5, 65, TxtColor);
   if (PercentDrawdownON) ls_24 = DoubleToStr(PercentDrawdown, 2) + "%(" + DoubleToStr(ld_40, 2) + ")" + "    Distance:" + DoubleToStr(MathAbs(ld_40 - gd_240), 2);
   else ls_24 = "OFF";
   CreatLabel("eg6", "Percent Drawdown: " + ls_24, 0, 5, 80, TxtColor);
   ObjectsRedraw();
}

int start() {
   if (gi_232 == FALSE) return (0);
   while (!IsStopped()) {
      ShowLogo();
      if (gi_248 == TRUE) {
         DisableEA();
         return (0);
      }
      RefreshRates();
      if (gd_240 > GlobalVariableGet("HighestEquity")) GlobalVariableSet("HighestEquity", gd_240);
      if (MonitorEquity) gd_240 = AccountEquity();
      else gd_240 = AccountBalance();
      ShowEAStatus();
      if (MaximalTargetON && gd_240 >= MaximalTarget) {
         if (SoundON) PlaySound(SoundFile);
         if (CloseAllActiveOrders1) CloseAllActiveOrders();
         if (DeleteAllPendingOrders1) DelAllPendingOrders();
         if (IsExpertEnabled() == TRUE && DisableAllEAs1 == TRUE) {
            gi_248 = TRUE;
            DelAllTxts();
         }
         if (SendEmailON) SendMail("EquityGuard:Reach to Maximal Target " + gd_240, "");
      }
      if (MinimalTargetON && gd_240 <= MinimalTarget) {
         if (SoundON) PlaySound(SoundFile);
         if (CloseAllActiveOrders2) CloseAllActiveOrders();
         if (DeleteAllPendingOrders2) DelAllPendingOrders();
         if (IsExpertEnabled() == TRUE && DisableAllEAs2 == TRUE) {
            gi_248 = TRUE;
            DelAllTxts();
         }
         if (SendEmailON) SendMail("EquityGuard:Reach to Minimal Target " + gd_240, "");
      }
      if (PercentDrawdownON && gd_240 <= GlobalVariableGet("HighestEquity") * (1 - PercentDrawdown / 100.0)) {
         GlobalVariableSet("HighestEquity", 0);
         if (SoundON) PlaySound(SoundFile);
         if (CloseAllActiveOrders3) CloseAllActiveOrders();
         if (DeleteAllPendingOrders3) DelAllPendingOrders();
         if (IsExpertEnabled() == TRUE && DisableAllEAs3 == TRUE) {
            gi_248 = TRUE;
            DelAllTxts();
         }
         if (SendEmailON) SendMail("EquityGuard:Reach to Percent Drawdown " + gd_240, "");
      }
      Sleep(500);
   }
   return (0);
}

void DisableEA() {
   keybd_event(17, 0, 0, 0);
   keybd_event(69, 0, 0, 0);
   keybd_event(69, 0, 2, 0);
   keybd_event(17, 0, 2, 0);
}

void DelAllPendingOrders() {
   while (AllPendingOrders() > 0) {
      for (int l_pos_0 = 0; l_pos_0 < OrdersTotal(); l_pos_0++) {
         if (OrderSelect(l_pos_0, SELECT_BY_POS, MODE_TRADES) == TRUE)
            if (OrderType() > OP_SELL) DelPendingOrder(OrderTicket());
      }
   }
}

int DelPendingOrder(int a_ticket_0) {
   bool l_ord_delete_4 = FALSE;
   int l_count_8 = 0;
   while (l_count_8 < gi_224) {
      l_ord_delete_4 = OrderDelete(a_ticket_0);
      if (l_ord_delete_4 == 1) return (1);
      if (GetLastError() > 0/* NO_ERROR */) l_count_8++;
      if (l_count_8 < gi_224) Sleep(gi_228);
   }
   return (0);
}

int CloseAllActiveOrders() {
   while (AllActiveOrders() > 0) {
      for (int l_pos_0 = 0; l_pos_0 < OrdersTotal(); l_pos_0++) {
         if (OrderSelect(l_pos_0, SELECT_BY_POS, MODE_TRADES) == TRUE)
            if (OrderType() == OP_BUY || OrderType() == OP_SELL) CloseOrder(OrderTicket(), OrderLots());
      }
   }
   return (0);
}

int AllActiveOrders() {
   int l_count_0 = 0;
   for (int l_pos_4 = 0; l_pos_4 < OrdersTotal(); l_pos_4++) {
      OrderSelect(l_pos_4, SELECT_BY_POS, MODE_TRADES);
      if (OrderType() == OP_BUY || OrderType() == OP_SELL) l_count_0++;
   }
   return (l_count_0);
}

int AllPendingOrders() {
   int l_count_0 = 0;
   for (int l_pos_4 = 0; l_pos_4 < OrdersTotal(); l_pos_4++) {
      OrderSelect(l_pos_4, SELECT_BY_POS, MODE_TRADES);
      if (OrderType() > OP_SELL) l_count_0++;
   }
   return (l_count_0);
}

int CloseOrder(int a_ticket_0, double a_lots_4) {
   double l_price_24;
   int li_unused_12 = 0;
   bool l_ord_close_16 = FALSE;
   int l_count_20 = 0;
   if (OrderSelect(a_ticket_0, SELECT_BY_TICKET, MODE_TRADES) == TRUE) {
      while (l_count_20 < gi_224) {
         RefreshRates();
         if (OrderType() == OP_BUY) l_price_24 = MarketInfo(OrderSymbol(), MODE_BID);
         if (OrderType() == OP_SELL) l_price_24 = MarketInfo(OrderSymbol(), MODE_ASK);
         if (MarketInfo(OrderSymbol(), MODE_DIGITS) > 0.0) l_price_24 = NormalizeDouble(l_price_24, MarketInfo(OrderSymbol(), MODE_DIGITS));
         l_ord_close_16 = OrderClose(a_ticket_0, a_lots_4, l_price_24, g_slippage_220, Violet);
         if (l_ord_close_16 == 1) return (1);
         if (GetLastError() > 0/* NO_ERROR */) l_count_20++;
         if (l_count_20 < gi_224) Sleep(gi_228);
      }
   }
   return (0);
}

void CreatLabel(string a_name_0, string a_text_8, int a_corner_16, double a_x_20, double a_y_28, color a_color_36) {
   ObjectDelete(a_name_0);
   ObjectCreate(a_name_0, OBJ_LABEL, 0, 0, 0);
   ObjectSet(a_name_0, OBJPROP_CORNER, a_corner_16);
   ObjectSet(a_name_0, OBJPROP_XDISTANCE, a_x_20);
   ObjectSet(a_name_0, OBJPROP_YDISTANCE, a_y_28);
   ObjectSetText(a_name_0, a_text_8, 10, "Arial Bold", a_color_36);
}

void ShowLogo() {
   CreatLabel("logo1", "Website: www.ea-programming.com", 2, 5, 20, TxtColor);
   CreatLabel("logo2", "E-Mail :   lee.yan.au@gmail.com    SKYPE: lee_yan_cn", 2, 5, 5, TxtColor);
}