Envelope 2.11

Author: tageiger
Profit factor:
100.72

Strategy Overview: Envelope 2 Trading Logic

This script is an automated trading tool designed to manage positions based on "Envelopes." In technical analysis, Envelopes are boundaries plotted above and below a moving average; think of them as dynamic "ceiling" and "floor" levels that expand and contract based on market volatility.

The logic can be broken down into four primary functional areas:

1. Dynamic Risk and Lot Management

Before placing any trades, the script calculates the appropriate trade size (Lot Size) using a customized risk management formula:

  • Margin Based: It calculates an initial lot size based on your available account margin and a predefined maximum risk percentage.
  • Loss Recovery Logic: If the script detects a series of consecutive losses in your trading history, it automatically reduces the lot size for new trades. This "Decrease Factor" helps prevent heavy losses during poor market conditions by shrinking your exposure until the winning streak is restored.

2. Automated Order Placement (Entry Strategy)

The script monitors the relationship between the current price and the Envelope boundaries (Upper/Lower lines). It looks to place a total of six "Pending Orders" (Buy Stops and Sell Stops):

  • Buy Positions: If the market price is currently trading between the upper and lower envelopes, the script places three Buy Stop orders at the Upper Envelope line.
    • Each of these three orders has a different profit target (Take Profit), ranging from short-term to long-term goals.
  • Sell Positions: Simultaneously, if those same conditions are met, it places three Sell Stop orders at the Lower Envelope line.
    • Similarly, these have three distinct profit targets based on different price levels.

Time Constraints: The script only places new orders during a specific window of time (defined by the "Open" and "Close" hours). If an order is not triggered by the end of this window, the script automatically deletes the pending request.

3. Active Trade Management (Trailing Stops)

Once a trade is activated (becomes an open position), the script begins managing it dynamically to lock in profits:

  • Profit Protection: For active Buy positions, it monitors if the price has moved significantly into profit. If it reaches certain milestones, the script moves the Stop Loss forward.
  • Flexible Reference Points: Users can choose whether the "Trailing Stop" should follow a standard Moving Average or the opposite Envelope line.
  • Dynamic Adjustment: The script continuously checks if the new calculated stop loss is better (higher for buys, lower for sells) than the current one. If it is, it updates the trade automatically.

4. Order Tracking and Cleanup

The script maintains a "memory" of its active trades using unique identification numbers:

  • It identifies specific slots for Buy/Sell orders so it doesn't try to open duplicate positions in the same logic path.
  • It constantly monitors the status of these orders. If an order is closed (either hit its profit target or its stop loss), the script clears that "slot" and becomes ready to place a new trade based on the next market opportunity.
Orders Execution
Checks for the total of open ordersIt automatically opens orders when conditions are reachedIt can change open orders parameters, due to possible stepping strategy
Indicators Used
Moving average indicatorEnvelopes indicator
22 Views
0 Downloads
0 Favorites
Envelope 2.11
//+------------------------------------------------------------------+
//|                                                   Envelope 2.mq4 |
//|                                                         tageiger |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "tageiger"
#property link      "http://www.metaquotes.net"

//---- input parameters
extern int        EnvelopePeriod    =144;
extern int        EnvTimeFrame      =0; //envelope time frame: 0=chart,60=1hr,240=4hr, etc.
extern int        EnvMaMethod       =1; //0=sma,1=ema,2=smma,3=lwma.
extern double     EnvelopeDeviation =1;
extern int        TimeOpen          =0;
extern int        TimeClose         =23;
extern double     FirstTP           =89.0;
extern double     SecondTP          =144.0;
extern double     ThirdTP           =233.0;
extern double     Lots              =0.1;
extern double     MaximumRisk       =0.14;
extern double     DecreaseFactor    =3;
extern int        MaElineTSL        =0;//0=iMA trailing stoploss  1=Opposite Envelope TSL
int               b1,b2,b3,s1,s2,s3;
double            TSL               =0;

//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double LotsOptimized()
  {
   double lot=Lots;
   int    orders=HistoryTotal();     // history orders total
   int    losses=0;                  // number of losses orders without a break
//---- select lot size
   lot=NormalizeDouble(AccountFreeMargin()*MaximumRisk/1000.0,1);
//---- calcuulate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      for(int i=orders-1;i>=0;i--)
        {
         if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) { Print("Error in history!"); break; }
         if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) continue;
         //----
         if(OrderProfit()>0) break;
         if(OrderProfit()<0) losses++;
        }
      if(losses>1) lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
//---- return lot size
   if(lot<0.1) lot=0.1;
   return(lot);
   }

int start()
   {
   int      p=0;p=EnvelopePeriod;
   int      etf=0;etf=EnvTimeFrame;
   int      mam=0;mam=EnvMaMethod;
   double   d=0;d=EnvelopeDeviation;
   double   btp1,btp2,btp3,stp1,stp2,stp3;
   double   bline=0,sline=0,ma=0;
   int      cnt, ticket, total;

   ma=iMA(NULL,etf,p,0,mam,PRICE_CLOSE,0);
   bline=iEnvelopes(NULL,etf,p,mam,0,PRICE_CLOSE,d,MODE_UPPER,0);
   sline=iEnvelopes(NULL,etf,p,mam,0,PRICE_CLOSE,d,MODE_LOWER,0);

   total=OrdersTotal();
   if(OrdersTotal()==0)
      {b1=0;b2=0;b3=0;s1=0;s2=0;s3=0;}
   if(OrdersTotal()>0)
      {
      //Print("Total Orders:",OrdersTotal());
      //Print(b1," ",b2," ",b3," ",s1," ",s2," ",s3);
      for(cnt=0;cnt<total;cnt++)
         {
         OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
         if(OrderMagicNumber()==2)
            {b1=OrderTicket(); }
         if(OrderMagicNumber()==4)
            {b2=OrderTicket(); }
         if(OrderMagicNumber()==6)
            {b3=OrderTicket(); }
         if(OrderMagicNumber()==1)
            {s1=OrderTicket(); }
         if(OrderMagicNumber()==3)
            {s2=OrderTicket(); }
         if(OrderMagicNumber()==5)
            {s3=OrderTicket(); }
         }
      }
   if(b1==0)
      {  
      if(Hour()>TimeOpen && Hour()<TimeClose)
         {
         if(bline>Close[0] && sline<Close[0])
            {
            btp1=(NormalizeDouble(bline,4))+(FirstTP*Point);
            ticket=OrderSend(Symbol(),
                              OP_BUYSTOP,
                              LotsOptimized(),
                              (NormalizeDouble(bline,4)),
                              0,
                              (NormalizeDouble(sline,4)),
                              btp1,
                              "",
                              2,
                              TimeClose,
                              Aqua);
                              if(ticket>0)
                                 {
                                 if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                                    {
                                    b1=ticket;
                                    Print(ticket);
                                    }
                                 else Print("Error Opening BuyStop Order: ",GetLastError());
                                 return(0);
                                 }
            }
         }
      }         

   if(b2==0)
      {
      if(Hour()>TimeOpen && Hour()<TimeClose)
         {
         if(bline>Close[0] && sline<Close[0])
            {      
            btp2=(NormalizeDouble(bline,4))+(SecondTP*Point);
            ticket=OrderSend(Symbol(),
                              OP_BUYSTOP,
                              LotsOptimized(),
                              (NormalizeDouble(bline,4)),
                              0,
                              (NormalizeDouble(sline,4)),
                              btp2,
                              "",
                              4,
                              TimeClose,
                              Aqua);
                              if(ticket>0)
                                 {
                                 if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                                    {
                                    b2=ticket;
                                    Print(ticket);
                                    }
                                 else Print("Error Opening BuyStop Order: ",GetLastError());
                                 return(0);
                                 }
            }
         }
      }                              

   if(b3==0)
      {
      if(Hour()>TimeOpen && Hour()<TimeClose)
         {
         if(bline>Close[0] && sline<Close[0])
            {      
            btp3=(NormalizeDouble(bline,4))+(ThirdTP*Point);
            ticket=OrderSend(Symbol(),
                              OP_BUYSTOP,
                              LotsOptimized(),
                              (NormalizeDouble(bline,4)),
                              0,
                              (NormalizeDouble(sline,4)),
                              btp3,
                              "",
                              6,
                              TimeClose,
                              Aqua);
                              if(ticket>0)
                                 {
                                 if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                                    {
                                    b3=ticket;
                                    Print(ticket);
                                    }
                                 else Print("Error Opening BuyStop Order: ",GetLastError());
                                 return(0);
                                 }
            }
         }
      }                     
   
   if(s1==0)
      {
      if(Hour()>TimeOpen && Hour()<TimeClose)
         {
         if(bline>Close[0] && sline<Close[0])
            {      
            stp1=NormalizeDouble(sline,4)-(FirstTP*Point);
            ticket=OrderSend(Symbol(),
                              OP_SELLSTOP,
                              LotsOptimized(),
                              (NormalizeDouble(sline,4)),
                              0,
                              (NormalizeDouble(bline,4)),
                              stp1,
                              "",
                              1,
                              TimeClose,
                              HotPink);
                              if(ticket>0)
                                 {
                                 if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                                    {
                                    s1=ticket;
                                    Print(ticket);
                                    }
                                 else Print("Error Opening SellStop Order: ",GetLastError());
                                 return(0);
                                 }
            }
         }
      }

   if(s2==0)
      {
      if(Hour()>TimeOpen && Hour()<TimeClose)
         {
         if(bline>Close[0] && sline<Close[0])
            {      
            stp2=NormalizeDouble(sline,4)-(SecondTP*Point);
            ticket=OrderSend(Symbol(),
                              OP_SELLSTOP,
                              LotsOptimized(),
                              (NormalizeDouble(sline,4)),
                              0,
                              (NormalizeDouble(bline,4)),
                              stp2,
                              "",
                              3,
                              TimeClose,
                              HotPink);
                              if(ticket>0)
                                 {
                                 if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                                    {
                                    s2=ticket;
                                    Print(ticket);
                                    }
                                 else Print("Error Opening SellStop Order: ",GetLastError());
                                 return(0);
                                 }
            }
         }
      }                     
   
   if(s3==0)
      {
      if(Hour()>TimeOpen && Hour()<TimeClose)
         {
         if(bline>Close[0] && sline<Close[0])
            {      
            stp3=NormalizeDouble(sline,4)-(ThirdTP*Point);
            ticket=OrderSend(Symbol(),
                              OP_SELLSTOP,
                              LotsOptimized(),
                              (NormalizeDouble(sline,4)),
                              0,
                              (NormalizeDouble(bline,4)),
                              stp3,
                              "",
                              5,
                              TimeClose,
                              HotPink);
                              if(ticket>0)
                                 {
                                 if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
                                    {
                                    s3=ticket;
                                    Print(ticket);
                                    }
                                 else Print("Error Opening SellStop Order: ",GetLastError());
                                 return(0);
                                 }
            }
         }
      }
   for(cnt=0;cnt<total;cnt++)
      {
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);            
      if(OrderType()==OP_BUY)
         {
         if(MaElineTSL==0) {TSL=NormalizeDouble(ma,4); }
         if(MaElineTSL==1) {TSL=NormalizeDouble(sline,4); }
         if(Close[0]>OrderOpenPrice())
            {
            if((Close[0]>sline) && (TSL>OrderStopLoss()))
               {
               double bsl;bsl=TSL;
               OrderModify(OrderTicket(),
                           OrderOpenPrice(),
                           bsl,
                           OrderTakeProfit(),
                           0,//Order expiration server date/time
                           Green);
               Sleep(10000);
               }
            }
         }
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);            
      if(OrderType()==OP_SELL)
         {
         if(MaElineTSL==0) {TSL=NormalizeDouble(ma,4); }
         if(MaElineTSL==1) {TSL=NormalizeDouble(bline,4); }         
         if(Close[0]<OrderOpenPrice())
            {
            if((Close[0]<bline) && (TSL<OrderStopLoss()))
               {
               double ssl;ssl=TSL;
               OrderModify(OrderTicket(),
                           OrderOpenPrice(),
                           ssl,
                           OrderTakeProfit(),
                           0,//Order expiration server date/time
                           Red);
               Sleep(10000);
               }
            }
         }      
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);   
      if(Hour()==TimeClose && OrderType()==OP_BUYSTOP)
         {
         OrderDelete(OrderTicket());
         if(OrderTicket()==b1) {b1=0; return;}
         if(OrderTicket()==b2) {b2=0; return;}
         if(OrderTicket()==b3) {b3=0; return;}                  
         }
      OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);            
      if(Hour()==TimeClose && OrderType()==OP_SELLSTOP)
         {
         OrderDelete(OrderTicket());
         if(OrderTicket()==s1) {s1=0; return;}
         if(OrderTicket()==s2) {s2=0; return;}
         if(OrderTicket()==s3) {s3=0; return;}
         }
      OrderSelect(b1,SELECT_BY_TICKET);
      if(OrderClosePrice()>0) {b1=0;}
      OrderSelect(b2,SELECT_BY_TICKET);
      if(OrderClosePrice()>0) {b2=0;}
      OrderSelect(b3,SELECT_BY_TICKET);
      if(OrderClosePrice()>0) {b3=0;}
      OrderSelect(s1,SELECT_BY_TICKET);
      if(OrderClosePrice()>0) {s1=0;}
      OrderSelect(s2,SELECT_BY_TICKET);
      if(OrderClosePrice()>0) {s2=0;}     
      OrderSelect(s3,SELECT_BY_TICKET);
      if(OrderClosePrice()>0) {s3=0;}         
      }
   }

Profitability Reports

EUR/USD Jul 2025 - Sep 2025
1399.41
Total Trades 12
Won Trades 9
Lost trades 3
Win Rate 75.00 %
Expected payoff 464972.16
Gross Profit 5583656.00
Gross Loss -3990.00
Total Net Profit 5579666.00
-100%
-50%
0%
50%
100%
GBP/CAD Jul 2025 - Sep 2025
1.58
Total Trades 11
Won Trades 10
Lost trades 1
Win Rate 90.91 %
Expected payoff 48.52
Gross Profit 1453.50
Gross Loss -919.74
Total Net Profit 533.76
-100%
-50%
0%
50%
100%
EUR/USD Oct 2025 - Feb 2026
1.12
Total Trades 45
Won Trades 38
Lost trades 7
Win Rate 84.44 %
Expected payoff 16.61
Gross Profit 7167.40
Gross Loss -6420.00
Total Net Profit 747.40
-100%
-50%
0%
50%
100%
USD/CHF Jul 2025 - Sep 2025
1.05
Total Trades 46
Won Trades 36
Lost trades 10
Win Rate 78.26 %
Expected payoff 6.56
Gross Profit 6561.63
Gross Loss -6260.08
Total Net Profit 301.55
-100%
-50%
0%
50%
100%
GBP/CAD Oct 2025 - Feb 2026
1.00
Total Trades 21
Won Trades 18
Lost trades 3
Win Rate 85.71 %
Expected payoff -0.13
Gross Profit 2216.36
Gross Loss -2219.13
Total Net Profit -2.77
-100%
-50%
0%
50%
100%
GBP/AUD Jul 2025 - Sep 2025
0.97
Total Trades 12
Won Trades 11
Lost trades 1
Win Rate 91.67 %
Expected payoff -2.92
Gross Profit 1356.79
Gross Loss -1391.83
Total Net Profit -35.04
-100%
-50%
0%
50%
100%
USD/CAD Oct 2024 - Jan 2025
0.88
Total Trades 38
Won Trades 34
Lost trades 4
Win Rate 89.47 %
Expected payoff -15.17
Gross Profit 4099.69
Gross Loss -4676.12
Total Net Profit -576.43
-100%
-50%
0%
50%
100%
NZD/USD Jul 2025 - Sep 2025
0.88
Total Trades 61
Won Trades 45
Lost trades 16
Win Rate 73.77 %
Expected payoff -12.83
Gross Profit 5539.80
Gross Loss -6322.60
Total Net Profit -782.80
-100%
-50%
0%
50%
100%
GBP/USD Oct 2024 - Jan 2025
0.81
Total Trades 108
Won Trades 93
Lost trades 15
Win Rate 86.11 %
Expected payoff -39.50
Gross Profit 18438.90
Gross Loss -22705.00
Total Net Profit -4266.10
-100%
-50%
0%
50%
100%
AUD/USD Oct 2025 - Feb 2026
0.80
Total Trades 107
Won Trades 85
Lost trades 22
Win Rate 79.44 %
Expected payoff -32.98
Gross Profit 14316.80
Gross Loss -17846.00
Total Net Profit -3529.20
-100%
-50%
0%
50%
100%
NZD/USD Oct 2024 - Jan 2025
0.74
Total Trades 90
Won Trades 64
Lost trades 26
Win Rate 71.11 %
Expected payoff -41.42
Gross Profit 10528.80
Gross Loss -14256.40
Total Net Profit -3727.60
-100%
-50%
0%
50%
100%
USD/JPY Jul 2025 - Sep 2025
0.46
Total Trades 103
Won Trades 85
Lost trades 18
Win Rate 82.52 %
Expected payoff -69.94
Gross Profit 6044.56
Gross Loss -13248.35
Total Net Profit -7203.79
-100%
-50%
0%
50%
100%
GBP/AUD Oct 2025 - Feb 2026
0.29
Total Trades 26
Won Trades 23
Lost trades 3
Win Rate 88.46 %
Expected payoff -332.73
Gross Profit 3492.40
Gross Loss -12143.29
Total Net Profit -8650.89
-100%
-50%
0%
50%
100%
AUD/USD Jul 2025 - Sep 2025
0.15
Total Trades 29
Won Trades 17
Lost trades 12
Win Rate 58.62 %
Expected payoff -151.05
Gross Profit 801.60
Gross Loss -5182.00
Total Net Profit -4380.40
-100%
-50%
0%
50%
100%

Comments