Join today
Strategies / Mean reversion / Volatility Band RSI Reversal

Volatility Band RSI Reversal on EUR/USD

A close below a lower band (35 EMA minus 2 times a 5-bar standard deviation) with RSI(11) under 30 triggers a long. A close above the upper band with RSI(5) over 70 triggers a short. Exits use ATR(49) based stop and target, and an opposite signal flips the trade.

Mean reversionLong & shortIntradayEUR/USD15 min
n/aProfit factor
43,255Net profit USD
66.04%Win rate
3,180Trades
-28,127Max drawdown
13.60Avg trade

Best run of 10. EUR/USD, 15 min, spread 1, from run sweeps:2026-09-17-EURUSD-15m-opt.tsv:2.

Entry rules, long

  1. Members only
  2. RSI(11) is below 30
  3. Not a holiday (23 and 24 June, 9 November)

Entry rules, short

  1. Members only
  2. RSI(5) is above 70
  3. Not a holiday (23 and 24 June, 9 November)

Exit rules

  1. Stop loss of ATR(49) x 300000 points
  2. Members only
  3. An opposite signal reverses the position

Test conditions

PeriodUp to 2026-09-17
InstrumentEUR/USD, 15 minutes
Spread1 points
Contracts1
Starting capital1,000,000
CostsSpread only. Commissions and overnight financing are not included.
BarsUp to 200,000 bars, fewer where the instrument has less history
Last tested2026-09-17

Parameters

positionSize
Contracts per trade
1
bandPeriod
EMA at the centre of the bands
35
lowerStdPeriod
Standard deviation length for the lower band
5
upperStdPeriod
Standard deviation length for the upper band
10
bandWidth
Band distance in standard deviations
2
longRsiPeriod
RSI length for the long filter
11
shortRsiPeriod
RSI length for the short filter
5
oversoldLevel
Long RSI must be below this
30
overboughtLevel
Short RSI must be above this
70
atrPeriod
ATR length for stop and target
49
stopAtrFactor
Stop in points = ATR x this factor
300000
targetAtrFactor
Target in points = ATR x this factor
80000

Every run

Markets and timeframes tested

MarketTimeframePFTradesWin %NetMax DD
EUR/USDBest run15 minn/a 3,18066.0443,255 USD-28,127
Silver1 hourn/a 1,85061.681,065,453 USD-568,760
USD/JPY4 hoursn/a 61666.23414,820 JPY-385,010
EUR/USD10 minn/a 3,09065.2431,979 USD-13,972
Dow JonesDailyn/a 22866.6713,331 EUR-12,096
GBP/USD4 hoursn/a 78164.029,440 USD-4,297
Nasdaq 1004 hoursn/a 58365.357,269 EUR-6,960
FTSE 100Dailyn/a 18668.286,421 EUR-4,934
Dow Jones1 minn/a 2,89966.134,930 EUR-3,617
S&P 5004 hoursn/a 56566.371,916 EUR-1,403

Charts

Results by run

Net profit against max drawdown

Net profitMax drawdown
0-1.0M-500K1.0M2.0MSilver · 1 hourUSD/JPY · 4 hoursEUR/USD · 15 minEUR/USD · 10 minDow Jones · DailyGBP/USD · 4 hoursNasdaq 100 · 4 hoursFTSE 100 · DailyDow Jones · 1 minS&P 500 · 4 hours

The code

ProBuilder, rewritten to house standard

Every file in the library uses the same header, the same section order and the same variable names. The numbers above were produced by the original version before the rewrite, and the rewrite has not yet been compiled in ProRealTime.

// ============================================================
// Volatility Band RSI Reversal
// ProRealAlgos Strategy Library  |  prorealalgos.com
// Type: Mean reversion
// Direction: Long & short
// Timeframe tested: 15 minutes
// ============================================================

// --- Settings ---
DEFPARAM CumulateOrders = false

// --- Parameters ---
positionSize = 1          // contracts per trade
bandPeriod = 35           // EMA at the centre of the bands
lowerStdPeriod = 5        // standard deviation length for the lower band
upperStdPeriod = 10       // standard deviation length for the upper band
bandWidth = 2             // band distance in standard deviations
longRsiPeriod = 11        // RSI length for the long filter
shortRsiPeriod = 5        // RSI length for the short filter
oversoldLevel = 30        // long RSI must be below this
overboughtLevel = 70      // short RSI must be above this
atrPeriod = 49            // ATR length for stop and target
stopAtrFactor = 300000    // stop in points = ATR x this factor
targetAtrFactor = 80000   // target in points = ATR x this factor

// --- Indicators ---
// Holiday calendar: no trading on 23 and 24 June and on 9 November.
IF (Month = 6 AND (Day = 23 OR Day = 24)) OR (Month = 11 AND Day = 9) THEN
  tradingDay = 0
ELSE
  tradingDay = 1
ENDIF

// Bands are only updated on trading days, as in the original, so [1] after a holiday
// still points at the last value computed.
IF tradingDay = 1 THEN
  lowerBand = ExponentialAverage[bandPeriod](close) - bandWidth * STD[lowerStdPeriod](close)
  upperBand = ExponentialAverage[bandPeriod](close) + bandWidth * STD[upperStdPeriod](close)
ENDIF

longRsi = RSI[longRsiPeriod](close)
shortRsi = RSI[shortRsiPeriod](close)
atrValue = AverageTrueRange[atrPeriod](close)

19 more lines: the entry and exit rules.

Read this first

Known weaknesses

  • Profit factor was not recorded because only sweep data exists.
  • The best run's max drawdown of USD 28,127.0 is large next to its USD 43,255.0 net profit.
  • The stop factor (300000) is much larger than the target factor (80000), so the 66.04% win rate has to hold for the system to stay ahead.
  • Some rows show extreme figures, like Silver 1 hour with a USD 568,760.0 drawdown, which says the fixed factors do not transfer well to other instruments.

Indicators used

EMAStandard DeviationRSIATR

How to load it

  1. Copy the code with the copy button above the code block.
  2. In ProRealTime, open a chart of the instrument and timeframe you want to test, then open ProOrder > New trading system and choose "Create with programming".
  3. Paste the code, give the system a name and save it.
  4. Click "Backtest", set your own spread and position size, and run it before you consider trading it live.

Questions

About this strategy

Can I run the Volatility Band RSI Reversal in ProOrder?

Yes, it uses standard indicators and ATR based stops. The rewritten code has not been compile-checked, so test it on demo.

How did EUR/USD compare with other markets?

EUR/USD 15 minutes made USD 43,255.0 and 10 minutes USD 31,979.0. Dow Jones Daily made EUR 13,331.2, but S&P 500 4 hours only EUR 1,916.2.

What capital does 1 contract need?

With 1 contract the best run had a max drawdown of USD 28,127.0. Size your account for at least that, since the backtest excludes commissions and financing.

Why 15 minutes on EUR/USD?

The bands and RSI need enough bars to stretch and snap back within a session. On 15 minutes EUR/USD produced 3,180 trades, a large enough sample to read the result.

Related

Strategies like this one

Monday Dip Buy

Uses the same indicator.

n/a PF · 146 trades

Slow MACD Slope

Best run on the same market, EUR/USD.

6.80 PF · 7,305 trades

ATR Band

Also a mean reversion strategy.

10.31 PF · 53 trades

Discuss mean reversion setups on forex with other traders. Join the ProRealAlgos community waitlist.

The ProRealAlgos community gets the full rules, the complete code and the automated portfolio.

Past backtest results do not guarantee future results. This is not financial advice. Curated and maintained by ProRealAlgos. ProRealTime™ is a trademark of ProRealTime SAS. prorealalgos.comStatsDocs