A volume-weighted momentum oscillator bounded between 0 and 100.
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.
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.
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.
//@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.
Educational only — not financial advice, not a recommendation to trade. No indicator is predictive; trading involves substantial risk of loss.