◆ New — Strategy Validator, Code Fixer & Prop Compliance Checker are live. Try one free →
Home / Indicators / Money Flow Index (MFI)
Momentum indicator

Money Flow Index (MFI)

A volume-weighted momentum oscillator bounded between 0 and 100.

Illustrative diagram — not live market data.

What it is

The Money Flow Index (MFI) is a momentum oscillator that combines price and volume to gauge buying and selling pressure over a chosen lookback period. It is often described as a "volume-weighted RSI" because it shares RSI's bounded 0-100 scale but factors trading volume into its calculation rather than relying on price alone. The default period is 14. Like all indicators, MFI is descriptive, not predictive: it summarizes past price and volume and does not forecast future prices. All trading carries the risk of loss.

How it works

For each bar, MFI starts from the typical price ((high + low + close) divided by 3) and multiplies it by that bar's volume to get "raw money flow." When the typical price is higher than the previous bar's, that money flow is counted as positive; when it is lower, it is counted as negative. Over the lookback window (default 14 bars), the indicator sums the positive flows and the negative flows, forms a money-flow ratio between them, and converts that ratio into a value from 0 to 100. Because volume is part of the math, the same price move on heavy volume moves MFI more than the same move on light volume.

How traders read it

Common settings

Default length is 14. Overbought/oversold reference lines are commonly drawn at 80/20 (some traders use 90/10 for stricter extremes), with 50 as an optional midline. Shorter lengths (e.g. 7-10) increase sensitivity; longer lengths (e.g. 21+) smooth the line. These are conventions for context, not settings that improve outcomes.

Strengths

Pitfalls to watch

Pine v6 example

//@version=6
indicator("Money Flow Index", shorttitle="MFI")

length = input.int(14, "Length", minval=1)

// ta.mfi(series, length): standard MFI passes the typical price (hlc3)
mfi = ta.mfi(hlc3, length)

plot(mfi, "MFI", color=color.blue)
hline(80, "Overbought", color=color.gray, linestyle=hline.style_dashed)
hline(20, "Oversold", color=color.gray, linestyle=hline.style_dashed)
hline(50, "Midline", color=color.new(color.gray, 60))

Pro tip: Because MFI relies on volume, sanity-check the volume feed for your instrument before reading it. On markets with weak or synthetic volume data the indicator can mislead, so confirm what your data source actually reports rather than assuming the reading reflects real participation.

Built an indicator from this? Run it through the Validator to catch look-ahead bias and repainting, or convert a strategy to Pine Script.

Educational only — not financial advice, not a recommendation to trade. No indicator is predictive; trading involves substantial risk of loss.

Catch the bug that compiles.Run auditGet Pro