RSI dip in an uptrend: backtest results
Buy the dip, but only in an uptrend: RSI under 35 while price is above its 200-day average, exit when RSI recovers above 60, with an 8% stop loss. We ran it on real daily data for 4 stocks. It did not beat simply buying and holding on any of the 4 stocks we tested.
Results by stock
| Stock | Period | Strategy | Buy & hold | Beat it? | Worst drop | Trades | Win rate | Caution |
|---|---|---|---|---|---|---|---|---|
| Apple (AAPL) | 2016 → 2025 | +4.1% | +1038.8% | no | -38.7% | 15 | 66.7% | |
| Amazon (AMZN) | 2016 → 2025 | -14.1% | +613.2% | no | -31.1% | 11 | 45.5% | |
| Robinhood (HOOD) | 2021 → 2025 | +93.8% | +223.5% | no | -31.1% | 4 | 50.0% | only 4 closed trades; includes a position still open at the end |
| Tesla (TSLA) | 2016 → 2025 | +10.8% | +2877.2% | no | -31.9% | 15 | 26.7% |
Best: Robinhood on +93.8%. One set of rules, fixed in advance, run on every stock: no tuning to make the numbers look better. A strategy with few trades or a big drop deserves less trust than its return suggests.
The exact rules
Buy Apple when the 14 day RSI is below 35 and the close is above the 200 day SMA. Sell when the 14 day RSI is above 60. Stop loss 8%.
Paste those words into Extractor and it runs the same test, shows every trade on the chart with entry, stop loss and take profit, and compares it with buy & hold. Change a number and run it again in seconds.
Run these rules now, freeFree TradingView indicator (Pine Script v5)
Copy this into TradingView's Pine Editor and click Add to chart. It marks the buy and sell signals and draws the levels.
//@version=5
// Indicator generated by Extractor from your rules.
// Built for AAPL on the daily (1D) chart.
// Buy when: rsi(14) < 35 AND close > sma(200)
// Sell when: rsi(14) > 60
// Stop loss: 8%
// Marks where your rules say buy and sell, and adds alerts you can turn on in TradingView.
indicator("RSI dip in an uptrend signals", overlay=true)
rsi14 = ta.rsi(close, 14)
sma200 = ta.sma(close, 200)
entrySignal = (rsi14 < 35) and (close > sma200)
exitSignal = (rsi14 > 60)
// Track whether the rules are in a trade, so signals don't repeat while already long.
var bool inTrade = false
var float entryPrice = na
stopHit = inTrade and low <= entryPrice * (1 - 8.0 / 100)
targetHit = false
buy = not inTrade and entrySignal
sell = inTrade and (exitSignal or stopHit or targetHit)
if sell
inTrade := false
entryPrice := na
else if buy
inTrade := true
entryPrice := close
// Levels stay drawn through the bar where the trade closes.
wasInTrade = inTrade or sell
levelBase = sell ? entryPrice[1] : entryPrice
// Position levels from your inputs
float entryLine = wasInTrade ? levelBase : na
float tpLine = na
float slLine = entryLine * (1 - 8.0 / 100)
pEntry = plot(entryLine, "Entry", color.new(color.gray, 0), 1, plot.style_linebr)
pTp = plot(tpLine, "Take profit (not set)", color.new(color.green, 0), 2, plot.style_linebr)
pSl = plot(slLine, "Stop loss 8%", color.new(color.red, 0), 2, plot.style_linebr)
fill(pEntry, pTp, color.new(color.green, 85))
fill(pEntry, pSl, color.new(color.red, 85))
if (wasInTrade) and not (wasInTrade)[1]
label.new(bar_index, high, "Entry " + str.tostring(entryLine, format.mintick) + "\nSL " + str.tostring(slLine, format.mintick) + " (-8%)", style=label.style_label_lower_left, color=color.new(color.gray, 20), textcolor=color.white, size=size.small)
plot(sma200, "SMA 200", color.orange)
plotshape(buy, "Buy", shape.labelup, location.belowbar, color.new(color.teal, 0), text="BUY", textcolor=color.white, size=size.small)
plotshape(sell, "Sell", shape.labeldown, location.abovebar, color.new(color.red, 0), text="SELL", textcolor=color.white, size=size.small)
alertcondition(buy, "Buy signal", "RSI dip in an uptrend: buy signal on {{ticker}} at {{close}}")
alertcondition(sell, "Sell signal", "RSI dip in an uptrend: sell signal on {{ticker}} at {{close}}")
Test your own version
- Different stock, crypto or forex pair? Change the ticker in the description.
- Add a stop loss or take profit and see if it helps.
- Saw a strategy on YouTube? Paste the link and get the rules, the backtest and the indicator.