ROC_Smoothed1





//+------------------------------------------------------------------+
//|                                                 ROC_Smoothed.mq4 |
//|                                    Copyright © 2006, Robert Hill |
//|                                                                  |
//| Modified ROC to use EMA                                          |
//+------------------------------------------------------------------+
#property  copyright "Copyright © 2006, Robert Hill"
//---- indicator settings
#property  indicator_separate_window
#property  indicator_buffers 1
#property  indicator_color1  Red
//---- indicator parameters
extern string  strROC = "ROC Period for lookback";
extern int     RPeriod = 10;
extern string  sep0 = "----------------------------------";
extern string  strMA = "MA input parameters";
extern int     MAPeriod=14;
extern string  sep1 = "----------------------------------";
extern string  strType = "Moving Average Types" ;
extern string  str0 = "0 = SMA, 1 = EMA, 2 = SMMA";
extern string  str1 = "3 = LWMA, 4 = LSMA, 5 = NLMA";
extern int     MAType = 1;
extern string  sep2 = "----------------------------------";
extern string  strAP = "Applied Price Types";
extern string  str2 = "0=close, 1=open, 2=high";
extern string  str3 = "3=low, 4=median(high+low)/2";
extern string  str4 = " 5=typical(high+low+close)/3";
extern string  str5 = "6=weighted(high+low+close+close)/4";
extern int     MAAppliedPrice = 0;
extern string  sep3 = "----------------------------------";
extern string  str6 = "NonLagMA Deviation";
extern double  Deviation      = 0;         
extern bool    UsePercent = false;

//---- indicator buffers
double     RateOfChange[];

//---- variables

int    MAMode;
string strMAType;

// Variables for NonLag
int Phase;
double Len;  
double Cycle =  4;
double pi = 3.1415926535;    
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int init()
  {
//---- drawing settings
   SetIndexStyle(0,DRAW_LINE);
   SetIndexDrawBegin(0,RPeriod);
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS)+1);
//---- indicator buffers mapping
   if(!SetIndexBuffer(0,RateOfChange))
      Print("cannot set indicator buffers!");
switch (MAType)
   {
      case 1: strMAType="EMA"; MAMode=MODE_EMA; break;
      case 2: strMAType="SMMA"; MAMode=MODE_SMMA; break;
      case 3: strMAType="LWMA"; MAMode=MODE_LWMA; break;
      case 4: strMAType="LSMA"; break;
      case 5: strMAType="NLMA";break;
      default: strMAType="SMA"; MAMode=MODE_SMA; break;
   }
   IndicatorShortName( "ROC (" + RPeriod + ")_Smoothed_" + strMAType+ " (" +MAPeriod + ") ");
//---- name for DataWindow and indicator subwindow label
   SetIndexLabel(0,"ROC_Smoothed");

// Variables for NonLag
   Phase = MAPeriod-1;
   Len = MAPeriod*Cycle + Phase;  

//---- initialization done
   return(0);
  }

//+------------------------------------------------------------------+
//| LSMA with PriceMode                                              |
//| PrMode  0=close, 1=open, 2=high, 3=low, 4=median(high+low)/2,    |
//| 5=typical(high+low+close)/3, 6=weighted(high+low+close+close)/4  |
//+------------------------------------------------------------------+

double LSMA(int Rperiod, int prMode, int shift)
{
   int i;
   double sum, pr;
   int length;
   double lengthvar;
   double tmp;
   double wt;

   length = Rperiod;
 
   sum = 0;
   for(i = length; i >= 1  ; i--)
   {
     lengthvar = length + 1;
     lengthvar /= 3;
     tmp = 0;
     switch (prMode)
     {
     case 0: pr = Close[length-i+shift];break;
     case 1: pr = Open[length-i+shift];break;
     case 2: pr = High[length-i+shift];break;
     case 3: pr = Low[length-i+shift];break;
     case 4: pr = (High[length-i+shift] + Low[length-i+shift])/2;break;
     case 5: pr = (High[length-i+shift] + Low[length-i+shift] + Close[length-i+shift])/3;break;
     case 6: pr = (High[length-i+shift] + Low[length-i+shift] + Close[length-i+shift] + Close[length-i+shift])/4;break;
     }
     tmp = ( i - lengthvar)*pr;
     sum+=tmp;
    }
    
    wt = MathFloor(sum*6/(length*(length+1))/Point)*Point; 
    
    return(wt);
}

double NonLag(int RPeriod, int myLen, double myPhase, int myShift)
{

   int i;
   double alfa, beta, t, Sum, Weight,g;
   double myPrice;
   double Coeff =  3*pi;
   
      Weight=0; Sum=0; t=0;
       
      for (i=0;i<=myLen-1;i++)
	   { 
        g = 1.0/(Coeff*t+1);   
        if (t <= 0.5 ) g = 1;
        beta = MathCos(pi*t);
        alfa = g * beta;
        myPrice = iMA(NULL,0,1,0,MODE_SMA,MAAppliedPrice,myShift+i); 
        Sum += alfa*myPrice;
        Weight += alfa;
        if ( t < 1 ) t += 1.0/(myPhase-1); 
        else if ( t < myLen-1 )  t += (2*Cycle-1)/(Cycle*RPeriod-1);
      }
	   if (Weight > 0) Weight = (1.0+Deviation/100)*Sum/Weight;
      Weight = MathFloor(Weight/Point)*Point;
      return (Weight);

}

//+------------------------------------------------------------------+
//| Rate of Change Smoothed                                          |
//+------------------------------------------------------------------+
int start()
  {
   int limit;
   double ROC, MA_Cur, MA_Prev;
   int counted_bars=IndicatorCounted();
//---- check for possible errors
   if(counted_bars<0) return(-1);
//---- last counted bar will be recounted
   if(counted_bars>0) counted_bars--;
   limit=Bars-counted_bars;
//---- ROC calculation
   for(int i=0; i<limit; i++)
   {
      if (MAType == 4)
      {
        MA_Cur = LSMA(MAPeriod, MAAppliedPrice,i);
        MA_Prev = LSMA(MAPeriod, MAAppliedPrice,i+RPeriod);
      }
      else if (MAType == 5)
      {
        MA_Cur = NonLag(MAPeriod, Len, Phase, i);
        MA_Prev = NonLag(MAPeriod, Len, Phase, i+RPeriod);
      }
      else
      {
        MA_Cur = iMA(NULL,0,MAPeriod,0,MAMode, MAAppliedPrice,i);
        MA_Prev = iMA(NULL,0,MAPeriod,0,MAMode, MAAppliedPrice,i+RPeriod);
      }
      ROC=MA_Cur-MA_Prev;
      if (UsePercent)
      {
        RateOfChange[i] = 100 * ROC / MA_Prev; 
      }
      else
      {
        RateOfChange[i] = NormalizeDouble(ROC/Point,1);
      }
   }
      
//---- done
   return(0);
  }



Sample





Analysis



Market Information Used:

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


Indicator Curves created:

Implements a curve of type DRAW_LINE


Indicators Used:

Moving average indicator


Custom Indicators Used:

Order Management characteristics:

Other Features: