Mfi cross Williams percentage

 

Hi Guys

Im trying to get an indicator to draw an arrow when the MFI crosses the WILLIAMS Percentage. But cant seem to get it rite, the only thing i can think of is because of the value axis because the MFI goes from 0 up to 100 and the Williams percentage goes 100 to down 0, iv tried adjusting to -100 but I don't get arrows on the cross at extreme overbought or oversold levels.

whats the best way around this issue?


Many Thanks

#include <stdlib.mqh>
#include <stderror.mqh>

//--- indicator settings
#property indicator_chart_window
#property indicator_buffers 2

#property indicator_type1 DRAW_ARROW
#property indicator_width1 1
#property indicator_color1 0xFFAA00
#property indicator_label1 "Buy"

#property indicator_type2 DRAW_ARROW
#property indicator_width2 1
#property indicator_color2 0x0000FF
#property indicator_label2 "Sell"

//--- indicator buffers
double Buffer1[];
double Buffer2[];

extern int Period1 = 14;
extern int Shift = 0;
extern int Period2 = 14;
extern int Shift2 = 0;
double myPoint; //initialized in OnInit

void myAlert(string type, string message)
  {
   if(type == "print")
      Print(message);
   else if(type == "error")
     {
      Print(type+" | mfi cross @ "+Symbol()+","+IntegerToString(Period())+" | "+message);
     }
   else if(type == "order")
     {
     }
   else if(type == "modify")
     {
     }
  }

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {   
   IndicatorBuffers(2);
   SetIndexBuffer(0, Buffer1);
   SetIndexEmptyValue(0, EMPTY_VALUE);
   SetIndexArrow(0, 241);
   SetIndexBuffer(1, Buffer2);
   SetIndexEmptyValue(1, EMPTY_VALUE);
   SetIndexArrow(1, 242);
   //initialize myPoint
   myPoint = Point();
   if(Digits() == 5 || Digits() == 3)
     {
      myPoint *= 10;
     }
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime& time[],
                const double& open[],
                const double& high[],
                const double& low[],
                const double& close[],
                const long& tick_volume[],
                const long& volume[],
                const int& spread[])
  {
   int limit = rates_total - prev_calculated;
   //--- counting from 0 to rates_total
   ArraySetAsSeries(Buffer1, true);
   ArraySetAsSeries(Buffer2, true);
   //--- initial zero
   if(prev_calculated < 1)
     {
      ArrayInitialize(Buffer1, EMPTY_VALUE);
      ArrayInitialize(Buffer2, EMPTY_VALUE);
     }
   else
      limit++;
   
   //--- main loop
   for(int i = limit-1; i >= 0; i--)
     {
      if (i >= MathMin(5000-1, rates_total-1-50)) continue; //omit some old rates to prevent "Array out of range" or slow calculation   
      
      //Indicator Buffer 1
      if(iMFI(NULL, PERIOD_CURRENT, Period1, Shift+i) > iWPR(NULL, PERIOD_CURRENT, Period2, Shift2+i)
      && iMFI(NULL, PERIOD_CURRENT, Period1, Shift+i+1) < iWPR(NULL, PERIOD_CURRENT, Period2, Shift2+i+1) //Money Flow Index crosses above William's Percent Range
      )
        {
         Buffer1[i] = Low[1+i]; //Set indicator value at Candlestick Low
        }
      else
        {
         Buffer1[i] = EMPTY_VALUE;
        }
      //Indicator Buffer 2
      if(iMFI(NULL, PERIOD_CURRENT, Period1, Shift+i) < iWPR(NULL, PERIOD_CURRENT, Period2, Shift2+i)
      && iMFI(NULL, PERIOD_CURRENT, Period1, Shift+i+1) > iWPR(NULL, PERIOD_CURRENT, Period2, Shift2+i+1) //Money Flow Index crosses below William's Percent Range
      )
        {
         Buffer2[i] = High[1+i]; //Set indicator value at Candlestick High
        }
      else
        {
         Buffer2[i] = EMPTY_VALUE;
        }
     }
   return(rates_total);
  }
//+------------------------------------------------------------------+
 

I think "WPR + 100" should do it.

But before that, I think you need to create an indicator and verify whether it is really practical or not,

and if so, what settings would be best.

 
Nagisa Unada #:

I think "WPR + 100" should do it.

But before that, I think you need to create an indicator and verify whether it is really practical or not,

and if so, what settings would be best.

Hi Nagisa,


Thanks for your reply mate, just tried that still no joy, i tried the -100  but the arrows dont show in overbought and oversold areas. settings will be step two, i will cycle through the best inputs using a software.

 
shabaz #:

Hi Nagisa,


Thanks for your reply mate, just tried that still no joy, i tried the -100  but the arrows dont show in overbought and oversold areas. settings will be step two, i will cycle through the best inputs using a software.


Just substitute Williams for Stochastic with no smoothing.  It's the same as Williams except it has  the same values as MFI, which solves the issue.


iStochastic(NULL, PERIOD_CURRENT,Period2,1,1,MODE_SMA,0,MODE_MAIN,i)
Files:
MFI_sto.mq4  4 kb
 
maximo #:


Just substitute Williams for Stochastic with no smoothing.  It's the same as Williams except it has  the same values as MFI, which solves the issue.


Thank you Maximo, will check it out.

Reason: