Envelope 2.11_all_eurusdm15

Author: tageiger
Profit factor:
2497.75

This script is designed to automatically place pending buy and sell orders based on envelope indicators, manage those orders with trailing stop losses, and delete them at a specified time if they haven't been triggered.

Here's the breakdown:

  1. Setup & Inputs: The script starts by gathering information from the user through input settings. These inputs define how the script will behave, including the period and deviation of the envelope indicator (which creates upper and lower bands around the price), trading times, take profit levels, lot sizes (how much to trade), risk management settings, and trailing stop loss settings. A magic number is used to identify the orders the script creates.

  2. Lot Size Optimization: It determines the appropriate trade size ('LotsOptimized' function). It looks at your account balance and the maximum risk you're willing to take per trade. It then potentially reduces the lot size if you've had a series of losing trades, up to a certain reduction factor. This is a simple form of money management.

  3. Envelope Calculation: The script then calculates the upper and lower lines of the envelope indicator, along with a moving average. The upper and lower envelope lines essentially create a band around the current price.

  4. Order Placement: The core logic checks if it's within your specified trading hours. If it is, and if the current price is between the upper and lower envelope lines, the script will attempt to place three Buy Stop orders (orders to buy if the price rises to a certain level) above the upper envelope line, and three Sell Stop orders (orders to sell if the price falls to a certain level) below the lower envelope line. Each buy/sell stop order has a different take-profit level (target profit point) defined in the input settings.

  5. Order Tracking: The script keeps track of the order IDs (tickets) for the orders it places.

  6. Trailing Stop Loss: For any open buy or sell orders, the script attempts to move the stop loss (a limit on how much you're willing to lose) to follow the price, creating a trailing stop loss. This helps to lock in profits as the price moves in a favorable direction. The stop loss is based on either the moving average line or the opposite envelope line, depending on the user's settings.

  7. Order Deletion: If the current hour equals the TimeClose value (meaning the end of the trading hours), the script checks for pending Buy Stop or Sell Stop orders. It then deletes these pending orders as long as they haven't been triggered.

  8. Order Closure: The script also monitors whether any of the orders have been closed either due to take profit or stop loss being hit. It then resets the corresponding order ID variables to indicate that a new order can be placed the next time the script runs.

In essence, the script aims to automate a trading strategy based on envelope indicators, attempting to capture potential breakouts within a specific timeframe, while also implementing basic risk management techniques.

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
14 Views
2 Downloads
0 Favorites
Envelope 2.11_all_eurusdm15
//+------------------------------------------------------------------+
//|                                                   Envelope 2.mq4 |
//|                                                         tageiger |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "tageiger"
#property link      "http://www.metaquotes.net"

//---- input parameters
extern int        Magic = 11000;
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              =1;
extern double     MaximumRisk       =0.03;
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;
   
   int      digit  = MarketInfo(Symbol(),MODE_DIGITS);
   
   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()==Magic+2)
            {b1=OrderTicket(); }
         if(OrderMagicNumber()==Magic+4)
            {b2=OrderTicket(); }
         if(OrderMagicNumber()==Magic+6)
            {b3=OrderTicket(); }
         if(OrderMagicNumber()==Magic+1)
            {s1=OrderTicket(); }
         if(OrderMagicNumber()==Magic+3)
            {s2=OrderTicket(); }
         if(OrderMagicNumber()==Magic+5)
            {s3=OrderTicket(); }
         }
      //Print ("magic=",OrderMagicNumber());
      }
   if(b1==0)
      {  
      if(Hour()>TimeOpen && Hour()<TimeClose)
         {
         if(bline>Close[0] && sline<Close[0])
            {
            btp1=(NormalizeDouble(bline,digit))+(FirstTP*Point);
            ticket=OrderSend(Symbol(),
                              OP_BUYSTOP,
                              LotsOptimized(),
                              (NormalizeDouble(bline,digit)),
                              0,
                              (NormalizeDouble(sline,digit)),
                              btp1,
                              "",
                              Magic+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,digit))+(SecondTP*Point);
            ticket=OrderSend(Symbol(),
                              OP_BUYSTOP,
                              LotsOptimized(),
                              (NormalizeDouble(bline,digit)),
                              0,
                              (NormalizeDouble(sline,digit)),
                              btp2,
                              "",
                              Magic+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,digit))+(ThirdTP*Point);
            ticket=OrderSend(Symbol(),
                              OP_BUYSTOP,
                              LotsOptimized(),
                              (NormalizeDouble(bline,digit)),
                              0,
                              (NormalizeDouble(sline,digit)),
                              btp3,
                              "",
                              Magic+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,digit)-(FirstTP*Point);
            ticket=OrderSend(Symbol(),
                              OP_SELLSTOP,
                              LotsOptimized(),
                              (NormalizeDouble(sline,digit)),
                              0,
                              (NormalizeDouble(bline,digit)),
                              stp1,
                              "",
                              Magic+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,digit)-(SecondTP*Point);
            ticket=OrderSend(Symbol(),
                              OP_SELLSTOP,
                              LotsOptimized(),
                              (NormalizeDouble(sline,digit)),
                              0,
                              (NormalizeDouble(bline,digit)),
                              stp2,
                              "",
                              Magic+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,digit)-(ThirdTP*Point);
            ticket=OrderSend(Symbol(),
                              OP_SELLSTOP,
                              LotsOptimized(),
                              (NormalizeDouble(sline,digit)),
                              0,
                              (NormalizeDouble(bline,digit)),
                              stp3,
                              "",
                              Magic+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,digit); }
         if(MaElineTSL==1) {TSL=NormalizeDouble(sline,digit); }
         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,digit); }
         if(MaElineTSL==1) {TSL=NormalizeDouble(bline,digit); }         
         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
29965.76
Total Trades 29
Won Trades 26
Lost trades 3
Win Rate 89.66 %
Expected payoff 879723.94
Gross Profit 25512844.90
Gross Loss -851.40
Total Net Profit 25511993.50
-100%
-50%
0%
50%
100%
USD/CHF Jul 2025 - Sep 2025
1.19
Total Trades 46
Won Trades 36
Lost trades 10
Win Rate 78.26 %
Expected payoff 6.29
Gross Profit 1774.81
Gross Loss -1485.55
Total Net Profit 289.26
-100%
-50%
0%
50%
100%
GBP/AUD Jul 2025 - Sep 2025
1.07
Total Trades 12
Won Trades 11
Lost trades 1
Win Rate 91.67 %
Expected payoff 1.64
Gross Profit 317.92
Gross Loss -298.23
Total Net Profit 19.69
-100%
-50%
0%
50%
100%
USD/CAD Oct 2024 - Jan 2025
0.98
Total Trades 38
Won Trades 34
Lost trades 4
Win Rate 89.47 %
Expected payoff -0.43
Gross Profit 931.42
Gross Loss -947.79
Total Net Profit -16.37
-100%
-50%
0%
50%
100%
GBP/USD Oct 2024 - Jan 2025
0.97
Total Trades 108
Won Trades 94
Lost trades 14
Win Rate 87.04 %
Expected payoff -0.88
Gross Profit 3479.50
Gross Loss -3575.00
Total Net Profit -95.50
-100%
-50%
0%
50%
100%
NZD/USD Oct 2024 - Jan 2025
0.74
Total Trades 91
Won Trades 65
Lost trades 26
Win Rate 71.43 %
Expected payoff -9.15
Gross Profit 2329.70
Gross Loss -3162.30
Total Net Profit -832.60
-100%
-50%
0%
50%
100%
AUD/USD Oct 2024 - Jan 2025
0.69
Total Trades 129
Won Trades 0
Lost trades 0
Win Rate 0.00 %
Expected payoff -11.74
Gross Profit 3393.10
Gross Loss -4907.40
Total Net Profit -1514.30
-100%
-50%
0%
50%
100%
NZD/USD Jul 2025 - Sep 2025
0.63
Total Trades 60
Won Trades 46
Lost trades 14
Win Rate 76.67 %
Expected payoff -14.57
Gross Profit 1504.90
Gross Loss -2379.10
Total Net Profit -874.20
-100%
-50%
0%
50%
100%
USD/JPY Jul 2025 - Sep 2025
0.47
Total Trades 115
Won Trades 96
Lost trades 19
Win Rate 83.48 %
Expected payoff -22.43
Gross Profit 2260.27
Gross Loss -4839.30
Total Net Profit -2579.03
-100%
-50%
0%
50%
100%
GBP/USD Jul 2025 - Sep 2025
0.30
Total Trades 34
Won Trades 24
Lost trades 10
Win Rate 70.59 %
Expected payoff -63.83
Gross Profit 908.70
Gross Loss -3079.00
Total Net Profit -2170.30
-100%
-50%
0%
50%
100%
AUD/USD Jul 2025 - Sep 2025
0.26
Total Trades 29
Won Trades 17
Lost trades 12
Win Rate 58.62 %
Expected payoff -35.16
Gross Profit 356.30
Gross Loss -1375.80
Total Net Profit -1019.50
-100%
-50%
0%
50%
100%
GBP/CAD Jul 2025 - Sep 2025
0.00
Total Trades 11
Won Trades 11
Lost trades 0
Win Rate 100.00 %
Expected payoff 31.77
Gross Profit 349.44
Gross Loss 0.00
Total Net Profit 349.44
-100%
-50%
0%
50%
100%

Comments