StealthStopLoss





//+------------------------------------------------------------------+
//|                                              StealthStopLoss.mq4 |
//|                                                                  |
//| This indicator is for monitoring how close a position is to a    |
//| hidden StopLoss, referred to as a Stealth StopLoss.  It is       |
//| in the sense that it does not show up on the Broker's server.    |
//| This avoids Stop Hunting by the Broker, whether real or imagined.|
//|                                                                  |
//| An indicator can't close positions, so coded to easily add to an |
//| EA.                                                              |
//|                                                                  |
//| Could create an EA to consistently control all open positions.   |
//| To be specific to a Magic.Number, would need to add code.        |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "Mark"
#property link      ""
#property indicator_chart_window

extern double     Stealth.Stop.Loss=120;              //Maximum pip loss allowed
extern bool       Display.Lower.Left.Corner=true;     //False puts it in lower right corner
//extern int        Slippage=3;                         //If you cut this too close, you'll miss an exit
                                                      //Slippage only relevant in an EA for closing positions

//+------------------------------------------------------------------+
int init()
   {
   Stealth.Stop.Loss=Stealth.Stop.Loss*Point;
   ObjectCreate("SLStatus",OBJ_LABEL,0,0,0);
   ObjectSetText("SLStatus","",8,"Arial",Green);
   ObjectSet("SLStatus",OBJPROP_CORNER,3);
   ObjectSet("SLStatus",OBJPROP_XDISTANCE,5);
   ObjectSet("SLStatus",OBJPROP_YDISTANCE,5);
   return(0);
   }
//+------------------------------------------------------------------+
int deinit()
   {
   ObjectsDeleteAll(0,OBJ_LABEL);
   return(0);
   }
//+------------------------------------------------------------------+
int start()
  {
   if(Stealth.Stop.Loss<=0)
      {
      DisplayComment("Stealth S/L not selected",1);
      return(0);
      }
   double   dCalc1=1,dCalc2=0;
   string   sComment="No orders for Stealth S/L to monitor";
   for(int i=0;i<=OrdersTotal();i++)
      {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if (OrderSymbol() == Symbol())   //((OrderSymbol() == Symbol()) && (OrderMagicNumber() == Magic.Number))
         {
         if(OrderType()==OP_BUY) 
            {
            dCalc1=Bid-OrderOpenPrice();
            dCalc2=Stealth.Stop.Loss+dCalc1;            
            if(Stealth.Stop.Loss>0 && dCalc2<0)
               {
               sComment="Stealth.Stop.Loss Activated. Closing Longs";
               //OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Blue);
               //Print("Long Order # "+OrderTicket()+" exited by Stealth S/L");
               //return(0);
               }
            else sComment= "Stealth S/L Active. S/L="+DoubleToStr(Stealth.Stop.Loss/Point,0)+" | Pips="+DoubleToStr(dCalc1/Point,0)+" | To S/L="+DoubleToStr(dCalc2/Point,0);
            }
         if(OrderType()==OP_SELL) 
            {
            dCalc1=OrderOpenPrice()-Ask;
            dCalc2=Stealth.Stop.Loss+dCalc1;
            if(Stealth.Stop.Loss>0 && dCalc2<0)
               {
               sComment="Stealth.Stop.Loss Activated. Closing Shorts";
               //OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Red);
               //Print("Short Order # "+OrderTicket()+" exited by Stealth S/L");
               //return(0);
               }
            else sComment= "Stealth S/L Active. S/L="+DoubleToStr(Stealth.Stop.Loss/Point,0)+" | Pips="+DoubleToStr(dCalc1/Point,0)+" | To S/L="+DoubleToStr(dCalc2/Point,0);
            }
         }
      }
   DisplayComment(sComment,dCalc1);
   return(0);
  }
//+------------------------------------------------------------------+
void DisplayComment(string tComment, double tResult)
   {
   if(tResult>0) ObjectSetText("SLStatus",tComment,8,"Arial",Green);
      else ObjectSetText("SLStatus",tComment,8,"Arial",Red);
   if(Display.Lower.Left.Corner) ObjectSet("SLStatus",OBJPROP_CORNER,2);
      else ObjectSet("SLStatus",OBJPROP_CORNER,3);
   return(0);   
   }





Sample





Analysis



Market Information Used:



Indicator Curves created:


Indicators Used:



Custom Indicators Used:

Order Management characteristics:
Checks for the total of open orders


Other Features: