Author: www.forex-tsd.com
0 Views
0 Downloads
0 Favorites
rsi_filter
//+------------------------------------------------------------------+
//|                                                   rsi filter.mq5 |
//|                                                           mladen |
//+------------------------------------------------------------------+
#property copyright "www.forex-tsd.com"
#property link      "www.forex-tsd.com"

#property indicator_separate_window
#property indicator_buffers 2
#property indicator_plots   1
#property indicator_label1  "rsi filter"
#property indicator_type1   DRAW_COLOR_HISTOGRAM
#property indicator_color1  clrDeepSkyBlue,clrPaleVioletRed,clrDimGray
#property indicator_style1  STYLE_SOLID
#property indicator_width1  2
#property indicator_minimum -1.1
#property indicator_maximum +1.1

//
//
//
//
//

input int RsiPeriod = 14; // Rsi period :

//
//
//
//
//

double FltBuffer[];
double ClrBuffer[];

//+------------------------------------------------------------------
//|                                                                  
//+------------------------------------------------------------------
//
//
//
//
//

int OnInit()
{
   SetIndexBuffer(0,FltBuffer,INDICATOR_DATA); PlotIndexSetInteger(0,PLOT_COLOR_INDEXES,3);
   SetIndexBuffer(1,ClrBuffer,INDICATOR_COLOR_INDEX); 
   IndicatorSetString(INDICATOR_SHORTNAME,"Rsi filter ("+(string)RsiPeriod+")");
      return(0);
}

//+------------------------------------------------------------------
//|                                                                  
//+------------------------------------------------------------------
//
//
//
//
//

double RsiBuffer[];
double ChgBuffer[];
double TotBuffer[];
double TrnBuffer[];
double PrcBuffer[];
int OnCalculate (const int rates_total,
                 const int prev_calculated,
                 const int begin,
                 const double& price[] )
{
   if (ArraySize(RsiBuffer)!=rates_total)
   {
      ArrayResize(RsiBuffer,rates_total);
      ArrayResize(ChgBuffer,rates_total);
      ArrayResize(TotBuffer,rates_total);
      ArrayResize(TrnBuffer,rates_total);
      ArrayResize(PrcBuffer,rates_total);
   }
   double alpha = 1.0 /(double)RsiPeriod;

   //
   //
   //
   //
   //

   for (int i=(int)MathMax(prev_calculated-1,1); i<rates_total; i++)
   {
      PrcBuffer[i] = price[i]; if (price[i] == EMPTY_VALUE) PrcBuffer[i] = 0;
      if (i<RsiPeriod)
         {
            int k;double sum = 0; for (k=0; k<RsiPeriod && (i-k-1)>=0; k++) sum += MathAbs(PrcBuffer[i-k]-PrcBuffer[i-k-1]);
            if (k>0)
            {
               ChgBuffer[i] = (PrcBuffer[i]-PrcBuffer[0])/k;
               TotBuffer[i] = sum/k;
            }
         }
      else
         {
            double change = PrcBuffer[i]-PrcBuffer[i-1];
               ChgBuffer[i] = ChgBuffer[i-1] + alpha*(        change  - ChgBuffer[i-1]);
               TotBuffer[i] = TotBuffer[i-1] + alpha*(MathAbs(change) - TotBuffer[i-1]);
         }

      if (TotBuffer[i] != 0)
            RsiBuffer[i] = 50.0*((ChgBuffer[i]/TotBuffer[i])+1);
      else  RsiBuffer[i] = 0;
   
      //
      //
      //
      //
      //
 
      FltBuffer[i] = EMPTY_VALUE;
      TrnBuffer[i] = TrnBuffer[i-1];
        if (RsiBuffer[i] > 70) TrnBuffer[i] =  1;
        if (RsiBuffer[i] < 30) TrnBuffer[i] = -1;
        if (TrnBuffer[i] ==  1 && RsiBuffer[i] > 40) { FltBuffer[i] =  1; ClrBuffer[i] = 0; }
        if (TrnBuffer[i] == -1 && RsiBuffer[i] < 60) { FltBuffer[i] = -1; ClrBuffer[i] = 1; }
   }
   
   //
   //
   //
   //
   //

   return(rates_total);
}

Comments