Close All By High WaterMark Code

 

Hi There

I believe the supplied code in MT5 MQL5 is extremely useful as an EA to close all open orders when a certain percentile of the High Water Mark is breached. Please use this code at your leisure.

Simply configure the input variable: percentofHWMtrigger, as (percentofHWMtrigger >= 0.50) or (percentofHWMtrigger < 0.995) because any value within this range would be a reasonable setup.

This EA will prove to be useful for the following: Locking in elevated profits after a pre-defined deviation (fall) from High Water Mark. This removes the need for manual decision making to close trades.

//+------------------------------------------------------------------+
//|                                         CloseByHighWaterMark.mq5 |
//|                                  Copyright 2025, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"

#property strict
#include <Trade/Trade.mqh>

CPositionInfo m_position;
CTrade m_trade;
// HUD
input bool     HUD_Enable       = true;
input int      HUD_X            = 8;
input int      HUD_Y            = 24;
input int      HUD_W            = 260;
input int      HUD_H            = 64;



input double   percentofHWMtrigger = 0.95;
double         hwmvalue = 0.0;
int            closealreadyflag = 0;
double         eqt = 0.0;
double         bl = 0.0;
double         calculatedstop = 0.0;



//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////













void CloseAll()
{
      for(int i = PositionsTotal() - 1; i >= 0; i--) // loop all Open Positions
         if (m_position.SelectByIndex(i))  // select a position
           {
            m_trade.PositionClose(m_position.Ticket()); // then close it --period
            Sleep(100); // Relax for 100 ms
            //ChartWrite("Positions", "Positions " + (string)PositionsTotal(), 100, 80, 20, PositionsColor); //Re write number of positions on the chart
           }
       ObjectDelete(0, "Positions"); //delete a Position Object   
}







//=========================== HUD (on-chart) ========================//
#define HUD_PREFIX    "FiboHUD_"
string  HUD_BG   = HUD_PREFIX+"BG";
string  HUD_CAP  = HUD_PREFIX+"Cap";
string  HUD_VAL  = HUD_PREFIX+"Val";
string  HUD_UP   = HUD_PREFIX+"Up";
string  HUD_DN   = HUD_PREFIX+"Dn";
string  HUD_EDIT = HUD_PREFIX+"Edit";
string  HUD_DIR  = HUD_PREFIX+"Dir";

void HUD_Destroy(){ string objs[]={HUD_BG,HUD_CAP,HUD_VAL,HUD_UP,HUD_DN,HUD_EDIT,HUD_DIR}; for(int i=0;i<ArraySize(objs);++i) ObjectDelete(0,objs[i]); }
void HUD_UpdateText()
{
   if(!HUD_Enable) return;
   //if(ObjectFind(0,HUD_VAL)>=0)  
   ObjectSetString(0,HUD_CAP,OBJPROP_TEXT,"HWM: "+ hwmvalue);
   //if(ObjectFind(0,HUD_EDIT)>=0) ObjectSetString(0,HUD_EDIT,OBJPROP_TEXT,LotsStr());
//   if(ObjectFind(0,HUD_DIR)>=0)
//   {
//      int dir = PositionDirection();
      // string dtxt = (dir>0 ? "Long" : dir<0 ? "Short" : "Flat"); 
//      string dtxt = (objectCounter);
//      color  dcol = (dir>0 ? clrLime : dir<0 ? clrTomato : clrSilver);
//      ObjectSetString (0,HUD_DIR,OBJPROP_TEXT,"Dir: "+dtxt);
//      ObjectSetInteger(0,HUD_DIR,OBJPROP_COLOR,dcol);
//   }
}
void HUD_Create()
{
   if(!HUD_Enable){ HUD_Destroy(); return; }

   if(ObjectFind(0,HUD_BG)<0)
   {
      ObjectCreate(0,HUD_BG,OBJ_RECTANGLE_LABEL,0,0,0);
      ObjectSetInteger(0,HUD_BG,OBJPROP_XDISTANCE,HUD_X);
      ObjectSetInteger(0,HUD_BG,OBJPROP_YDISTANCE,HUD_Y);
      ObjectSetInteger(0,HUD_BG,OBJPROP_XSIZE,HUD_W);
      ObjectSetInteger(0,HUD_BG,OBJPROP_YSIZE,HUD_H);
      ObjectSetInteger(0,HUD_BG,OBJPROP_BGCOLOR,clrBlack);
      ObjectSetInteger(0,HUD_BG,OBJPROP_COLOR,clrBlack);
      ObjectSetInteger(0,HUD_BG,OBJPROP_FILL,true);
      ObjectSetInteger(0,HUD_BG,OBJPROP_CORNER,CORNER_LEFT_UPPER);
   }
   if(ObjectFind(0,HUD_CAP)<0)
   {
      ObjectCreate(0,HUD_CAP,OBJ_LABEL,0,0,0);
      ObjectSetInteger(0,HUD_CAP,OBJPROP_CORNER,CORNER_LEFT_UPPER);
      ObjectSetInteger(0,HUD_CAP,OBJPROP_XDISTANCE,HUD_X+10);
      ObjectSetInteger(0,HUD_CAP,OBJPROP_YDISTANCE,HUD_Y+6);
      ObjectSetString(0,HUD_CAP,OBJPROP_TEXT,"HWM: "+ hwmvalue);        //////////////////////////////////////////////////////////////////////////////
      ObjectSetInteger(0,HUD_CAP,OBJPROP_COLOR,clrWhite);
      ObjectSetInteger(0,HUD_CAP,OBJPROP_FONTSIZE,10);
      ObjectSetString(0,HUD_CAP,OBJPROP_FONT,"Arial");
   }
   
   HUD_UpdateText();
}



// HUD events
void OnChartEvent(const int id,const long &lparam,const double &dparam,const string &sparam)
{
   if(!HUD_Enable) return;

   if(id==CHARTEVENT_OBJECT_ENDEDIT && sparam==HUD_EDIT)
   {
      string txt = ObjectGetString(0,HUD_EDIT,OBJPROP_TEXT);
      for(int i=0;i<StringLen(txt);++i) if(StringGetCharacter(txt,i)==',') StringSetCharacter(txt,i,'.');
      double v = StringToDouble(txt);
      if(!(v>0.0)){ HUD_UpdateText(); return; }
      //g_lots = NormalizeLots(v);
      //GlobalVariableSet(g_gvLotsKey,g_lots);
      HUD_UpdateText();
   }
}


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   HUD_Create();
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {




   HUD_UpdateText();
//---




   if (closealreadyflag < 1)
   {
      if (eqt = 0.0)
      {
         eqt = 11111;
      }
      else if (eqt == 11111 || (AccountInfoDouble(ACCOUNT_EQUITY))>bl)
      {
         eqt = AccountInfoDouble(ACCOUNT_EQUITY);
      }
   }

      
   bl = AccountInfoDouble(ACCOUNT_BALANCE);
   calculatedstop = percentofHWMtrigger*hwmvalue;
   
   if ((eqt > bl) && (eqt>hwmvalue))
   {
      hwmvalue = eqt;
   }
        
   
   if ((closealreadyflag < 1) && (eqt > 0))
   {
      if (eqt < calculatedstop)
      {
              CloseAll();
              closealreadyflag = 1;
              eqt = 99999;
              Print("HWM: ", hwmvalue);
              Print("percentofHWMtrigger: ", percentofHWMtrigger);
              Print("calculatedstop: ", calculatedstop);
           }

   }

   
   
   
   
  }
//+------------------------------------------------------------------+