All posts
PublishedUpdatedByMA Disparityoscillatormean reversionindicatorbacktestUSD/JPY

MA Disparity Mean Reversion: 4,320 Settings Tested

4,320 disparity index settings tested on USD/JPY. The 5% level textbooks quote was never reached on a 25-period line, and the zero line is a moving average crossover.

The disparity index measures how far the close sits from its own moving average, as a percentage of that average. There is one line of arithmetic behind it:

disparity = (close − moving average) / moving average × 100

Some platforms plot close / average × 100 instead, which is the same series with 100 added to it. A reading of +5 here is a reading of 105 there.

The level quoted with it is almost always the same one: a 25-period average, and 5% as the point where price has gone too far and should come back. That number comes from daily equity charts.

So the first thing worth measuring is whether it exists here. On USD/JPY across 2024 and 2025, on 15-minute, hourly and 4-hour bars, not one bar printed a 25-period disparity of 5%.

0%1%2%3%4%5%M15H1H4timeframe
where nine bars in ten sateverything the line reached in two yearsmedianred line at the textbook 5%; 25-period SMA, 2024-2025
The 5% every article quotes was measured on equities. On USD/JPY the largest reading in two years was 4.54% on 4-hour bars, and 1.94% on 15-minute bars.

What the MA disparity actually measures

The numerator is the distance from the average. The denominator is the price level at the time. Zero means the close is sitting on the line.

That is what separates it from RSI or Stochastics. Those are squeezed into a 0-to-100 frame, so 70 means the same thing on every instrument. This one is not squeezed into anything: it is a fraction of the current price, so the range it reaches depends on the market and on the timeframe.

Measured on a 25-period simple moving average:

TimeframeMedianNine bars in ten2024 max2025 max
15-minute0.09%0.27%1.94%1.94%
Hourly0.19%0.56%2.78%1.67%
4-hour0.41%1.05%4.54%2.35%

Median and the nine-in-ten figure are 2025. The same "5%" is an extreme a 4-hour chart did not reach in two years, and 2.6 times the largest reading a 15-minute chart produced at all.

Does ±5% ever arrive on USD/JPY?

Lengthen the period and 5% does appear. Over both years, three settings out of the thirty measured got there:

TimeframePeriodYearBars past 5%Largest reading that year
4-hour20020244.02%9.60%
4-hour7520240.39%7.08%
Hourly20020240.22%6.25%

All three are 2024. USD/JPY rose 1,632 pips that year with a 2,237-pip range; 2025 fell 56 pips with a 1,900-pip range. In these two years, only periods 75 and above in 2024 crossed 5%.

At the period the level is actually published with, 25, even 3% was reached in only one of six cells: 4-hour bars in 2024, on 0.38% of them.

Is percent of price a stable unit?

It is not. Two measurements say what that unit costs in practice.

One percent is a different number of pips every month

USD/JPY traded between 139.723 and 161.940 in 2024. The same 1% gap is 139.7 pips at the low end of that year and 161.9 pips at the high end. In 2025 the range was 139.923 to 158.663, so 1% ran from 139.9 to 158.7 pips.

The same level fires two to three and a half times as often in one quarter as another

This matters more. A percent threshold and an ATR threshold were each calibrated on the whole year to fire on exactly 20% of its bars, then read quarter by quarter.

0%10%20%30%M15 2024M15 2025H1 2024H1 2025H4 2024H4 2025timeframe and year
measured as a percent of pricemeasured in multiples of ATRvertical line is the 20% each was calibrated to; the bar spans the quietest quarter to the busiest
Both thresholds were set to fire on a fifth of the year. The percent one then spent one quarter under 10% and another over 34%; the ATR one stayed between 16 and 23 everywhere.
TimeframeYearPercent: quietest quarter → busiestATR: quietest quarter → busiest
15-minute202411.4% → 32.4% (2.83x)18.0% → 21.9% (1.22x)
15-minute202512.5% → 28.6% (2.30x)18.0% → 21.8% (1.22x)
Hourly202412.3% → 32.8% (2.66x)17.2% → 21.6% (1.26x)
Hourly202512.8% → 31.3% (2.44x)16.2% → 22.6% (1.40x)
4-hour20249.7% → 34.5% (3.56x)18.5% → 20.9% (1.13x)
4-hour202514.9% → 30.5% (2.05x)16.3% → 22.7% (1.39x)

The percent unit swung more in all six cells. Its quietest quarter came in under 10% and its busiest went over 34%. The ATR unit stayed between 16 and 23 everywhere.

The steadier unit did not make more money

The trading results break that expectation: if percent is the wrong unit, ATR should trade better.

Across 90 cells (the same reading, period, timeframe and year, with each unit allowed its own best level), ATR finished ahead in 26. Comparing medians rather than bests, ATR won 33 of 90.

The reason is trade count. Holding the fire rate steady means firing in quiet markets too. On 15-minute bars the long fade took a median of 29 trades a year in percent and 161 in ATR. As the cost section below shows, cost is trade count times spread, so steadying the rate is also multiplying the bill.

Does it return to zero because price returns?

The average catches up, not the price. "It always comes back to zero" is true. What comes back is the question.

Every bar that pushed the reading past a level was followed forward to the bar the sign flipped, and that round trip was split into the part price moved and the part the average moved. The two shares sum to 100%.

−40−200+20+40+60+80+100M15 2024M15 2025H1 2024H1 2025H4 2024H4 2025timeframe and year
price closed some of itprice widened it insteaddashed line marks 100%, price doing all of it; period 25, the rest is the average catching up
The reading always returns to zero. In five of these six cells the price contributed nothing or less than nothing to getting it there — the average walked up to the price instead.
TimeframeYearPrice's shareAverage's shareBars to zero
15-minute2024−1.6%101.6%20.2
15-minute2025−0.7%100.7%19.5
Hourly2024−26.8%126.8%20.1
Hourly2025−4.0%104.0%16.7
4-hour2024−24.1%124.1%20.6
4-hour2025+9.2%90.8%17.3

Period 25, level 0.25% (0.5% on 4-hour bars). Across all 18 cells, which add periods 10 and 75, the price share was negative in 13. The average's share ran from 61.6% to 139.6%.

Read plainly: price does not have to move at all for the reading to return to zero, because the average is moving towards price the whole time. The "reversion" the indicator is named for is mostly arithmetic.

Counting episodes instead of averaging them changes the picture. Price did end up back in the trade's favour in 52.0% to 78.1% of round trips. More than half come back; the mean is still negative because the ones that do not come back travel much further. The price series therefore shows a high return rate but a negative mean outcome before any trading rule is applied.

Shuffling the bars changes almost nothing

Each close-to-close change was kept exactly once and put in a random order, so the volatility, the drift and the fat tails all belong to the market and only the sequence does not. Period 25, 2025:

TimeframeNine-in-ten (real / shuffled)Share past 0.25%Bars to zero
15-minute0.269% / 0.258%11.9% / 10.9%19.5 / 20.7
Hourly0.558% / 0.521%39.6% / 39.5%16.7 / 17.1
4-hour1.051% / 0.998%69.5% / 67.3%15.2 / 12.7

Nearly identical. The round trip is a property of subtracting a trailing mean of closes from a close, not a property of this market.

One column does separate them. The 99th percentile was 0.563%, 1.129% and 1.997% on real bars against 0.462%, 0.899% and 1.573% on shuffled ones. The extremes belong to the market; the round trip does not.

What is the zero-line cross?

It is a moving average crossover. The denominator is a price and prices are positive, so the sign of the reading is the sign of (close − average). Zero disagreements over three timeframes and five periods, and zero again between the percent and ATR versions of the same reading.

The backtest says the same thing. Running the zero cross against a crossover of the close (a 1-period simple average) and the same N-period average:

PeriodTrades under both trading rulesAnnual net under both trading rules
51,688+1,323.4 pips
101,053+2,007.6 pips
25600+2,227.8 pips
75335+787.0 pips
200268−1,966.8 pips

Hourly bars, 2025. Swapping the simple average for an exponential, weighted, smoothed or Hull average produced the same identity in all five cases.

Reading the zero line is reading a moving average crossover. Adding the disparity has not added a condition.

One cell out of sixty did diverge between the two units: 4-hour bars, 2024, period 200. The ATR basis divides by an average true range over the same window and Wilder's smoothing needs its own window before that settles, so it is given twice the warmup and starts later. The sign never changed; the line simply began on a different bar.

Adding it to a chart

Stated as facts:

  • MT4 / MT5 ship no indicator by this name. What they do ship is Envelopes (Insert > Indicators > Trend > Envelopes), which draws lines at the average times (1 ± d/100): the same calculation, drawn on the price pane instead of underneath it. For the oscillator form, install a distributed .mq4 or .mq5 file.
  • TradingView has community scripts published as "Disparity Index". It is not in the built-in list.
  • Formiq (browser) has it in the indicator list. Period, guide lines and the unit (percent or multiples of ATR) are settings, and the backtest side accepts four readings: level, level fade, break out of ±level, and the zero cross.

The envelope reads wicks; the disparity reads closes

The lower envelope band sits at average × (1 − d/100), so touching the lower band and printing a reading below −d% are the same condition, differing only in which price is judged. The envelope looks at the bar's low and high; the disparity looks at its close.

Entering at the lower line and exiting at the upper one, period 25:

Signal priceYearTimeframeLevelSideTradesAnnual net
Envelope (wick)2025Hourly0.5%Long40+26.8 pips
Disparity (close)2025Hourly0.5%Long31+769.9 pips
Envelope (wick)2024Hourly0.5%Long46+873.0 pips
Disparity (close)2024Hourly0.5%Long29+169.5 pips

Over 36 cells (three timeframes, two years, three levels, both directions) the close never traded more often than the wick: 36 of 36. It finished ahead in 20 of 36. Judging on closes reliably cuts the trade count and does not reliably improve the result.

How this was tested

ItemValue
PairUSD/JPY
Timeframes15-minute, hourly, 4-hour
Periods5, 10, 25, 75, 200
Levels (percent)0.15, 0.3, 0.5, 0.8, 1.2
Levels (ATR)1.0, 1.5, 2.0, 2.5, 3.0
Exit levels (percent)0 (back to the average), 0.15, 0.3
Exit levels (ATR)0, 0.75, 1.5
Averagessimple, exponential, weighted, smoothed, Hull
Windows2024, 2025, first half 2025, second half 2025
Spread0.3 pips
Lot0.1
Fillsat the close
Stops and targetsnone in the sweep, measured separately
Combinations4,320, plus 360 for the averaging grid

Three readings were run:

  1. Fade: past the level, take the other side, and give it back when the reading returns to the average. This opens buys or sells but never both, so the long fade and short fade were swept as separate trading rules.
  2. Break: up through +level opens a long, down through −level a short. Symmetric, so entry and exit share one rule set.
  3. Zero cross: through zero one way opens, through it the other way reverses.

How do the three readings differ?

The fade won around 65% of its trades, the zero cross 24%, and only the hourly zero cross held. 2025, measured in percent:

ReadingTimeframeProfitableMedianMean win rateMedian trades
Fade, long15-minute35/75+0.0 pips65.2%29
Fade, longHourly42/75+110.5 pips"30
Fade, long4-hour60/75+466.2 pips"20
Fade, short15-minute31/75−76.5 pips66.4%23
Fade, shortHourly53/75+201.4 pips"27
Fade, short4-hour63/75+718.9 pips"21
Break15-minute15/25+300.0 pips36.7%37
BreakHourly9/25−749.4 pips"42
Break4-hour8/25−851.6 pips"30
Zero cross15-minute2/5−641.6 pips23.8%2,704
Zero crossHourly4/5+1,323.4 pips"600
Zero cross4-hour1/5−918.6 pips"149

Mean win rate pools the three timeframes. The fade wins about two trades in three and finishes ahead in most cells; the zero cross wins one in four and only survives on hourly bars. Counting settings that were profitable in both years cuts that down hard: 19, 13 and 7 of 75 for the long fade, and 11, 17 and 11 for the short.

Does last year's best still work?

Only one of the four transferred. For each row, the setting with the largest 2025 annual net was applied unchanged to 2024.

ReadingTimeframePeriodEntry levelExit level2025 trades2025 annual net2024 annual net
Fade, long15-minute2000.8%0.15%34+1,368.6 pips+118.9 pips
Fade, longHourly2000.5%0%32+1,327.8 pips−511.2 pips
Fade, long4-hour750.5%0.3%18+1,373.6 pips−394.8 pips
Fade, short4-hour250.8%0.3%21+1,419.2 pips−1,840.1 pips

Only the 15-minute long setting remained profitable in 2024. In the other direction, the 15-minute long fade at period 5 with 0.15% → 0.3% made +2,155.5 pips in 2024 and +255.6 pips in 2025. The median across the same 75 settings in 2025 was 0.0 pips.

Is the 65% win rate real?

On 4-hour bars in 2024, not one of 72 settings kept an edge once the drift came out. The fade only ever opens one side. Hold a long for b bars in a year that rises and it collects the rise, whatever opened it. So the drift an unconditional position of the same length would have earned (the window's total move divided by its bar count, times the bars held) was subtracted from every setting.

TimeframeYearSidePips per tradeDriftIndicator edgeSettings with a positive edge
4-hour2025Long+29.20−1.24+30.4460/69
4-hour2025Short+40.61+1.40+39.2160/70
4-hour2024Long−22.54+46.07−68.610/72
Hourly2024Long−10.91+21.22−32.135/72
Hourly2025Long+10.70−0.74+11.4442/63

On 4-hour bars in 2024, not one of 72 settings had a positive edge left after the drift came out. The ATR version was 0 of 57.

2025 drifted 56 pips and the fade's edge remained positive in 60 of 69 four-hour long settings. In 2024, after a 1,632-pip rise, it was positive in 0 of 72. The 2025 fade result did not carry into 2024.

The short side is the mirror. The 4-hour short in 2024 lost 74.08 pips a trade, of which 76.04 was the drift, leaving an edge of +1.96. Losing money selling into a rising year is not the indicator's doing.

Which average to measure from

The reading is a distance from a moving average, so which average is a real setting. Five were run with everything else held.

As lines first: the share of bars on which each disagrees with the simple average about which side of zero price is on, period 25, 2025.

Average15-minuteHourly4-hour
Exponential7.0%6.5%5.3%
Weighted8.2%8.0%8.3%
Smoothed15.8%15.6%12.0%
Hull36.8%37.1%37.9%

The sign of the Hull-based disparity disagreed with the simple-average disparity on 36.8% to 37.9% of bars. This is not a cosmetic choice.

Across 72 cells (four readings, three timeframes, two years and three periods), the average with the largest annual net was Hull in 24 cells, smoothed in 14, weighted in 13, simple in 11 and exponential in 10. Every method produced the largest result in at least ten cells, so the simple average was not consistently superior.

Filters, stops and the spread

Cost is trade count times spread

No article in this series has found an exception, and there is none here: the two columns agree to the tenth of a pip both are rounded to.

Trading rulePeriodLevelTimeframeYearTradesAnnual net at spread 0Annual net at spread 0.3Difference
Zero cross25015-minute20252,704+169.6 pips−641.6 pips811.2 pips
Zero cross250Hourly2025600+2,407.7 pips+2,227.8 pips179.9 pips
Break25±0.5%Hourly202562−1,662.1 pips−1,680.6 pips18.5 pips

The 15-minute zero cross makes +169.6 pips at zero spread. Its break-even spread is 0.063 pips, so transaction cost turns the rule negative. The same setting on hourly bars breaks even at 4.013 pips.

What the filters did

Hourly, period 25, zero cross:

ConditionYearTradesAnnual net
Baseline2025600+2,227.8 pips
Baseline2024601+2,546.5 pips
ADX ≥ 252025176+554.8 pips
ADX ≥ 252024161+24.9 pips
London + NY2025328+1,793.1 pips
London + NY2024353+892.6 pips
Tokyo2025247+564.3 pips
Tokyo2024210+2,427.2 pips
Stop 40 pips2025558+2,461.7 pips
Stop 40 pips2024559+3,612.6 pips
Target 40 pips2025599+2,403.1 pips
Target 40 pips2024598+1,223.9 pips

No filter improved both years. ADX reduced annual net in both. London and New York produced the larger session result in 2025 (+1,793.1 versus +564.3 for Tokyo), while Tokyo produced the larger result in 2024 (+2,427.2 versus +892.6).

A 40-pip stop improved both. On 15-minute bars a 20-pip stop lifts −641.6 pips to −108.6 (still a loss). The zero cross wins a quarter of its trades with an average win more than three times its average loss, so a stop cuts very few winners.

Notes

  • One pair. The unit is a fraction of price, so the 0.27% / 0.56% / 1.05% figures are USD/JPY's, for these two years, and do not transfer to a pair trading at a different level.
  • The shuffled control is a close-only series. Each bar's high and low collapse onto its close, so it cannot be used for anything that reads wicks, including the envelope comparison above.
  • Fills are at the close with no slippage. A setting that trades 2,700 times a year on 15-minute bars will execute worse than this in practice.

Questions people ask

What is a good disparity index setting for forex?
On USD/JPY in 2025, a 25-period disparity kept nine bars in ten inside 0.27% on 15-minute bars, 0.56% on hourly bars and 1.05% on 4-hour bars. Some fade settings between 0.3% and 0.5% produced the largest annual results in this sweep, but three of the four settings selected on 2025 results lost money when applied to 2024. On the zero cross, periods 10 and 25 on the hourly chart were profitable in both years.
Does the disparity index reach 5% on currency pairs?
Not on a 25-period line. Across 2024 and 2025, on 15-minute, hourly and 4-hour USD/JPY bars, not one bar printed a 25-period disparity of 5% or more. The largest reading in two years was 1.94% on 15-minute bars, 2.78% on hourly bars and 4.54% on 4-hour bars. The 5% figure comes from daily equity charts, where price moves away from a 25-day average by an order of magnitude more.
Why does the disparity index always return to zero?
Mostly because the moving average walks up to the price, not because the price comes back. Splitting each round trip into the part price contributed and the part the average contributed, the price share was negative in 13 of 18 cells measured, meaning price kept moving away while the average closed the gap. The average's share ran from 61.6% to 139.6%.
Is the disparity index zero line the same as a moving average crossover?
Yes. The denominator is a price and prices are positive, so the sign of the reading is the sign of close minus the average. Over three timeframes and five periods there were zero disagreements, and in the backtest the zero cross and a close-versus-average crossover produced identical trade counts and identical pips at every period from 5 to 200 and for all five averaging methods.
Is the disparity index built into MT4 or TradingView?
MT4 and MT5 ship Envelopes (Insert > Indicators > Trend > Envelopes), which draws the same calculation as two lines on the price chart rather than as an oscillator underneath it. The disparity itself is a custom indicator you install as an .mq4 or .mq5 file. TradingView has community scripts under the name Disparity Index. Formiq has it in the chart list and as a backtest condition with four readings.

Formiq is a free browser-based FX terminal with replay practice and no-code backtesting. Open the chart or see what the free plan includes.