The Money Flow Index (MFI) is an oscillator that uses both price and volume to measure buying and selling pressure. Created by Gene Quong and Avrum Soudack, MFI is also known as volume-weighted RSI. MFI starts with the typical price for each period. Money flow is positive when the typical price rises (buying pressure) and negative when the typical price declines (selling pressure). A ratio of positive and negative money flow is then plugged into an RSI formula to create an oscillator that moves between zero and one hundred. As a momentum oscillator tied to volume, the Money Flow Index (MFI) is best suited to identify reversals and price extremes with a variety of signals.
As a volume-weighted version of RSI, the Money Flow Index (MFI) can be interpreted similar to RSI. The big difference is, of course, volume. Because volume is added to the mix, the Money Flow Index will act a little differently than RSI. Theories suggest that volume leads prices. RSI is a momentum oscillator that already leads prices. Incorporating volume can increase this lead time.
Quong and Soudack identified three basic signals using the Money Flow Index. First, chartists can look for overbought or oversold levels to warn of unsustainable price extremes. Second, bullish and bearish divergence can be used to anticipate trend reversals. Third, failure swings at 80 or 20 can also be used to identify potential price reversals. For this article, the divergences and failure swings are be combined to create one signal group and increase robustness.
Overbought and oversold levels can be used to identify unsustainable price extremes. Typically, MFI above 80 is considered overbought and MFI below 20 is considered oversold. Strong trends can present a problem for these classic overbought and oversold levels. MFI can become overbought (>80) and prices can simply continue higher when the uptrend is strong. Conversely, MFI can become oversold (<20) and prices can simply continue lower when the downtrend is strong. Quong and Soudack recommended expanding these extremes to further qualify signals. A move above 90 is truly overbought and a move below 10 is truly oversold. Moves above 90 and below 10 are rare occurrences that suggest a price move is unsustainable. Admittedly, many stocks will trade for a long time without reaching the 90/10 extremes. However, chartists can use the StockCharts.com scan engine to find those that do. Links to such scans are provided at the end of this article.
Failure swings and divergences can be combined to create more robust signals. A bullish failure swing occurs when MFI becomes oversold below 20, surges above 20, holds above 20 on a pullback and then breaks above its prior reaction high. A bullish divergence forms when prices move to a lower low, but the indicator forms a higher low to show improving money flow or momentum.
The Money Flow Index is a rather unique indicator that combines momentum and volume with an RSI formula. RSI momentum generally favors the bulls when the indicator is above 50 and the bears when below 50. Even though MFI is considered a volume-weighted RSI, using the centerline to determine a bullish or bearish bias does not work as well. Instead, MFI is better suited to identify potential reversals with overbought/oversold levels, bullish/bearish divergences and bullish/bearish failure swings. As with all indicators, MFI should not be used by itself. A pure momentum oscillator, such as RSI, or pattern analysis can be combined with MFI to increase signal robustness.
//+------------------------------------------------------------------+ //| Money Flow Index.mq4 | //| Copyright © 2005, MetaQuotes Software Corp. | //| http://www.metaquotes.net/ | //+------------------------------------------------------------------+ #property copyright "Copyright © 2005, MetaQuotes Software Corp." #property link "http://www.metaquotes.net/" #property indicator_separate_window #property indicator_minimum 0 #property indicator_maximum 100 #property indicator_level1 20 #property indicator_level2 80 #property indicator_buffers 1 #property indicator_color1 Blue //---- input parameters extern int ExtMFIPeriod=14; //---- buffers double ExtMFIBuffer[]; //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int init() { string sShortName; //---- SetIndexBuffer(0,ExtMFIBuffer); //---- indicator line SetIndexStyle(0,DRAW_LINE); //---- name for DataWindow and indicator subwindow label sShortName="MFI("+ExtMFIPeriod+")"; IndicatorShortName(sShortName); SetIndexLabel(0,sShortName); //---- first values aren't drawn SetIndexDrawBegin(0,ExtMFIPeriod); //---- return(0); } //+------------------------------------------------------------------+ //| Money Flow Index | //+------------------------------------------------------------------+ int start() { int i,j,nCountedBars; double dPositiveMF,dNegativeMF,dCurrentTP,dPreviousTP; //---- insufficient data if(Bars<=ExtMFIPeriod) return(0); //---- bars count that does not changed after last indicator launch. nCountedBars=IndicatorCounted(); //---- i=Bars-ExtMFIPeriod-1; if(nCountedBars>ExtMFIPeriod) i=Bars-nCountedBars-1; while(i>=0) { dPositiveMF=0.0; dNegativeMF=0.0; dCurrentTP=(High[i]+Low[i]+Close[i])/3; for(j=0; j<ExtMFIPeriod; j++) { dPreviousTP=(High[i+j+1]+Low[i+j+1]+Close[i+j+1])/3; if(dCurrentTP>dPreviousTP) dPositiveMF+=Volume[i+j]*dCurrentTP; else { if(dCurrentTP<dPreviousTP) dNegativeMF+=Volume[i+j]*dCurrentTP; } dCurrentTP=dPreviousTP; } //---- if(dNegativeMF!=0.0) ExtMFIBuffer[i]=100-100/(1+dPositiveMF/dNegativeMF); else ExtMFIBuffer[i]=100; //---- i--; } //---- return(0); } //+------------------------------------------------------------------+
Comments