#include <stdlib.mqh>

#define MAGIC_NUMBER 69000

#property copyright  "ea.coder@yahoo.com"
#property link       "ea.coder@yahoo.com"
#define EMAIL        "ea.coder@yahoo.com"
#define APP_NAME     "MartingaleEA"
#define APP_VERSION  "1.0"

extern int BreakEvenPips = 50;
extern int TrailingStopPips = 50;
extern int TakeProfitPips = 100;
extern int StopLossPips = 100;
extern double FloatingTakeProfitUSD = 10;
extern double FixedLotSize = 0.01;
extern int Slippage = 5;
extern bool I_Use_5_Digit_Broker = false;
extern string StartAt = "06:00";
extern int TradeForXMinutes = 480;
extern bool TradeOn_Monday = true;
extern bool TradeOn_Tuesday = true;
extern bool TradeOn_Wednesday = true;
extern bool TradeOn_Thursday = true;
extern bool TradeOn_Friday = true;
extern double MartingaleMultiplier = 2.0;
extern int XPips = 40;
//extern bool SoundAlerts = true;
//extern bool WaitForCandleToClose = true;
/*
extern string s0 = "---- Money Management ----";
extern double OpenLots = 0.01;
extern int forEveryUSDAmount = 1000;
*/
extern string s1 = "---- ADX settings ----";
extern int ADX_Period = 14;
extern int ADX_Applied_Price = 0;
extern double ADX_Strength = 20;
extern double ADX_DIPLUS_Strength = 10;
extern double ADX_DIMINUS_Strength = 10;
extern string s2 = "---- Applied Price ----";
extern string s3 = "0 = Close";
extern string s4 = "1 = Open";
extern string s5 = "2 = High";
extern string s6 = "3 = Low";

datetime last_candle_check = 1;
int LastTradeType = -1;
int LastTradeTicket = 0;
double LastTradeProfit = 0;
double LastTradeLotSize = 0.00;
int history_trade_count = 0;
int history_trade_count_this_pair = 0;
double Lots = 0.1;
bool ADX_Cross_Up = false;
bool ADX_Cross_Down = false;
bool ThisCrossHadTrade = false;
bool ThisLossHaveTrade = false;
double floatingPL = 0;
bool TookFloatingProfit = false;
bool TradingSession = false;

void init() {
   if (I_Use_5_Digit_Broker) {
      BreakEvenPips = BreakEvenPips * 10;
      TrailingStopPips = TrailingStopPips * 10;
      StopLossPips = StopLossPips * 10;
      TakeProfitPips = TakeProfitPips * 10;
   }

   last_candle_check = Time[0];
   history_trade_count = OrdersHistoryTotal();

   Lots = FixedLotSize;
   if (MarketInfo(Symbol(), MODE_LOTSTEP) == 0.1) Lots = NormalizeDouble(Lots, 1);

   datetime dt_StartAt = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+StartAt);
   datetime dt_StopAt  =  StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+StartAt)+(TradeForXMinutes*60);
//   Print(TimeToStr(dt_StartAt) + " : " + TimeToStr(dt_StopAt) + " : " + TimeToStr(TimeCurrent()) );
   if ( (dt_StartAt < TimeCurrent()) && (dt_StopAt > TimeCurrent()) ) {
      if (!TradingSession) {
         ADX_Cross_Up = false;
         ADX_Cross_Down = false;
         ThisCrossHadTrade = false;
      }
      TradingSession = true;
   } else {
      TradingSession = false;
   }

   return(0);
}

void deinit() {
   Comment("");
   return(0);
}

bool isTradeRunning(int TradeTypeInt) {
   bool res = false;

   for(int i = 0; i < OrdersTotal(); i++) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
      if(OrderSymbol() != Symbol() ) continue;
      if(OrderMagicNumber() != MAGIC_NUMBER) continue;
      if(OrderType() != TradeTypeInt) continue;
      res = true;
   }
   return(res);
}

bool isTradeRunningByComment(string comments) {
   bool res = false;

   for(int i = 0; i < OrdersTotal(); i++) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
      if(OrderSymbol() != Symbol() ) continue;
      if(OrderMagicNumber() != MAGIC_NUMBER) continue;
      if(OrderComment() != comments) continue;
      res = true;
   }
   return(res);
}

void CreateText(string Obj, string LabelCaption, color LabelColor, datetime datetime1, double Price) {
   if (ObjectFind(Obj) >= 0) ObjectDelete(Obj);
   ObjectCreate(Obj, OBJ_TEXT, 0, datetime1, Price);
   ObjectSetText(Obj, LabelCaption, 10, "Arial Bold", LabelColor);
}

bool OpenOrder(int cmd, double LotSize, double Slippage, double StopLoss, double TakeProfit, string Comments, int magic, color ArrowColor = CLR_NONE) {
   bool bool_res = false;
   double Price;
   int ticket;
   int j = 0;
   double TextPrice;

   RefreshRates();

   if (cmd == OP_SELL) Price = MarketInfo(Symbol(),MODE_BID); else if (cmd == OP_BUY) Price = MarketInfo(Symbol(),MODE_ASK);
   ticket = OrderSend(Symbol(), cmd, LotSize, Price, Slippage, 0, 0, Comments, magic, 0, ArrowColor);
   if (ticket <= 0) Print("OrderSend error: "+ErrorDescription(GetLastError()) + "; Price: " + Price + "; LotSize: "+LotSize);
   while ( (ticket <= 0) && (j < 4) ) {
      Sleep(500);
      j = j + 1;
      Print("OrderSend try number " + j);
      if (cmd == OP_SELL) Price = MarketInfo(Symbol(),MODE_BID); else if (cmd == OP_BUY) Price = MarketInfo(Symbol(),MODE_ASK);
      ticket = OrderSend(Symbol(), cmd, LotSize, Price, Slippage, 0, 0, Comments, magic, 0, ArrowColor);
      if (ticket <= 0) Print("OrderSend error: "+ErrorDescription(GetLastError()) + "; Price: " + Price + "; LotSize: "+LotSize);
   }

   if (IsTesting() && (ticket > 0) ) {
      TextPrice = MarketInfo(Symbol(),MODE_BID) + (20*Point);
      CreateText("EA_Text_"+ticket, ticket, Red, Time[0], TextPrice);
   }

   if ( (StopLoss > 0) || (TakeProfit > 0) )
   if (ticket > 0) {
      if (OrderSelect(ticket, SELECT_BY_TICKET) == true) {
         if (cmd == OP_BUY) {
            if (StopLoss > 0) StopLoss = (OrderOpenPrice()-StopLoss*Point);
            if (TakeProfit > 0) TakeProfit = (OrderOpenPrice()+TakeProfit*Point);
         } else {
            if (StopLoss > 0) StopLoss = (OrderOpenPrice()+StopLoss*Point);
            if (TakeProfit > 0) TakeProfit = (OrderOpenPrice()-TakeProfit*Point);
         }
         j = 0;
         while ( (OrderModify(OrderTicket(), OrderOpenPrice(), StopLoss, TakeProfit, 0, Blue) < 1) && (j < 4) ) {
            Print("OrderModify error: "+ErrorDescription(GetLastError())+"; OrderTicket: "+OrderTicket()+"; OrderOpenPrice: "+OrderOpenPrice()+"; StopLoss: "+StopLoss+"; TakeProfit: "+TakeProfit);
            Sleep(500);
            j = j + 1;
            Print("OrderModify try number " + j);
         } //while
      }
      bool_res = true;
   } else bool_res = false;
   return(bool_res);
}

void TrailingStop() {
   double PriceDiff, OSL, StopLoss;
   for(int i = 0; i < OrdersTotal(); i++) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
      if(OrderSymbol() != Symbol()) continue;
      if(OrderMagicNumber() != MAGIC_NUMBER) continue;
      if(OrderStopLoss() == 0) OSL = OrderOpenPrice(); else OSL = OrderStopLoss();

      if(OrderType() == OP_BUY) {
         if(MarketInfo(Symbol(), MODE_BID) - OrderOpenPrice() > Point*TrailingStopPips) {
            if(OSL + Point*1 < MarketInfo(Symbol(), MODE_BID) - Point*TrailingStopPips) {
               OrderModify(OrderTicket(), OrderOpenPrice(), (MarketInfo(Symbol(), MODE_BID) - Point*TrailingStopPips), OrderTakeProfit(), 0, Blue);
               return(0);
            }
         }
      }
      if(OrderType() == OP_SELL) {
         if(OrderOpenPrice() - MarketInfo(Symbol(), MODE_ASK) > Point*TrailingStopPips) {
            if(OSL - Point*1 > MarketInfo(Symbol(), MODE_ASK) + Point*TrailingStopPips) {
               OrderModify(OrderTicket(), OrderOpenPrice(), (MarketInfo(Symbol(), MODE_ASK) + Point*TrailingStopPips), OrderTakeProfit(), 0, Blue);
               return(0);
            }
         }
      }
   }
}

void SetBE() {
   for(int i = 0; i < OrdersTotal(); i++) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
      if(OrderSymbol() != Symbol()) continue;
      if(OrderMagicNumber() != MAGIC_NUMBER) continue;
      if(OrderType() == OP_BUY) {
         if ( (OrderStopLoss() < OrderOpenPrice()) && ((Ask - OrderOpenPrice()) >= BreakEvenPips*Point) )
               OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()+(1*Point),OrderTakeProfit(),0,CLR_NONE);
      }
      if(OrderType()==OP_SELL) {
            if ( (OrderStopLoss() > OrderOpenPrice()) && ((OrderOpenPrice() - Bid) >= BreakEvenPips*Point) )
               OrderModify(OrderTicket(),OrderOpenPrice(),OrderOpenPrice()-(1*Point),OrderTakeProfit(),0,CLR_NONE);
      }
   }
}

bool IsADXCrossUp(int i) {
   double adx_plus1 = iADX(NULL, 0, ADX_Period, ADX_Applied_Price, MODE_PLUSDI, i);
   double adx_minus1 = iADX(NULL, 0, ADX_Period, ADX_Applied_Price, MODE_MINUSDI, i);
   double adx_plus2 = iADX(NULL, 0, ADX_Period, ADX_Applied_Price, MODE_PLUSDI, i+1);
   double adx_minus2 = iADX(NULL, 0, ADX_Period, ADX_Applied_Price, MODE_MINUSDI, i+1);
   return( (adx_plus1 > adx_minus1) && (adx_plus2 < adx_minus2) );
}

bool IsADXCrossDown(int i) {
   double adx_plus1 = iADX(NULL, 0, ADX_Period, ADX_Applied_Price, MODE_PLUSDI, i);
   double adx_minus1 = iADX(NULL, 0, ADX_Period, ADX_Applied_Price, MODE_MINUSDI, i);
   double adx_plus2 = iADX(NULL, 0, ADX_Period, ADX_Applied_Price, MODE_PLUSDI, i+1);
   double adx_minus2 = iADX(NULL, 0, ADX_Period, ADX_Applied_Price, MODE_MINUSDI, i+1);
   return( (adx_plus1 < adx_minus1) && (adx_plus2 > adx_minus2) );
}

/*
bool IsADXUp(int i) {
   double adx_plus = iADX(NULL, 0, ADX_Period, ADX_Applied_Price, MODE_PLUSDI, i);
   double adx_minus = iADX(NULL, 0, ADX_Period, ADX_Applied_Price, MODE_MINUSDI, i);
   double adx_main = iADX(NULL, 0, ADX_Period, ADX_Applied_Price, MODE_MAIN, i);
   return( (adx_plus > adx_minus) && (adx_main >= ADX_Strength) );
}

bool IsADXDown(int i) {
   double adx_plus = iADX(NULL, 0, ADX_Period, ADX_Applied_Price, MODE_PLUSDI, i);
   double adx_minus = iADX(NULL, 0, ADX_Period, ADX_Applied_Price, MODE_MINUSDI, i);
   double adx_main = iADX(NULL, 0, ADX_Period, ADX_Applied_Price, MODE_MAIN, i);
   return( (adx_plus < adx_minus) && (adx_main >= ADX_Strength) );
}
*/

bool IsADXStrong(int i) {
   double adx_main = iADX(NULL, 0, ADX_Period, ADX_Applied_Price, MODE_MAIN, i);
   return(adx_main >= ADX_Strength);
}

bool IsADXPlusStrong(int i) {
   double adx = iADX(NULL, 0, ADX_Period, ADX_Applied_Price, MODE_PLUSDI, i);
   return(adx >= ADX_DIPLUS_Strength);
}

bool IsADXMinusStrong(int i) {
   double adx = iADX(NULL, 0, ADX_Period, ADX_Applied_Price, MODE_MINUSDI, i);
   return(adx >= ADX_DIMINUS_Strength);
}

/*
bool CloseOrders(int cmd) {
   bool res = false;
   double ClosePrice;
   for(int i = OrdersTotal()-1; i >= 0; i--) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
      if(OrderSymbol() != Symbol() ) continue;
      if(OrderMagicNumber() != MAGIC_NUMBER) continue;
      if(OrderType() != cmd) continue;
      if (cmd == OP_SELL) ClosePrice = MarketInfo(Symbol(),MODE_ASK); else if (cmd == OP_BUY) ClosePrice = MarketInfo(Symbol(),MODE_BID);
      if (OrderClose(OrderTicket(), OrderLots(), ClosePrice, 5, Yellow)) res = true;
   }
   return(res);
}
*/

bool CloseOrdersAll() {
   bool res = false;
   double ClosePrice;
   int j = 0;
   for(int i = OrdersTotal()-1; i >= 0; i--) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
      if(OrderSymbol() != Symbol() ) continue;
      if(OrderMagicNumber() != MAGIC_NUMBER) continue;
      if (j == 0) {
         LastTradeTicket = OrderTicket();
         LastTradeType = OrderType();
         LastTradeProfit = OrderProfit();
         LastTradeLotSize = OrderLots();
      }
      RefreshRates();
      if (OrderType() == OP_SELL) ClosePrice = MarketInfo(Symbol(),MODE_ASK); else if (OrderType() == OP_BUY) ClosePrice = MarketInfo(Symbol(),MODE_BID);
      if (OrderClose(OrderTicket(), OrderLots(), ClosePrice, 5, Yellow)) res = true;
      j = j + 1;
   }
   ThisCrossHadTrade = true;
   ThisLossHaveTrade = false;
   history_trade_count = OrdersHistoryTotal();
   Lots = FixedLotSize;
   if (MarketInfo(Symbol(), MODE_LOTSTEP) == 0.1) Lots = NormalizeDouble(Lots, 1);
   return(res);
}

int CountMyTrades() {
   int res = 0;
   for(int i = OrdersHistoryTotal()-1; i >= 0; i--) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == false) break;
      if(OrderSymbol() != Symbol() ) continue;
      if(OrderMagicNumber() != MAGIC_NUMBER) continue;
      res = res + 1;
   }
   return(res);
}

double floatingProfit() {
   double profit = 0;
   for(int i = OrdersTotal()-1; i >= 0; i--) {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
      if(OrderSymbol() != Symbol() ) continue;
      if(OrderMagicNumber() != MAGIC_NUMBER) continue;
      profit = profit + OrderProfit();
   }
   return(profit);
}

string TradeTypeStr(string t) {
   int t2 = StrToInteger(t);
   if (t2 == OP_SELL) return("SELL");
   else if (t2 == OP_SELLLIMIT) return("SELL LIMIT");
   else if (t2 == OP_SELLSTOP) return("SELL STOP");
   else if (t2 == OP_BUY) return("BUY");
   else if (t2 == OP_BUYLIMIT) return("BUY LIMIT");
   else if (t2 == OP_BUYSTOP) return("BUY STOP");
   else return("UNKNOWN");
}

void monitorTradeHistory() {
//   string mailBody;

   LastTradeTicket = 0;
   LastTradeType = -1;
   LastTradeProfit = 0;
   LastTradeLotSize = 0.00;

   Print("Looking for new closed trades. Total closed trades: "+history_trade_count_this_pair+"/"+history_trade_count);

   for(int i = OrdersHistoryTotal()-1; i >= 0; i--) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == false) break;
      if (OrderSymbol() != Symbol() ) continue;
      if (OrderMagicNumber() != MAGIC_NUMBER) continue;
         if (LastTradeTicket <= 0) {
            LastTradeTicket = OrderTicket();
            LastTradeType = OrderType();
            LastTradeProfit = OrderProfit();
            LastTradeLotSize = OrderLots();
            ThisLossHaveTrade = false;
            ThisCrossHadTrade = true;
            if (LastTradeProfit < 0) Lots = getNextLotSize(LastTradeLotSize);
               else {
                  Lots = FixedLotSize;
                  if (MarketInfo(Symbol(), MODE_LOTSTEP) == 0.1) Lots = NormalizeDouble(Lots, 1);
               }
         }
   }
}

double getNextLotSize(double cLots) {
   cLots = NormalizeDouble(cLots * MartingaleMultiplier, 2);
   if (MarketInfo(Symbol(), MODE_LOTSTEP) == 0.1) cLots = NormalizeDouble(cLots, 1);
   return(cLots);
}

void runningTradesMartingale() {
   int RunningTradeProfitPips = 0;
   color ArrowColor;

   for(int i = OrdersTotal()-1; i >= 0; i--) {
      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;
      if (OrderSymbol() != Symbol() ) continue;
      if (OrderMagicNumber() != MAGIC_NUMBER) continue;
//      if (OrderComment() != "") continue;
         if (OrderType() == OP_BUY) RunningTradeProfitPips = ((MarketInfo(Symbol(), MODE_BID) - OrderOpenPrice())/Point);
            else if (OrderType() == OP_SELL) RunningTradeProfitPips = ((OrderOpenPrice() - MarketInfo(Symbol(), MODE_ASK))/Point);
         if ( (-1*RunningTradeProfitPips == XPips) || ( ((-1*RunningTradeProfitPips) > XPips) && ((-1*RunningTradeProfitPips)-XPips < 5) ) ) {
            if (!isTradeRunningByComment(OrderTicket())) {
               Lots = getNextLotSize(OrderLots());
               Print("Executing buy order with martingale");
               if (OrderType() == OP_BUY) ArrowColor = RoyalBlue; else if (OrderType() == OP_SELL) ArrowColor = Pink;
               OpenOrder(OrderType(), Lots, Slippage, StopLossPips, TakeProfitPips, OrderTicket(), MAGIC_NUMBER, ArrowColor);
               ThisCrossHadTrade = true;
            }
         }
   }
}

string getComments() {
   string s = APP_NAME+" v"+APP_VERSION+"\n\n";
   s = s + "Lots to trade: "+DoubleToStr(Lots, 2)+"\n";
   s = s + "Spread: "+DoubleToStr(MarketInfo(Symbol(), MODE_SPREAD), 0)+"\n";
   s = s + "Floating P/L: "+DoubleToStr(floatingPL, 2)+" "+AccountCurrency()+"\n";
   s = s + "Martingale Multiplier: "+DoubleToStr(MartingaleMultiplier, 2)+"\n";
   if (LastTradeTicket > 0) {
      s = s + "Last trade #"+LastTradeTicket+" "+TradeTypeStr(LastTradeType);
      if (LastTradeProfit < 0) s = s + " (LOSS)\n"; else s = s + " (PROFIT)\n";
   }
//   s = s + "Next Lot Size: "+DoubleToStr(Lots, 2)+"\n";
   if ( StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+StartAt) > TimeCurrent() ) {
      s = s + "Trading only from "+StartAt+" until "+TimeToStr(StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+StartAt)+(TradeForXMinutes*60))+"\n";
   }
   if ( (DayOfWeek() == 1) && !TradeOn_Monday) s = s + "Do not trade on Mondays\n";
   if ( (DayOfWeek() == 2) && !TradeOn_Tuesday) s = s + "Do not trade on Tuesdays\n";
   if ( (DayOfWeek() == 3) && !TradeOn_Wednesday) s = s + "Do not trade on Wednesdays\n";
   if ( (DayOfWeek() == 4) && !TradeOn_Thursday) s = s + "Do not trade on Thursday\n";
   if ( (DayOfWeek() == 5) && !TradeOn_Friday) s = s + "Do not trade on Fridays\n";
   if (TradingSession) s = s + "Trading session: YES\n"; else s = s + "Trading session: NO\n";
   if (ADX_Cross_Up) s = s + "ADX crossed up\n"; else if (ADX_Cross_Down) s = s + "ADX crossed down\n";
   if (ThisCrossHadTrade) s = s + "Current ADX cross had/has a trade\n";
   return(s);
}

string checkHistory() {
   if (OrdersHistoryTotal() > history_trade_count) {
   history_trade_count = OrdersHistoryTotal();
   int c = CountMyTrades();
   if (c > history_trade_count_this_pair) {
      history_trade_count_this_pair = c;
      monitorTradeHistory();
   } //if (c > history_trade_count_this_pair)
   } //if (OrdersHistoryTotal() > history_trade_count)
}

void start() {
   int ticket, OrderType2 = -1;

   double StopLoss = 0, TakeProfit = 0;

   if (!IsTesting()) if (AccountNumber() == 5513803) Lots = 0.01;

   if (last_candle_check != Time[0]) {
      if (IsADXCrossUp(1)) {
         ADX_Cross_Up = true;
         ADX_Cross_Down = false;
         ThisCrossHadTrade = false;
      } else if (IsADXCrossDown(1)) {
         ADX_Cross_Up = false;
         ADX_Cross_Down = true;
         ThisCrossHadTrade = false;
      }
   }

   floatingPL = floatingProfit();

   checkHistory();
   Comment(getComments());

   if (BreakEvenPips > 0) SetBE();
   if (TrailingStopPips > 0) TrailingStop();

   if (FloatingTakeProfitUSD > 0) if (floatingPL >= FloatingTakeProfitUSD) { TookFloatingProfit = true; Print("floatingPL: "+DoubleToStr(floatingPL, 2)+"; "+TookFloatingProfit); CloseOrdersAll(); }

   runningTradesMartingale();

   if ( (DayOfWeek() == 1) && !TradeOn_Monday) { Print("Do not trade on Mondays"); TradingSession = false; return(0); }
   if ( (DayOfWeek() == 2) && !TradeOn_Tuesday) { Print("Do not trade on Tuesdays"); TradingSession = false; return(0); }
   if ( (DayOfWeek() == 3) && !TradeOn_Wednesday) { Print("Do not trade on Wednesdays"); TradingSession = false; return(0); }
   if ( (DayOfWeek() == 4) && !TradeOn_Thursday) { Print("Do not trade on Thursday"); TradingSession = false; return(0); }
   if ( (DayOfWeek() == 5) && !TradeOn_Friday) { Print("Do not trade on Fridays"); TradingSession = false; return(0); }

   datetime dt_StartAt = StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+StartAt);
   datetime dt_StopAt  =  StrToTime(TimeToStr(TimeCurrent(), TIME_DATE)+" "+StartAt)+(TradeForXMinutes*60);

   if ( (dt_StartAt < TimeCurrent()) && (dt_StopAt > TimeCurrent()) ) {
      if (!TradingSession) {
         ADX_Cross_Up = false;
         ADX_Cross_Down = false;
         ThisCrossHadTrade = false;
      }
      TradingSession = true;
   } else {
      TradingSession = false;
      return(0);
   }

   if (last_candle_check != Time[0]) {

   last_candle_check = Time[0];

//   Print("Checking for signals...");

   if (IsADXStrong(1) && IsADXPlusStrong(1) && ADX_Cross_Up && !ThisLossHaveTrade && !ThisCrossHadTrade) {
      if (!isTradeRunning(OP_BUY) && !isTradeRunning(OP_SELL)) {
         Print("Buy signal");
//         CloseOrders(OP_SELL);
         Print("Executing buy order");
         OpenOrder(OP_BUY, Lots, Slippage, StopLossPips, TakeProfitPips, "", MAGIC_NUMBER, Blue);
         ThisCrossHadTrade = true;
         TookFloatingProfit = false;
//         if (SoundAlerts) PlaySound("alert.wav");
         return(0);
      }// else Print("Buy trade already running");

   } else if (IsADXStrong(1) && IsADXMinusStrong(1) && ADX_Cross_Down && !ThisLossHaveTrade && !ThisCrossHadTrade) {
      if (!isTradeRunning(OP_BUY) && !isTradeRunning(OP_SELL)) {
         Print("Sell signal");
//         CloseOrders(OP_BUY);
         Print("Executing sell order");
         OpenOrder(OP_SELL, Lots, Slippage, StopLossPips, TakeProfitPips, "", MAGIC_NUMBER, Red);
         ThisCrossHadTrade = true;
         TookFloatingProfit = false;
//         if (SoundAlerts) PlaySound("alert.wav");
         return(0);
      }// else Print("Sell trade already running");

   }
   } else { //if (last_candle_check != Time[0])

   //Checking if EA needs to execute instant order after SL was hit
   if ( (!TookFloatingProfit) &&(!ThisLossHaveTrade) && (LastTradeTicket > 0) && (LastTradeProfit < 0) ) {
      if (LastTradeType == OP_BUY) {
      if (!isTradeRunning(OP_BUY)) {
         Print("Buy signal with martingale after SL");
//         CloseOrders(OP_SELL);
         Print("Executing buy order with martingale after SL");
         OpenOrder(OP_BUY, Lots, Slippage, StopLossPips, TakeProfitPips, "", MAGIC_NUMBER, Blue);
         ThisLossHaveTrade = true;
         ThisCrossHadTrade = true;
//         if (SoundAlerts) PlaySound("alert.wav");
         return(0);
      } //else Print("Buy trade already running");
      } else if (LastTradeType == OP_SELL) {
      if (!isTradeRunning(OP_SELL)) {
         Print("Sell signal with martingale after SL");
//         CloseOrders(OP_BUY);
         Print("Executing sell order with martingale after SL");
         OpenOrder(OP_SELL, Lots, Slippage, StopLossPips, TakeProfitPips, "", MAGIC_NUMBER, Red);
         ThisLossHaveTrade = true;
         ThisCrossHadTrade = true;
//         if (SoundAlerts) PlaySound("alert.wav");
         return(0);
      } //else Print("Sell trade already running");
      }
   }

   } //else if (last_candle_check != Time[0])

   Comment(getComments());

}

