PriceChannelExpert_v41





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

//+------------------------------------------------------------------+
//|                                        PriceChannelExpert_v4.mq4 |
//|                                  Copyright © 2006, Forex-TSD.com |
//|                         Written by IgorAD,igorad2003@yahoo.co.uk |   
//|            http://finance.groups.yahoo.com/group/TrendLaboratory |                                      
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, Forex-TSD.com "
#property link      "http://www.forex-tsd.com/"

#include <stdlib.mqh>
#include <Tracert.mqh>

//---- input parameters
extern string     Expert_Name    = "---- PriceChannelExpert_v4 ----";

extern int        Magic          = 10000;
extern int        Slippage       =     6;
extern bool       Trace          = false;    // Trace Switch

extern string     Main_data      = " Trade Volume & Trade Method";
extern double     Lots = 0.1;
extern double     TakeProfit     =   100;    // Take Profit Value 
extern double     InitialStop    =    50;    // Initial Stop Value
extern bool       TrailingStop   = false;    // Trailing Stop Switch   
extern bool       SwingTrade     = false;    // Swing Trade Switch
extern bool       PendingOrder   = false;    // PendingOrder/InstantExecution Switch
extern double     PendOrdGap     =    10;    // Gap from High/Low for Pending Orders
extern double     BreakEven      =    30;    // BreakEven Level in pips
extern double     BreakEvenGap   =     0;    // Pips when BreakEven will be reached

extern string     Calc_data      = " Price Channel Parameters ";
extern int        MainTimeFrame  =  1440;    // Large Time Frame in min
extern int        MainChanPeriod =     9;    // Price Channel Period for Large Time Frame
extern double     MainRisk       =   0.3;    // Overbought/Oversold Level 0...0.5 for Large Time Frame

extern int        ChanPeriod     =     9;    // Price Channel Period for current Time Frame 
extern double     Risk           =   0.3;    // Overbought/Oversold Level 0...0.5 for current Time Frame 

extern string     MM_data        = " MoneyManagement by L.Williams ";
extern bool       MM             = false;    // ÌÌ Switch
extern double     MMRisk         =  0.15;    // Risk Factor
extern double     MaxLoss        =  1000;    // Maximum Loss by 1 Lot

int    MainTrend=0, Trend=0, PrevTrend=0, digit, Signal=0, b=0, cnt=0, Kz=0, ticket=0;
double Mainsmin1,Mainsmax1,Mainbsmin1=0,Mainbsmax1=0,Mainbsmin2=0,Mainbsmax2=0,
       MainHigh=0, MainLow=0, MainClose1 = 0, 
       smin1=0,smax1=0,bsmin1=0,bsmax1=0,bsmin2=0,bsmax2=0,
       SellStop,BuyStop;

double MainTFdata[][6];
bool   BuyInTrade = false, SellInTrade = false;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//---- 
   
//----
   return(0);
  }

// ---- Scan Trades
int ScanTrades()
{   
   int total = OrdersTotal();
   int numords = 0;
      
   for(int cnt=0; cnt<total; cnt++) 
   {        
   OrderSelect(cnt, SELECT_BY_POS);            
   if(OrderSymbol() == Symbol() && OrderType()<=OP_SELLSTOP && OrderMagicNumber() == Magic) 
   numords++;
   }
   return(numords);
}  

void MainPriceChannel()
{   
  //double MainTFdata[][6];
   
  ArrayCopyRates(MainTFdata, Symbol(), MainTimeFrame);
  MainClose1 = MainTFdata[1][4];
  //Print(" MainClose = ",MainClose1," High=",MainTFdata[9][3]," Low=",MainTFdata[4][2]);
  Mainsmax1 = 0; Mainsmin1 = 100000;
  for ( int i=MainChanPeriod; i>=1; i--)
  {
  MainHigh  = MainTFdata[i][3];
  MainLow   = MainTFdata[i][2]; 
  Mainsmax1 = MathMax(Mainsmax1,MainHigh);
  Mainsmin1 = MathMin(Mainsmin1, MainLow);
  } 
  
  //Print(" Mainsmin = ",Mainsmin1, " Mainsmax = ",Mainsmax1);
  
  Mainbsmax2 = Mainbsmax1;
  Mainbsmin2 = Mainbsmin1; 
  
  Mainbsmax1 = Mainsmax1 - (Mainsmax1 - Mainsmin1 )* MainRisk;
  Mainbsmin1 = Mainsmin1 + (Mainsmax1 - Mainsmin1 )* MainRisk;
  
  
  if (MainRisk > 0)
  {
  if (MainClose1 > Mainbsmax1 && Mainbsmax1>0) MainTrend =  1;
  if (MainClose1 < Mainbsmin1 && Mainbsmin1>0) MainTrend = -1;
  }
  else
  {
  if (MainClose1 > Mainbsmax2 && Mainbsmax2>0) MainTrend =  1;
  if (MainClose1 < Mainbsmin2 && Mainbsmax2>0) MainTrend = -1;
  }
  
  if(MainTrend>0)
  {
  if(MainRisk>0 && MainClose1<Mainbsmin1) Mainbsmin1 = Mainbsmin2;
  if(Mainbsmin1<Mainbsmin2) Mainbsmin1 = Mainbsmin2;
  }
  else
  if(MainTrend<0)
  {
  if(MainRisk>0 && MainClose1>Mainbsmax2) Mainbsmax1 = Mainbsmax2;
  if(Mainbsmax1>Mainbsmax2) Mainbsmax1 = Mainbsmax2;
  } 
}

void PriceChannel()
{

  smin1=Low[Lowest(Symbol(),Period(),MODE_LOW,ChanPeriod,1)];   
  smax1=High[Highest(Symbol(),Period(),MODE_HIGH,ChanPeriod,1)];  
  PrevTrend = Trend;
  bsmax2 = bsmax1;
  bsmin2 = bsmin1; 
  
  bsmax1 = smax1 - (smax1 - smin1 )* Risk;
  bsmin1 = smin1 + (smax1 - smin1 )* Risk;
  
  
  if (Risk > 0)
  {
  if (Close[1] > bsmax1 && bsmax1 > 0) Trend =  1;
  if (Close[1] < bsmin1 && bsmin1 > 0) Trend = -1;
  }
  else
  {
  if (Close[1] > bsmax2 && bsmax2 > 0) Trend =  1;
  if (Close[1] < bsmin2 && bsmin2 > 0) Trend = -1;
  }
  
  if(Trend>0)
  {
  if(Risk>0 && Close[1]<bsmin1) bsmin1 = bsmin2;
  if(bsmin1<bsmin2) bsmin1 = bsmin2;
  }
  else
  if(Trend<0)
  {
  if(Risk>0 && Close[1]>bsmax2) bsmax1 = bsmax2;
  if(bsmax1>bsmax2) bsmax1 = bsmax2;
  } 
}
  
void TradeSignal()
{         
  if 
  (
  MainTrend >0 
  &&
  Trend>0
  && 
  PrevTrend<0
  ) Signal= 1;
  
  if 
  (
  MainTrend <0
  &&
  Trend<0
  && 
  PrevTrend>0
  ) Signal= -1;
}  

double MoneyManagement ( bool flag, double Lots, double risk, double maxloss)
{
   double Lotsi=Lots;
	    
   if ( flag ) Lotsi=NormalizeDouble(Lots*AccountFreeMargin()*MMRisk/MaxLoss,1);   
     
   if (Lotsi<0.1) Lotsi=0.1;  
   return(Lotsi);
}   

void CloseTrade()
{
   int ExitSignal = Signal;

   for (cnt=0;cnt<OrdersTotal();cnt++)
   { 
       OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);   
       int mode=OrderType();
       if ( OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
       { 
// - BUY Orders         
         if ( ExitSignal<0 )
         {
            if (mode==OP_BUY)
                  {
			         OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Yellow);
			         }
         }
         else
// - SELL Orders          
         if ( ExitSignal>0 )
	      {
            if (mode==OP_SELL)
			         {
   			      OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,White);
                  }
         }
      }       
   } 
}

void BreakEvenStop()
{        
   
    for (cnt=0;cnt<OrdersTotal();cnt++)
    { 
     OrderSelect(cnt, SELECT_BY_POS);   
     int mode=OrderType();    
        if ( OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) 
        {
            if ( mode==OP_BUY )
            {
               BuyStop = OrderStopLoss();
			         if (Bid-OrderOpenPrice() > Kz*BreakEven*Point) 
			            {
			            BuyStop=OrderOpenPrice()+((Kz-1)*BreakEven+BreakEvenGap)*Point;
			            OrderModify(OrderTicket(),OrderOpenPrice(),
			                        NormalizeDouble(BuyStop, digit),
			                        OrderTakeProfit(),0,LightBlue);
			            Kz=Kz+1;
			            return(0);
			            }
			      
			   }
            if ( mode==OP_SELL )
            {
               SellStop = OrderStopLoss();
                  if (OrderOpenPrice()-Ask > Kz*BreakEven*Point) 
			            {
			            SellStop=OrderOpenPrice()-((Kz-1)*BreakEven+BreakEvenGap)*Point;
			            OrderModify(OrderTicket(),OrderOpenPrice(),
			                        NormalizeDouble(SellStop, digit),
			                        OrderTakeProfit(),0,Orange);
			            Kz=Kz+1;
			            return(0);
			            }
               
            }
        }   
    } 
}

void TrailStop()
{
    for (cnt=0;cnt<OrdersTotal();cnt++)
    { 
     OrderSelect(cnt, SELECT_BY_POS);   
     int mode=OrderType();    
        if ( OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) 
        {
              if (mode==OP_BUY) 
                 {
			        BuyStop = OrderStopLoss();
			        if (bsmin1>OrderStopLoss()) 
			        {
			        BuyStop = bsmin1;  
			        OrderModify(OrderTicket(),OrderOpenPrice(),
			                    NormalizeDouble(BuyStop, digit),
			                    OrderTakeProfit(),0,LightGreen);
			        }            
			        return(0);
                 }
           
// - SELL Orders          
              if (mode==OP_SELL)
                 {
                 SellStop = OrderStopLoss(); 
                 if( bsmax1<OrderStopLoss()) 
                 {
                 SellStop = bsmax1;
                 OrderModify(OrderTicket(),OrderOpenPrice(),
   			                 NormalizeDouble(SellStop, digit),
   			                 OrderTakeProfit(),0,Yellow);
   			     }	    
                 return(0);
                 }
           }
      }     
}

// ---- Open Sell Orders
void SellOrdOpen()
{		     
        double SellStop,SellProfit;
        double SellPrice=Bid;
        int    Mode = OP_SELL;
        if ( PendingOrder ) {SellPrice=smin1 - PendOrdGap*Point; Mode=OP_SELLSTOP;} 
		  
		  if (InitialStop > 0) SellStop  =SellPrice + InitialStop*Point; else SellStop  =bsmax1;
        if (TakeProfit  > 0) SellProfit=SellPrice -  TakeProfit*Point; else SellProfit=0;
	     //Print(" SellPrice=", SellPrice);  
		  ticket = OrderSend( Symbol(),Mode,MoneyManagement ( MM, Lots, MMRisk, MaxLoss),
		                      NormalizeDouble(SellPrice, digit),
		                      Slippage,
		                      NormalizeDouble(SellStop , digit),
		                      NormalizeDouble(SellProfit   , digit),
		                      "sell",Magic,0,Red);
            
            
            
            if(ticket<0)
            {
            Print("SELL: OrderSend failed with error #",GetLastError());
            //
            }
        if ( PendingOrder && GetLastError() == 130) 
        int ticket2=OrderSend(Symbol(),OP_SELL, MoneyManagement ( MM, Lots, MMRisk, MaxLoss),
                              Bid,
                              Slippage,
                              NormalizeDouble(SellStop , digit),
		                        NormalizeDouble(SellProfit   , digit),
		                        "sell",Magic,0,Red);    
   
       SellInTrade=true; BuyInTrade=false; Kz=1;  Signal=0;  
   return(0);
}
// ---- Open Buy Orders
void BuyOrdOpen()
{		     
   double BuyStop,BuyProfit;
   double BuyPrice = Ask;
   int    Mode     = OP_BUY;
   if (  PendingOrder ) {BuyPrice = smax1 + PendOrdGap*Point; Mode = OP_BUYSTOP;} 
		  
		  if (InitialStop > 0) BuyStop  = BuyPrice - InitialStop*Point; else BuyStop=bsmin1;
        if (TakeProfit  > 0) BuyProfit= BuyPrice + TakeProfit*Point;  else BuyProfit=0;  
		 
		  ticket = OrderSend(Symbol(),Mode, MoneyManagement ( MM, Lots, MMRisk, MaxLoss),
		                     NormalizeDouble(BuyPrice, digit),
		                     Slippage,
		                     NormalizeDouble(BuyStop , digit), 
		                     NormalizeDouble(BuyProfit  , digit),
		                     "buy",Magic,0,Blue);
                
                  
            
            if(ticket<0)
            {
            Print("BUY : OrderSend failed with error #",GetLastError());
            //return(0);
            }
        if (PendingOrder && GetLastError() == 130) 
        int ticket2=OrderSend(Symbol(),OP_BUY, MoneyManagement ( MM, Lots, MMRisk, MaxLoss),
                              Ask,
                              Slippage,
                              NormalizeDouble(BuyStop , digit), 
		                        NormalizeDouble(BuyProfit  , digit),
		                        "buy",Magic,0,Blue);
   BuyInTrade=true; SellInTrade = false; Kz=1; Signal = 0;
   return(0);
} 

void PendOrdsDel()
{
   
   if(Close[1]< 0.5*(bsmin1+bsmax1))int PendClose=1; 
   if(Close[1]> 0.5*(bsmin1+bsmax1))    PendClose=-1;  
   
   for (cnt=0;cnt<OrdersTotal();cnt++)
   { 
      OrderSelect(cnt, SELECT_BY_POS);   
      int mode=OrderType();    
      if ( OrderSymbol()==Symbol() && OrderMagicNumber()==Magic) 
      {
         if (mode==OP_BUYSTOP && PendClose>0)
         {
	 	   OrderDelete(OrderTicket());
	      return(0);
	      }
         else	    
         if (mode==OP_SELLSTOP && PendClose<0) 
	 	   {
	 	   OrderDelete(OrderTicket());
	      return(0);
	      }
	   }
	}
}	                                   
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//---- 
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
{
   int total,ticket;
//---- 
   digit  = MarketInfo(Symbol(),MODE_DIGITS);
   if ( Trace ) SetTrace();
   
  if (Bars>b)
  { b=Bars;
     
  PriceChannel();
  if (MainTimeFrame > 0) MainPriceChannel(); else MainTrend = Trend;
  Print(" Trend = ",Trend, " PrevTrend = ",PrevTrend," MainTrend=",MainTrend, " Signal=",Signal);
  PendOrdsDel();
  
  TradeSignal();
  
  CloseTrade();
  
  if (BreakEven >0) BreakEvenStop();
  if (TrailingStop) TrailStop();
  //Print(" Signal = ",Signal);
  if (SwingTrade)
  {
  if (ScanTrades()<1 && Signal>0 && !BuyInTrade) BuyOrdOpen();
  if (ScanTrades()<1 && Signal<0 && !SellInTrade ) SellOrdOpen();
  }
  else
  {
  if (ScanTrades()<1 && Signal>0) BuyOrdOpen();
  if (ScanTrades()<1 && Signal<0) SellOrdOpen();
  }

  }//if (Bars>b)
//----
   return(0);
} //start()
//+------------------------------------------------------------------+



Sample





Analysis



Market Information Used:

Series array that contains the lowest prices of each bar
Series array that contains the highest prices of each bar
Series array that contains close prices for each bar


Indicator Curves created:


Indicators Used:



Custom Indicators Used:

Order Management characteristics:
Checks for the total of open orders

It Closes Orders by itself
It can change open orders parameters, due to possible stepping strategy

Other Features: