Tested by BacktestingMax
RSI overbought/oversold strategy backtest
Does the RSI 30/70 strategy make money?
No, not on most markets. RSI is an indicator that scores how hard price has moved, from 0 to 100: under 30 is called oversold, and over 70 overbought. We backtested the standard rules: buy when RSI comes back above 30, and sell short when it comes back below 70. We ran 24 tests: 8 markets, each on 15-minute, 1-hour and 4-hour charts, from 2014 to 2025, after trading costs. 20 of the 24 lost money, including all 8 on 15-minute charts. To see if the strategy kept working in the newer years, we also checked 2022–2025 on its own. Only 2 tests made money in both 2014–2021 and 2022–2025: EUR/USD on 1-hour charts and the DAX on 4-hour charts. Of 4 common changes, a filter that skips strong trends did best in 2014–2021, but with it 14 of the 24 tests still lost money in 2022–2025.
24 backtests 2014–2025 Trading costs included Tested 12 October 2026
Where it worked 24 backtests- Made money
- 4 of 24 tests, using the standard rules
- Made money in both periods
- 2 2014–2021 and again 2022–2025
- Best backtest
- +92% DAX, 1-hour chart: account growth 2014–2025
- With a filter that skips strong trends (ADX 25 or higher)
- 2 tests made money in both periods, compared with 2 using the standard rules
Made money in both periods
- EUR/USD, 1-hour
- DAX, 4-hour
Lost money on every market
- 15-minute charts
The results
Results on every market
Each box shows one backtest of the RSI 30/70 strategy using the standard rules, from 2014 to 2025, after trading costs: the % result, and a small chart of the account balance. The solid line is the account balance and the dashed line is the starting balance. Green results made money; red results lost money. Under each result: whether it made money in both 2014–2021 and 2022–2025, or passed all four of our checks (see "How a test passes" further down).
| Market | 15-minute | 1-hour | 4-hour |
|---|---|---|---|
| EUR/USD | −98% Lost money. Account down 90% by Aug 2018 | +17% Made money in both periods | +19% Made money overall, lost in one period |
| GBP/USD | −96% Lost money. Account down 90% by Apr 2022 | −18% Lost money | −8% Lost money |
| USD/JPY | −99% Lost money. Account down 90% by May 2017 | −76% Lost money | −9% Lost money |
| AUD/USD | −99% Lost money. Account down 90% by Nov 2017 | −61% Lost money | −13% Lost money |
| Gold | −98% Lost money. Account down 90% by Aug 2017 | −84% Lost money | −16% Lost money |
| S&P 500 | −99% Lost money. Account down 90% by Aug 2017 | −82% Lost money | −13% Lost money |
| Nasdaq 100 | −99% Lost money. Account down 90% by Dec 2015 | −94% Lost money. Account down 90% by Jan 2021 | −23% Lost money |
| DAX | −96% Lost money. Account down 90% by Jun 2020 | +92% Made money overall, lost in one period | +39% Made money in both periods |
All the numbers, test by test
| Market | Chart | Trades | Win rate | Profit factor | Result | Max drawdown | 2014–2021 | 2022–2025 | Monte Carlo drawdown | Trading costs |
|---|---|---|---|---|---|---|---|---|---|---|
| EUR/USD | 15-minute | 5,916 | 26.7% | 0.90 | −97.7% | −97.9% | −95.2% | −53.1% | −99.1% | $6,691 |
| EUR/USD | 1-hour | 1,718 | 27.9% | 1.01 | +16.9% | −67.6% | +6.5% | +9.8% | −68.1% | $6,730 |
| EUR/USD | 4-hour | 441 | 27.4% | 1.06 | +18.6% | −27.4% | −3.2% | +22.5% | −40.1% | $556 |
| GBP/USD | 15-minute | 5,953 | 27.6% | 0.96 | −95.9% | −97.6% | −87.9% | −65.9% | −98.4% | $18,068 |
| GBP/USD | 1-hour | 1,744 | 28% | 0.98 | −17.7% | −50.0% | −24.0% | +8.3% | −70.5% | $4,124 |
| GBP/USD | 4-hour | 469 | 26.7% | 0.98 | −7.6% | −25.6% | +14.0% | −19.0% | −45.5% | $684 |
| USD/JPY | 15-minute | 4,475 | 25.7% | 0.83 | −99.0% | −99.3% | −98.5% | −33.9% | −99.4% | $5,052 |
| USD/JPY | 1-hour | 1,781 | 25.9% | 0.89 | −76.1% | −80.4% | −62.6% | −36.2% | −86.4% | $2,867 |
| USD/JPY | 4-hour | 442 | 26.9% | 0.97 | −9.0% | −33.8% | +10.4% | −17.6% | −46.0% | $569 |
| AUD/USD | 15-minute | 4,145 | 24.6% | 0.85 | −99.4% | −99.4% | −98.9% | −42.1% | −99.6% | $5,866 |
| AUD/USD | 1-hour | 1,689 | 26.3% | 0.91 | −60.6% | −83.0% | −74.6% | +54.9% | −80.8% | $3,456 |
| AUD/USD | 4-hour | 403 | 25.1% | 0.95 | −13.2% | −35.6% | −28.7% | +21.7% | −45.9% | $647 |
| Gold | 15-minute | 2,728 | 26.4% | 0.82 | −97.9% | −98.2% | −98.0% | +3.1% | −98.6% | $7,156 |
| Gold | 1-hour | 1,599 | 26.3% | 0.85 | −83.9% | −84.9% | −69.6% | −47.1% | −89.1% | $3,498 |
| Gold | 4-hour | 465 | 26.2% | 0.95 | −16.2% | −30.3% | −0.3% | −16.0% | −45.5% | $886 |
| S&P 500 | 15-minute | 5,724 | 26.8% | 0.91 | −98.6% | −99.4% | −98.1% | −28.0% | −99.4% | $17,869 |
| S&P 500 | 1-hour | 1,864 | 25.6% | 0.87 | −81.9% | −85.7% | −73.8% | −31.1% | −89.9% | $3,922 |
| S&P 500 | 4-hour | 486 | 23.7% | 0.96 | −12.8% | −31.9% | +9.8% | −20.6% | −50.9% | $755 |
| Nasdaq 100 | 15-minute | 2,374 | 27% | 0.79 | −99.4% | −99.4% | −99.4% | 0.0% | −99.5% | $10,202 |
| Nasdaq 100 | 1-hour | 1,290 | 22% | 0.70 | −93.5% | −94.3% | −92.1% | −18.2% | −95.0% | $2,860 |
| Nasdaq 100 | 4-hour | 522 | 24.3% | 0.94 | −23.1% | −42.9% | −12.0% | −12.6% | −53.2% | $1,063 |
| DAX | 15-minute | 5,460 | 27.6% | 0.90 | −95.9% | −96.8% | −91.6% | −50.9% | −98.2% | $4,960 |
| DAX | 1-hour | 1,811 | 28.4% | 1.04 | +92.1% | −52.6% | +180.9% | −31.6% | −60.7% | $4,202 |
| DAX | 4-hour | 470 | 27% | 1.10 | +39.2% | −18.2% | +33.0% | +4.7% | −35.7% | $403 |
Profit factor is the money won divided by the money lost. Above 1 means the test made money. Max drawdown is the biggest fall from the highest balance. 2014–2021 and 2022–2025 show the result in each period on its own. Monte Carlo drawdown: we shuffled the trades into a random order 1,000 times; in 95% of those runs, the worst drawdown was this number or less. Result is the change in the account, with the risk of each trade set to 1% of the account at that time.
The account balance
The best test and the middle test
What we found
What the 24 backtests show
A buy closes when RSI reaches 70, and a sell closes when RSI reaches 30, unless price hits the stop-loss first. In every test, about 3 trades in 4 hit the stop-loss first, so only 22% to 28% of the trades were winners. The trades that reached 70 or 30 made 2.5 times the amount risked, on average. In 20 of the 24 tests, the winning trades did not make enough to pay for the losing ones.
On 1-hour and 4-hour charts, the standard rules made money in 4 of 16 tests: EUR/USD and the DAX, on both charts. 2 of them made money in both 2014–2021 and 2022–2025: EUR/USD on 1-hour charts and the DAX on 4-hour charts. The best backtest was the DAX on 1-hour charts: the account grew 92% from 2014 to 2025, but that test lost 32% in 2022–2025.
On 15-minute charts, the strategy lost money on all 8 markets: each account lost 96% to 99% of its starting balance. In 6 of the 8 tests, the account was already down 90% before the end of 2018.
Taking profit at RSI 50 instead of 70 doubled the win rate: across all 24 tests, 51.8% of the trades won, instead of 26.5%. But the winning trades were much smaller: 0.8 times the amount risked on average, instead of 2.5 times. So the result hardly changed: the average trade lost about 0.06% of the account either way, and 4 of the 24 tests made money either way.
Year by year, the standard rules lost money in almost every year. On 1-hour and 4-hour charts, adding up all 16 tests, the trades lost more than they made in 11 of the 12 years; only 2025 made money. The change that did best skips trades when ADX, an indicator of trend strength, shows a strong trend. With it, 8 of the 12 years made money, but its best years were 2016 and 2019, and from 2023 to 2025 its yearly results were close to zero.
Where to take profit
Take profit at RSI 70 or at RSI 50?
These numbers add up all 24 tests, from 2014 to 2025. The standard rules close a buy when RSI reaches 70 and a sell when RSI reaches 30. The other version closes buys and sells at RSI 50. Results are in % of the account, and every trade risked 1% of the account.
- Win rate, taking profit at RSI 70 (the standard rules)
- 26.5% The average winning trade made 2.5% of the account.
- Win rate, taking profit at RSI 50
- 51.8% The average winning trade made 0.8% of the account.
- Average trade, winners and losers together
- −0.06% of the account, with either exit. 4 of the 24 tests made money either way.
The average losing trade lost about 1% of the account with either exit: 1.0% with the exit at RSI 70, and 0.9% with the exit at RSI 50.
Year by year
Did the strategy lose every year?
This table adds up all 16 tests on 1-hour and 4-hour charts, by the year each trade opened. Results are in R: 1R is the amount risked on one trade, 1% of the account at the time. A plus sign means the trades made more than they lost that year.
| Year | Standard rules | With the ADX filter |
|---|---|---|
| 2014 | −103.2R | +5.5R |
| 2015 | −65.3R | +7.3R |
| 2016 | −18.1R | +72.4R |
| 2017 | −66.7R | +34.5R |
| 2018 | −32.6R | −16.2R |
| 2019 | −4.5R | +56.0R |
| 2020 | −157.3R | −47.5R |
| 2021 | −30.3R | −3.5R |
| 2022 | −93.8R | +23.5R |
| 2023 | −46.4R | −5.5R |
| 2024 | −33.1R | +1.8R |
| 2025 | +47.3R | +5.0R |
The ADX filter takes only RSI signals that come while ADX is below 25. On these charts it skips about 4 trades in 5, so its yearly totals are smaller.
The strategy
What the RSI 30/70 strategy is
RSI (Relative Strength Index) is an indicator that scores how hard price has moved, from 0 to 100. It compares the size of the up moves with the size of the down moves over the last 14 candles. A common way to trade it: under 30 is oversold, so you buy; over 70 is overbought, so you sell short. The idea is that a market that moved a long way in a short time often moves back. The standard rules we tested wait for RSI to turn first: they buy when RSI comes back above 30, and sell short when RSI comes back below 70.
- RSI
- 14 candles, levels 30 and 70 (the standard settings)
- Stop-loss
- 2 × ATR(14). ATR is how far price moves in an average candle, over the last 14 candles.
- Take-profit
- No fixed take-profit. A buy closes when RSI reaches 70, and a sell closes when RSI reaches 30.
- Risk per trade
- 1% of the account
The rules we tested
- Buy when RSI crosses back above 30: RSI was below 30 when the previous candle closed, and is 30 or higher when this candle closes.
- Sell short when RSI crosses back below 70: RSI was above 70 when the previous candle closed, and is 70 or lower when this candle closes.
- Close a buy when a candle closes with RSI at 70 or higher. Close a sell when a candle closes with RSI at 30 or lower. Entries and these exits happen at the opening price of the next candle.
- ATR is an indicator of how far price moves in an average candle, measured over the last 14 candles. Put the stop-loss 2 times the signal candle's ATR below that candle's closing price for a buy, or above it for a sell. The stop-loss does not move. If price reaches it, the trade closes at the stop price, or at a worse price if price gaps past it (opens beyond it).
- After a stop-loss, a new trade needs a new signal on a later candle. Only one trade is open at a time: a signal that comes while a trade is open is ignored.
- Size every trade so that, if the stop-loss is hit, the trade loses 1% of the account.
The method
How we tested it
The test
- Markets
- EUR/USD, GBP/USD, USD/JPY, AUD/USD, Gold, S&P 500, Nasdaq 100 and DAX
- Charts
- 15-minute, 1-hour and 4-hour candles
- Dates
- January 2014 to December 2025
- Account
- $10,000, risking 1% of the account on each trade
- Trading costs
- Included. Every trade pays that market's normal trading cost: the spread, which is the gap between the buy price and the sell price.
How a test passes
We call a test passed only if it meets all four checks. A strategy can make money in one backtest and still fail one of these checks.
- At least 100 trades. With fewer trades, a good result could be luck.
- It made money from 2014 to 2021 and again from 2022 to 2025. This shows whether the strategy kept working in the newer years, not only in the older ones.
- A profit factor (the money won divided by the money lost) of at least 1.2 from 2022 to 2025, after trading costs.
- In 95% of 1,000 random shuffles of the trades, the account must not fall more than 30% from its highest point.
Improvements
Can the RSI 30/70 strategy be improved?
We tried four changes traders often make to the RSI 30/70 strategy, one at a time, on the same 24 tests. Two change the rules: when to enter, and when to take profit. Two add a filter, an extra rule that skips some trades: one trades only in the direction of the trend, and one skips trades when there is a strong trend. If you pick the best change and judge it on the same years, it will almost always look good. So we picked the best one in 2014–2021 only, by the number of tests that made money, and then checked it in 2022–2025.
| Version | Made money 2014–2021years used to pick the best version | Made money 2022–2025years not used to pick it | Made money in both periods | Passed all four checks |
|---|---|---|---|---|
| Standard rules The rules under 'The rules we tested', with nothing changed. | 6 of 24middle test −66.1% | 7 of 24middle test −18.6% | 2 | 0 |
| Enter right away, without waiting for RSI to come back Buy as soon as RSI drops below 30, and sell short as soon as it rises above 70. Don't wait for RSI to come back. The exits and the stop-loss stay the same. | 5 of 24middle test −38.1% | 4 of 24middle test −11.9% | 2 | 0 |
| Take profit at RSI 50 Close a buy when RSI reaches 50 instead of 70, and a sell when RSI reaches 50 instead of 30. The entries and the stop-loss stay the same. | 4 of 24middle test −61.2% | 8 of 24middle test −18.1% | 2 | 0 |
| With a 200 EMA trend filter The 200 EMA is a moving average of the last 200 candles that gives more weight to recent candles. Only buy when the price is above the 200 EMA, and only sell short when it is below. | 6 of 24middle test −9.1% | 9 of 24middle test −4.5% | 0 | 0 |
| With a filter that skips strong trends (ADX 25 or higher)Best on 2014–2021 ADX is an indicator that measures how strong a trend is, from 0 to 100, using the last 14 candles. Traders usually say ADX of 25 or higher means a strong trend. Take a signal only when ADX is below 25. | 14 of 24middle test +6.2% | 10 of 24middle test −2.0% | 2 | 0 |
In 2014–2021, the years we used to pick the best change, the ADX filter did best: 14 of 24 tests made money with it, compared with 6 with the standard rules. In 2022–2025, the years we kept for the check, the gap was smaller: 10 of 24 tests made money, compared with 7. In 2022–2025, the middle test (half of the 24 did better, half did worse) was −2.0% with the filter and −18.6% without it. Only 2 tests made money in both periods, the same as with the standard rules. One reason: the filter skips about 3 trades in 4, so 6 of the 8 tests on 4-hour charts had fewer than 100 trades. 3 of those 6 made money in both periods, but we don't count them, because a test needs at least 100 trades to judge. So in this backtest the ADX filter helped, but more than half of the tests still lost money with it in 2022–2025. In both periods, the middle test with the 200 EMA filter also lost less than with the standard rules, but mostly because that filter skipped 84% of the trades.
Questions
Questions traders ask
Does the RSI 30/70 strategy work?
Not on most markets. In our backtest from 2014 to 2025, with trading costs, the standard rules lost money in 20 of 24 tests: 8 markets, each on 15-minute, 1-hour and 4-hour charts. The standard rules use RSI over 14 candles: buy when RSI crosses back above 30, and sell short when it crosses back below 70. Only 2 tests made money in both 2014–2021 and 2022–2025: EUR/USD on 1-hour charts and the DAX on 4-hour charts.
What is the best timeframe for the RSI 30/70 strategy?
In our tests, 4-hour charts lost the least, but no timeframe made money on most markets. On 15-minute charts, all 8 accounts lost 96% to 99% of their starting balance. On 1-hour charts, 2 of 8 tests made money, and on 4-hour charts, 2 of 8 did too, but the 4-hour tests lost less: the middle result on 4-hour charts was a loss of 11% (half of the 8 tests did better, half did worse), and on 1-hour charts it was a loss of 68%. On daily charts, the strategy made only 53 to 75 trades per market from late 2014 to 2025. That is fewer than the 100 trades we need to judge a test, so daily charts are not in the results.
Should you buy as soon as RSI drops below 30?
No, there was no clear gain in our test. Buying as soon as RSI dropped below 30, and selling short as soon as it rose above 70, made money in 5 of 24 tests. Waiting for RSI to cross back made money in 4 of 24. In both versions, 2 tests made money in both 2014–2021 and 2022–2025. Entering right away gave fewer trades and a slightly lower win rate, 24.6% instead of 26.5%, but the winning trades were a little bigger.
Does RSI work better when the market is not trending?
Yes, a little, in this backtest. ADX is an indicator that measures how strong a trend is; traders usually say ADX of 25 or higher means a strong trend. When we took RSI signals only while ADX was below 25, 22 of the 24 tests had a better result from 2014 to 2025 than without the filter, and the average trade did better on all three charts, in 2014–2021 and in 2022–2025. But the filter skipped about 3 trades in 4, so 6 of the 8 tests on 4-hour charts had fewer than 100 trades, and in 2022–2025, 14 of the 24 tests still lost money. Trading only in the direction of the trend did not help on 15-minute and 1-hour charts: with a 200 EMA filter (only buy above a moving average of the last 200 candles, and only sell short below it), the average trade from 2014 to 2025 was worse than with no filter.
Keep exploring
Related strategies we tested
RSI RSI divergence strategy backtest Made money in 5 of 24 tests, 2 of them in both periods. Best: DAX, 1-hour, +49%The strategy code we ran
This is the exact code from the BacktestingMax strategy engine. Paste it into the strategy editor in the app to run it on any market.
class RsiOverboughtOversold(Strategy):
"""The classic RSI 30/70 strategy, as most traders learn it, plus four changes traders make.
Standard (all switches off): RSI over 14 candles (Wilder's formula). Buy when RSI crosses
back above 30 (it closed below 30 on the candle before). Sell short when it crosses back
below 70. Close a buy when RSI reaches 70 and a sell when RSI reaches 30; the exit fills at
the next candle's open. A stop 2 x ATR(14) from the entry caps every trade, sized so the
stop costs 1% of the account. One trade at a time: a signal while a trade is open is ignored.
Every version starts trading once all its indicators (the 200 EMA too) have enough candles,
so all versions trade the same dates.
The changes, one at a time:
early_entry = 1 buy as soon as RSI crosses below 30, sell as soon as it crosses above 70
exit_mid = 1 close at RSI 50 instead of at the other level
trend_filter = 1 only buy above the 200 EMA, only sell below it
adx_filter = 1 only trade when ADX(14) is below 25, which means no strong trend
"""
params = {"rsi_period": Param(type=int, default=14, min=2, max=100),
"oversold": Param(type=float, default=30.0, min=1.0, max=49.0),
"overbought": Param(type=float, default=70.0, min=51.0, max=99.0),
"atr_mult": Param(type=float, default=2.0, min=0.5, max=5.0),
"early_entry": Param(type=int, default=0, min=0, max=1),
"exit_mid": Param(type=int, default=0, min=0, max=1),
"trend_filter": Param(type=int, default=0, min=0, max=1),
"adx_filter": Param(type=int, default=0, min=0, max=1),
"adx_max": Param(type=float, default=25.0, min=5.0, max=60.0)}
lookback = 50
def init(self, ctx):
self.rsi = ctx.indicator("builtin:rsi", period=ctx.params.rsi_period)
self.atr = ctx.atr(period=14)
self.ema = ctx.ema(source=ctx.close, period=200)
self.adx = ctx.indicator("builtin:adx", period=14)
self.reverse_to = None # "long" / "short": open this once the closing trade is gone
def on_bar(self, ctx):
p = ctx.params
r0, r1 = self.rsi.rsi[0], self.rsi.rsi[1]
a, ema, adx = self.atr.value, self.ema.value, self.adx.adx[0]
if r0 is None or r1 is None or a is None or ema is None or adx is None:
return
low, high = p.oversold, p.overbought
if p.early_entry == 1:
buy_signal = r1 >= low and r0 < low # RSI drops into oversold
sell_signal = r1 <= high and r0 > high # RSI rises into overbought
else:
buy_signal = r1 < low and r0 >= low # RSI crosses back above 30
sell_signal = r1 > high and r0 <= high # RSI crosses back below 70
exit_long = 50.0 if p.exit_mid == 1 else high
exit_short = 50.0 if p.exit_mid == 1 else low
pos = ctx.position
if pos is not None:
if pos.is_long and r0 >= exit_long:
ctx.close_position()
self.reverse_to = "short" if sell_signal else None
elif pos.is_short and r0 <= exit_short:
ctx.close_position()
self.reverse_to = "long" if buy_signal else None
return
# A reversal (only possible with early_entry) waits one candle for the close to fill.
# Drop it if RSI has already left the zone.
pending, self.reverse_to = self.reverse_to, None
if pending == "long" and r0 < low:
buy_signal = True
if pending == "short" and r0 > high:
sell_signal = True
entry = ctx.close[0]
calm = p.adx_filter == 0 or adx < p.adx_max
long_ok = p.trend_filter == 0 or entry > ema
short_ok = p.trend_filter == 0 or entry < ema
if ctx.gate("rsi_buy_signal", buy_signal) and ctx.gate("trend_long", long_ok) and ctx.gate("adx_long", calm):
stop = entry - p.atr_mult * a
ctx.buy(size=ctx.size_by_risk_pct(0.01, stop=stop, entry=entry), sl=stop, tag="rsi_long")
elif ctx.gate("rsi_sell_signal", sell_signal) and ctx.gate("trend_short", short_ok) and ctx.gate("adx_short", calm):
stop = entry + p.atr_mult * a
ctx.sell(size=ctx.size_by_risk_pct(0.01, stop=stop, entry=entry), sl=stop, tag="rsi_short")
Your turn
Test the RSI 30/70 strategy yourself
Change the settings, the market or the stop-loss and see the result in seconds. Ask the BacktestingMax AI: Backtest the RSI 30/70 strategy on GBP/JPY, 1-hour chart, taking trades only when ADX is below 25
.
Free account. No credit card needed.
See every strategy we tested Browse strategies shared by tradersBacktest on historical data with trading costs, run by BacktestingMax. Past results do not guarantee future results, and nothing here is financial advice. Updated 12 October 2026.