e 3.0





/*-----------------------------+
|			       |
| Shared by www.Aptrafx.com    |
|			       |
+------------------------------*/

//+------------------------------------------------------------------+
//|                                                 Envelope 3.0 mq4 |
//|                                   tageiger aka fxid10t@yahoo.com |
//|                                        http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "tageiger aka fxid10t@yahoo.com"
#property link      "http://www.metaquotes.net"

//Global User Variables
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        MaElineTSL        =0;//0=iMA trailing stoploss  1=Opposite Envelope TSL
extern int        TimeOpen          =0;
extern int        TimeClose         =20;
extern double     FirstTP           =144.0;
extern double     SecondTP          =233.0;
extern double     ThirdTP           =377.0;
extern double     Lots              =0.1;
extern double     MaximumRisk       =0.02;
extern double     DecreaseFactor    =3;

//Global Internal Variables
double            TSL               =0;
string            comment           ="e 3.0";
int               p;                p=EnvelopePeriod;
int               etf;              etf=EnvTimeFrame;
int               mam;              mam=EnvMaMethod;
double            d;                d=EnvelopeDeviation;
double            SPoint;           SPoint      =MarketInfo(Symbol(), MODE_POINT);
double            Spread;           Spread      =Ask-Bid;
double            SDigits;          SDigits     =MarketInfo(Symbol(), MODE_DIGITS);
string            TradeSymbol;      TradeSymbol =Symbol();
int               b1,b2,b3,s1,s2,s3,cnt, ticket, total;
double            btp1,btp2,btp3,stp1,stp2,stp3,bline,sline,ma;
static int        loss,win;

int init()  {  if(Period()!=5)   {Alert("Default EnvelopeDeviation & TPs set for 5min charts"); return(0);  }  }
int deinit(){  return(0);  }
int start() {

   int    orders=HistoryTotal();     // history orders total

   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) win++;
         if(OrderProfit()<0) loss++;
      }
   if(loss>0 && win>0)  {  if(win>loss)   d=NormalizeDouble((loss/win),2);
                           if(loss>win)   d=NormalizeDouble((win/loss),2); }
   //Print("D:",D," loss:",loss," win:",win);
   if(d<0.1) d=0.1;

   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(TotalTradesThisSymbol(TradeSymbol)==0) {b1=0;b2=0;b3=0;s1=0;s2=0;s3=0;}
   if(TotalTradesThisSymbol(TradeSymbol)>0)  {
      for(cnt=0;cnt<total;cnt++) {
         OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
         if(OrderSymbol()==TradeSymbol) {
         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,SDigits))+(FirstTP*SPoint);
            ticket=OrderSend(Symbol(),
                              OP_BUYSTOP,
                              LotsOptimized(),
                              (NormalizeDouble(bline,SDigits)),
                              0,
                              (NormalizeDouble(sline,SDigits)),
                              btp1,
                              "buystop TP1"+comment,
                              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,SDigits))+(SecondTP*SPoint);
            ticket=OrderSend(Symbol(),
                              OP_BUYSTOP,
                              LotsOptimized(),
                              (NormalizeDouble(bline,SDigits)),
                              0,
                              (NormalizeDouble(sline,SDigits)),
                              btp2,
                              "buystop TP2"+comment,
                              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,SDigits))+(ThirdTP*SPoint);
            ticket=OrderSend(Symbol(),
                              OP_BUYSTOP,
                              LotsOptimized(),
                              (NormalizeDouble(bline,SDigits)),
                              0,
                              (NormalizeDouble(sline,SDigits)),
                              btp3,
                              "buystop TP3"+comment,
                              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,SDigits)-(FirstTP*SPoint);
            ticket=OrderSend(Symbol(),
                              OP_SELLSTOP,
                              LotsOptimized(),
                              (NormalizeDouble(sline,SDigits)),
                              0,
                              (NormalizeDouble(bline,SDigits)),
                              stp1,
                              "sellstop TP1"+comment,
                              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,SDigits)-(SecondTP*SPoint);
            ticket=OrderSend(Symbol(),
                              OP_SELLSTOP,
                              LotsOptimized(),
                              (NormalizeDouble(sline,SDigits)),
                              0,
                              (NormalizeDouble(bline,SDigits)),
                              stp2,
                              "sellstop TP2"+comment,
                              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,SDigits)-(ThirdTP*SPoint);
            ticket=OrderSend(Symbol(),
                              OP_SELLSTOP,
                              LotsOptimized(),
                              (NormalizeDouble(sline,SDigits)),
                              0,
                              (NormalizeDouble(bline,SDigits)),
                              stp3,
                              "sellstop TP3"+comment,
                              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);
                                 }
            }
         }
      }
   if(TotalTradesThisSymbol(TradeSymbol)>0)  {
      for(cnt=0;cnt<total;cnt++)
         {
         OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);            
         if(OrderSymbol()==TradeSymbol)   {
            if(OrderType()==OP_BUY)
               {
               if(MaElineTSL==0) {TSL=NormalizeDouble(ma,SDigits); }
               if(MaElineTSL==1) {TSL=NormalizeDouble(sline,SDigits); }
               if(Close[0]>OrderOpenPrice())
                  {
                  if((Close[0]>ma) && (TSL>OrderStopLoss()))
                     {
                     double bsl;bsl=TSL;
                     OrderModify(OrderTicket(),
                                 OrderOpenPrice(),
                                 bsl,
                                 OrderTakeProfit(),
                                 0,//Order expiration server date/time
                                 Green);
                     }
                  }
               }
            if(OrderType()==OP_SELL)
               {
               if(MaElineTSL==0) {TSL=NormalizeDouble(ma,SDigits); }
               if(MaElineTSL==1) {TSL=NormalizeDouble(bline,SDigits); }         
               if(Close[0]<OrderOpenPrice())
                  {
                  if((Close[0]<ma) && (TSL<OrderStopLoss()))
                     {
                     double ssl;ssl=TSL;
                     OrderModify(OrderTicket(),
                                 OrderOpenPrice(),
                                 ssl,
                                 OrderTakeProfit(),
                                 0,//Order expiration server date/time
                                 Red);
                     }
                  }
               }      
            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;}                  
               }
            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(OrderCloseTime()>0) {b1=0;}
            OrderSelect(b2,SELECT_BY_TICKET);   if(OrderCloseTime()>0) {b2=0;}
            OrderSelect(b3,SELECT_BY_TICKET);   if(OrderCloseTime()>0) {b3=0;}
            OrderSelect(s1,SELECT_BY_TICKET);   if(OrderCloseTime()>0) {s1=0;}
            OrderSelect(s2,SELECT_BY_TICKET);   if(OrderCloseTime()>0) {s2=0;}     
            OrderSelect(s3,SELECT_BY_TICKET);   if(OrderCloseTime()>0) {s3=0;}
            }
         }
      }
   return(0);
   }
//Functions

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);
//---- calculate 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);
     }
   if(lot<0.1) lot=0.1;
return(lot);
}//end LotsOptimized

int TotalTradesThisSymbol(string TradeSymbol) {
   int i, TradesThisSymbol=0;
   
   for(i=0;i<OrdersTotal();i++)  {
      OrderSelect(i,SELECT_BY_POS);
      if(OrderSymbol()==TradeSymbol &&
         OrderMagicNumber()==1 ||
         OrderMagicNumber()==2 || 
         OrderMagicNumber()==3 || 
         OrderMagicNumber()==4 || 
         OrderMagicNumber()==5 || 
         OrderMagicNumber()==6)  {  TradesThisSymbol++;  }
   }//end for
return(TradesThisSymbol);
}//end TotalTradesThisSymbol





Sample





Analysis



Market Information Used:

Series array that contains close prices for each bar


Indicator Curves created:


Indicators Used:

Moving average indicator
Envelopes indicator


Custom Indicators Used:

Order Management characteristics:

Checks for the total of open orders
It can change open orders parameters, due to possible stepping strategy

Other Features:

It issuies visual alerts to the screen