Markets › Futures · ES futures

RSI Divergence

Buy when price makes a lower low but the RSI makes a higher low, sell short on the mirror image, with and without a profit target and stop.

ES futures · 60-minute bars · RSI(14), swings 5/5 · Protocol v1.0

Buried · No proven edge

Profitable. The divergence's share is unproven.

BornThe RSI is J. Welles Wilder Jr.'s; divergence is a widely taught setup, no single source
Died7 Oct 2026

Variants tried: 4 · Passed every gate: 0 · Holdout opened: yes (used before this test)

Short answer: not in this test. We backtested RSI Divergence on ES futures in 4 variants, net of costs, and 0 passed every gate. The best result, DV-L-S, made +$48,731 over 281 trades but failed the development t-statistic and the random-entry control. “No proven edge” means a convincing edge was not demonstrated, not that none exists.How much costs took here, compared across all 54 of our tests →Did the same rules work on other markets? The cross-market scoreboard →

00The verdict in three lines

  • The idea is a classic reversal signal: if price makes a new low while the RSI makes a higher low, selling pressure is fading and price tends to turn up (the mirror image for highs).
  • We tested four versions on 6.7 years of ES hourly bars, net of costs. None passed. But the long-only version with the RSI exit made +$48,731 on 281 trades, with a profit factor of 1.50, 1.47 and 3.21 in development, validation and holdout, and a profit in every calendar year. It failed only two of six gates.
  • The two gates it failed are the point. Against our frozen control, random dip-buys below RSI 50 with the same exit earn more than half of the same profit (+$99 a trade against +$173, the 78th percentile), and its development t-statistic is 1.65, below 2.0. But that control was not matched to the signal: after an outside review we found that 48% of the long signals fire with RSI already at or above 50, where the control never trades. Against a control matched on RSI at entry, the same version sits at the 99th percentile. So the divergence's extra contribution has not been convincingly demonstrated, and has not been shown to be zero. The short side lost, and the stop-and-target versions lost. Cause of death: No proven edge

01The claim

A divergence compares what price is doing with what a momentum indicator is doing. When price makes a lower low but the RSI makes a higher low, the downward push is weakening, and the move is read as a likely turn up. When price makes a higher high but the RSI makes a lower high, the mirror image is read as a likely turn down. The RSI was created by J. Welles Wilder Jr. Divergence is widely taught, and we found no single source for this exact rule set, so we describe it as a common setup and credit nobody for it. We test our own exact definition, at common defaults, with nothing tuned. We test rules, not people.

Done by eye, a divergence is a subjective chart pattern. We had to turn it into exact rules, and that is one reading of it, not the only one.

02The rules we tested (frozen 7 Oct 2026, before any run)

  • Indicator: RSI(14) on hourly closes. A swing low (or high) is a bar whose low (or high) is the lowest (or highest) of the 5 bars on each side. A swing is only known 5 bars later, so each signal is confirmed on that bar and no signal uses future information.
  • Bullish divergence (long): a new swing low below the previous swing low, while the RSI at it is above the RSI at the previous one, with the two swings 5 to 60 bars apart. Bearish divergence (short): the mirror image.
  • Simple exit (S): a long leaves when the RSI closes above 50, a short when it closes below 50. No stop, no target.
  • Full exit (F): a stop 2 × ATR(14), a target 4 × ATR(14) and a 24-bar time limit.
  • One position at a time, around the clock, flat before the weekend. Four variants declared up front: DV-LS-S, DV-L-S, DV-LS-F, DV-L-F.

The full dated specification is in the files at the bottom.

03Data and costs

PeriodDates
Development2020-01-01 to 2023-12-31
Validation2024-01-01 to 2025-03-31
Holdout (already used)2025-04-01 to 2026-09-25

Costs: $5.76 commission per round trip and 1 tick ($12.50) slippage on every fill, 1 contract: about $30.80 per trade.

Few signals. Over 6.7 years the rules found 281 long and 346 short trades in the simple version, which is a small sample, and the holdout has only 59 long trades. Treat the error bars as wide.

Engine check: the simulation engine reproduces our RSI(2) Dip Buyer's published trades exactly. Honest caveat on the holdout: the 2025-26 ES data was used in earlier tests, so it can't count as clean. With four variants the base bar applies. Data: ES 1-minute, back-adjusted. Raw vendor data is not published.

04Results: every variant, net of costs

VariantNet, allGross, allTradesPF devt (dev)PF valPF holdout*vs randomTop 10 removed
DV-LS-S+$32,255+$51,3886221.040.211.071.8679.4th+$2,450
DV-L-S+$48,731+$57,3752811.501.651.473.2178.2th+$24,564
DV-LS-F-$43,014-$24,9275880.95-0.380.710.9424.4th-$95,543
DV-L-F-$6,904+$1,4322710.98-0.110.811.0725.6th-$47,596

* Holdout already used before this test. PF = profit factor. "vs random" = percentile of the average net $ per trade among 500 random runs that enter on the same side of RSI 50 at random hours, with the same exits (the control frozen before the run; two alternative controls are in the control check under “The gates”).

What the best version looks like

  • DV-L-S (long only, leave at RSI 50) was profitable in every one of the seven calendar years (2020: +$12,813, 2021: +$1,650, 2022: +$2,057, 2023: +$5,154, 2024: +$11,636, 2025: +$5,155, 2026: +$10,266). Its 95% range for the average trade is +$50 to +$293, and the chance that the true average is zero or negative is 0.2%.
  • Risk: its worst drawdown was -$10,214 on closed trades, or about -$12,709 counting open losses, and its worst single trade lost $6,118. It spent 335 days below a previous high.
  • The control tells part of the story: random entries below RSI 50, with the same exit, earned a median +$99 a trade. That is more than half of what the divergence earned, and a signal that is only at the 78th percentile against it has not shown that the divergence is doing the work. This control is not matched to the signal, though, as the control check below explains, so it understates the divergence.

Does a profit target and stop help? Judge profit and risk together

VariantNetMax drawdown, closed tradesMax drawdown incl. open losses (approx.)Worst open loss inside a trade
DV-LS-S+$32,255-$30,412-$32,727-$9,200
DV-L-S+$48,731-$10,214-$12,709-$8,650
DV-LS-F-$43,014-$66,921-$68,446-$9,500
DV-L-F-$6,904-$24,641-$25,098-$6,175

It does not. The fixed stop and target turned a profit into a loss in both cases: long only went from +$48,731 to -$6,904, and long and short from +$32,255 to -$43,014. What the stop did to the worst losses was mixed. Long only: the worst closed trade went from -$6,118 to -$6,101 and the worst open loss inside a trade from -$8,650 to -$6,175. Long and short: the worst closed trade went from -$9,156 to -$6,586 and the worst open loss from -$9,200 to -$9,500, so there the stop did not reduce it, because a bar's extreme can go beyond the stop price before the stop fills. The stop was hit in 49% of the long-only trades and the target in only 16%. The profit in the simple version came from the RSI exit letting trades run back to the middle, and a fixed 2-to-4 box cut that off.

Longs and shorts

VariantLongs netLongs PFShorts netShorts PF
DV-LS-S+$47,4601.70-$15,2050.88
DV-LS-F-$12,4350.94-$30,5800.87

The same pattern as every ES test on this site at the time (7 to 8 October 2026): the long side earns, the short side loses (-$15,205 in the simple version). Because an edge can genuinely differ by direction, we do not judge it by this split. We judge it by the random-entry comparison above.

  • Confidence: the chance that the true average trade is zero or negative is 14% (DV-LS-S), 0% (DV-L-S), 84% (DV-LS-F), 58% (DV-L-F).

05The curves

DV-L-S: long only, leave at RSI 50

DEVVALHOLDOUT-20k0k20k40k60k2020202120222023202420252026

DV-LS-S: long and short, leave at RSI 50

DEVVALHOLDOUT-60k-40k-20k0k20k40k60k2020202120222023202420252026
Net equityRandom medianRandom 5th to 95th percentile

In both charts the strategy stays inside the random band in 81 and 80 of 81 months. The grey median line in the first chart rises almost as steadily as the strategy line does: random dip-buys on the same side of RSI 50 climb nearly as well. That is the visual form of the 78th-percentile result under the frozen control. Against a control matched on RSI at entry, the picture is different (see the control check below).

06The gates

GateDV-LS-SDV-L-SDV-LS-FDV-L-F
PF ≥ 1.2 in validationfailpassfailfail
≥ 50 trades per periodpasspasspasspass
t ≥ 2.0 on developmentfailfailfailfail
Above 95th pct of random runsfailfailfailfail
Positive without top-10 tradespasspassfailfail
Holdout net positive (used)passpassfailpass
Gates passed (all 6 needed)3 / 64 / 61 / 62 / 6

DV-L-S clears sample size, validation, the ten-best-trades test and the holdout, and fails the development t-statistic (1.65, 2.0 needed) and the random-entry gate. The long-and-short simple version fails three gates, and both full versions fail four or five.

Control check after review (added 8 Oct 2026)

An outside review pointed out that the random control and the real signal were not conditioned alike. Our frozen control buys only when RSI(14) is below 50 (the side a reversal would take), but the divergence signal has no such condition when it is confirmed. We checked, and the review was right. Of the 281 long signals in DV-L-S, 134 (48%) fired with RSI at or above 50. The exit (RSI above 50) is already met there, so those trades were over after about 1.8 bars and earned about +$4 a trade. The 147 signals that fired below 50 held about 9.5 bars and earned about +$328 a trade. The frozen control only makes trades of the second kind, which made it a harder bar than the signal's own mix of trades.

We re-ran the comparison with two alternative controls, same exits and same trade count: no RSI condition at all, and matched on RSI at entry (the control enters with the same spread of RSI values as the real signals). Percentile of the average net $ per trade among 500 random runs:

VariantFrozen control (as published)No RSI conditionMatched on RSI at entry
DV-LS-S79.4th90.6th90.6th
DV-L-S78.2th98.8th99.2th
DV-LS-F24.4th32.0th29.8th
DV-L-F25.6th32.8th30.6th

Percentiles move by a point or two between runs because the random trade count is calibrated to the real count. Code and output: dv_control_check.js, dv_control_check.txt.

What this changes. Our earlier wording, that the money comes from buying below RSI 50 and “not from the divergence”, was not supported, and it has been removed. Against a control matched on RSI at entry, the long-only simple version sits at the 99th percentile, and the long-and-short simple version at the 91st. Both full versions stay well below.

What it does not change. The gate results above stay as frozen: the control was set before the run, and swapping controls after seeing a result would be its own kind of cherry-picking. The development t-statistic is still 1.65 (2.0 needed), the sample is still 281 trades, and the verdict is still No proven edge. The honest summary is that the divergence's extra contribution has not been convincingly demonstrated, and has not been shown to be zero. Of the four versions, only the long-only simple version stays above 95% of random runs under both alternative controls.

One more look, after the fact. The 147 signals that fired below RSI 50 averaged +$328 a trade (development +$241 over 91 signals, validation +$203 over 27 signals, holdout +$720 over 29 signals), against a median +$99 for random entries below RSI 50 with the same exit: the 94th percentile. We split the signals by RSI after seeing the results, and the holdout is already used, so this is a hypothesis for a clean test, not a finding.

FXOther markets: the same rules on four currency pairs (added 8 Oct 2026)

We ran this strategy's four variants, with the same rules and default parameters, on EURUSD, GBPUSD, USDJPY and AUDUSD (spot FX, 60-minute bars, 2004 to September 2026) under a specification dated before any result. Costs are about 1 pip per round trip (1.2 on USDJPY). The table shows each result in pips after costs and how many of the six gates it failed. This strategy is one of six in the full FX study.

VariantEURUSDGBPUSDUSDJPYAUDUSDPairs net positivePairs passing every gate
DV-LS-S-1,081 · 5 of 6 failed-1,913 · 5 of 6 failed-2,210 · 5 of 6 failed+1,268 · 2 of 6 failed1 of 40 of 4
DV-L-S+633 · 4 of 6 failed-1,241 · 5 of 6 failed-1,664 · 5 of 6 failed+94 · 5 of 6 failed2 of 40 of 4
DV-LS-F+662 · 5 of 6 failed-3,162 · 4 of 6 failed-1,290 · 4 of 6 failed-1,166 · 5 of 6 failed1 of 40 of 4
DV-L-F+3,044 · 2 of 6 failed-2,022 · 4 of 6 failed+179 · 4 of 6 failed-443 · 5 of 6 failed2 of 40 of 4

16 variant-pair results, 0 passed every gate. 6 finished net positive after costs and 12 were positive before costs, so costs turned 6 of them into losses. The highest development t-statistic was 1.61 against the 2.5 required. The closest call was EURUSD DV-L-F, which failed 2 of 6 gates (net +3,044 pips). On ES the verdict for this strategy was Buried · No proven edge, and nothing here changes it.

07Cause of death

VariantCauseWhy
DV-LS-SNo proven edgeShort divergences lose, and it does not beat random entries at the 95% level.
DV-L-SNo proven edgeProfitable, but the development t-statistic is 1.65 (2.0 needed) and it sits at the 78th percentile against the frozen control. Against a control matched on RSI at entry it sits at the 99th, so whether the divergence adds anything is unresolved.
DV-LS-FNo proven edgeNegative before costs (-$24,927) and no better than random entries.
DV-L-FCostsA small gross profit (+$1,432) turned into a net loss by about $31 a trade.

What this test covers, exactly: an entry when a divergence between two swings is confirmed, 5 bars after the second swing, on ES hourly bars. It does not test entering earlier, waiting for a price trigger after the divergence, or hidden (continuation) divergence. The results do not automatically carry over to other markets or to 1 to 5-minute charts.

What we did not test: other RSI lengths, other swing sizes and spacings, a requirement that the RSI be oversold or overbought, a trend filter, daily bars and other markets. We used common defaults on purpose, because tuning raises the odds of finding a lucky setting, not a real edge.

What would change our mind: a version that clears the random-entry gate and a development t-statistic of 2.0 together, ideally tested on data we haven't looked at, with a control matched on RSI at entry, and with the long-only version declared in advance. Separately, the finding that random dip-buys below RSI 50 are themselves profitable on ES hourly deserves its own test. We did not pre-register it as a strategy, and a rising market flatters it, so we make no claim about it here.

TWhat this shows, and what to take into your own tests

What the results show

  • The long-only simple version was profitable in every period (profit factor 1.50, 1.47 and 3.21 in development, validation and holdout) and in all seven calendar years. Its 95% range for the average trade, +$51 to +$293, sits above zero.
  • Against our frozen control (random entries below RSI 50, same exit), the signal earned +$173 a trade against a median +$99, only the 78th percentile. But about half of the real signals fire with RSI already at or above 50, where that control never trades. Against a control matched on RSI at entry, the same version sits at the 99th percentile (the 91st for the long-and-short version).
  • The short side lost money, and the versions with a fixed stop and target lost money too.

What remains unknown

  • Whether the divergence adds anything beyond where the RSI already is. The frozen control says not clearly (78th percentile), a matched control says yes (99th), and the development t-statistic (1.65) is below 2. We have not resolved this.
  • Whether the underlying dip-buying effect (buy below RSI 50, sell above) is real or just ES drifting up in this 6.7-year rising market. We did not test it as a strategy of its own.
  • Other RSI lengths, swing sizes and spacings, other markets and timeframes. We used common defaults, on purpose.
  • Only 281 long trades (59 in the holdout), so even the good numbers carry wide error bars.

Why it failed

The evidence is unresolved rather than negative. The development t-statistic (1.65) is below 2, the frozen control puts the signal at the 78th percentile (95th required), and the sample is small (281 trades). A control matched on RSI at entry gives the 99th percentile, so the divergence's extra contribution has not been convincingly demonstrated, and it has not been shown to be zero. Short divergences lose, and replacing the RSI exit with a fixed stop and target turns the profit into a loss.

What you can apply to your own tests

  • A profitable result is not the same as a result that comes from your signal. Test it against random entries with the same exit, and make the random entries match the conditions your signal trades under.
  • Check what your control conditions on. Ours bought only below RSI 50, while about half of the real signals fired above it, so the control was a harder bar than the signal's own mix of trades. The choice of control moved the answer from the 78th to the 99th percentile.
  • Be suspicious when the exit does most of the work. Here "leave when RSI crosses 50" alone makes random dip-buys profitable.
  • Respect small samples: 281 trades is few, and the best period had 59.
  • If a simple version works and the stop-and-target version does not, ask which part of the trade carries the profit.

A note on the numbers: drawdown figures are measured on closed trades unless a table says it includes open losses. Open losses inside a trade are not counted in a closed-trade drawdown, so real account risk is higher, especially for systems with no stop. Backtests are not live trading.

FAQCommon questions

Does the RSI divergence strategy work?

Not in this test. We backtested RSI Divergence on ES futures in 4 variants, net of costs, and 0 passed every gate. The best result, DV-L-S, made +$48,731 over 281 trades but failed the development t-statistic and the random-entry control. The random-entry gate is the control frozen before the run; each post's control check shows matched alternatives. “No proven edge” means a convincing edge was not demonstrated, not that none exists.

Does the RSI divergence strategy work on forex?

We ran the same rules and default settings on EURUSD, GBPUSD, USDJPY and AUDUSD under a pre-registered specification. Of the 16 results, 6 finished above zero after costs and 0 passed every gate. Read the full forex study.

How much do trading costs matter for the RSI divergence strategy?

We charged about $31 per round trip on ES. Across all 4 variants (1,762 trades) the strategy made +$85,267 before costs and +$31,067 after.

How was the RSI divergence strategy tested?

On ES futures, with rules written and dated before the data was run, costs included on every trade, results split into development, validation and holdout periods, a random-entry control as the benchmark, and every variant reported. Read the protocol.

08Check our arithmetic

Frozen specificationRules, variants, gates.
dv_spec.md
CodeDivergence engine, its two helper files and the control check.
dv_protocol.js · dv_control_check.js · hourly_lib.js · rsi2_protocol.js
Trade logs (CSV)Every trade, net of costs.
DV-LS-S · DV-L-S · DV-LS-F · DV-L-F

Code provenance: our own code, written from the standard definition of the RSI and a common reading of divergence. No third-party source code is used or published.

Full console output: dv_results.txt and dv_control_check.txt (control check, added 8 Oct 2026).

09Corrections

14 Oct 2026, after a site audit: the short-side sentence said “the same pattern as every ES test on this site”. That was true when it was written; some later ES tests had a profitable short side, so it now says “at the time”. No result changed. 8 Oct 2026, after a second outside review: (1) the random control did not match the signal, because it trades only below RSI 50 while about half of the real long signals fire at or above 50. A control check with two matched alternatives is added under “The gates”, and the earlier claim that the profit comes “not from the divergence” was withdrawn: the divergence's extra contribution is not demonstrated, and not shown to be zero. The frozen gate results and the verdict did not change. (2) The statement that the stop capped the worst loss in both configurations was wrong for the long-and-short version (worst open loss -$9,200 to -$9,500); the paragraph now gives the figures for both. (3) The home-page and search descriptions were reworded to match. Also 7 Oct 2026: drawdown and worst-loss figures are now labelled as closed-trade or including open losses. No result changed. 8 Oct 2026, search and navigation: added an answer-first line, a FAQ and links to related tests and guides. No result changed. 22 Oct 2026, navigation: added a link to the new guide comparing trading costs across all our tests. No result changed. 22 Oct 2026, navigation: added a link to the new cross-market scoreboard, which includes this test. No result changed. 22 Oct 2026, navigation: added a link to the new guide comparing trend following and mean reversion across all our tests. No result changed. 22 Oct 2026, navigation: added a link to the new guide comparing versions with and without a stop loss across our tests. No result changed.

+More tests and guides