Join today
Strategies / Breakout / Intraday Range Breakout

Intraday Range Breakout After a 35% Pullback

When price pulls back at least 35% of the day's range from the high, a buy stop is placed 4 points under that high, with a mirrored sell stop above the low. The day's range must stay at or below 160 points and the two levels at least 20 apart. It skips May 1 and the late December holidays, and each side trades once per day.

BreakoutLong & shortIntradayNikkei 22530 min
n/aProfit factor
29,850Net profit USD
17.53%Win rate
3,646Trades
-8,138Max drawdown
8.19Avg trade

Best run of 12. Nikkei 225, 30 min, spread 10, from run sweeps:2026-09-17-NIKKEI-30m-opt.tsv:2.

Entry rules, long

  1. Not May 1 or December 24, 25, 26, 30 or 31
  2. Today's range so far is 160 points or less
  3. Members only
  4. The buy level is at least 20 points above the sell level
  5. Buy stop order at the buy level, once per day

Entry rules, short

  1. Not May 1 or December 24, 25, 26, 30 or 31
  2. Today's range so far is 160 points or less
  3. Members only
  4. The buy level is at least 20 points above the sell level
  5. Sell stop order at the sell level, once per day

Exit rules

  1. Stop loss 160 points
  2. Members only
  3. If the long side already traded today, a short is closed with a stop at the buy level

Test conditions

PeriodUp to 2026-09-17
InstrumentNikkei 225, 30 minutes
Spread10 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
maxRangePoints
No new levels if today's range is wider than this; also the stop loss in points
160
minLevelGap
Minimum distance between the buy and sell levels
20
orderDistance
Entry levels sit this many points inside the day's high and low
4
minPullbackPct
Pullback from an extreme, as percent of the day's range, needed to set that level
35
rangeExtraBars
Bars added to today's bar count for the high/low window
2
mayMonth / mayDay / decemberMonth / christmasEve / christmasDay / boxingDay / yearEndEve / newYearsEve
Holiday calendar dates with no trading
5 / 1 / 12 / 24 / 25 / 26 / 30 / 31

Every run

Markets and timeframes tested

MarketTimeframePFTradesWin %NetMax DD
Nikkei 225Best run30 minn/a 3,64617.5329,850 USD-8,138
Nikkei 2251 hourn/a 3,05523.2418,297 USD-8,884
Nikkei 225Dailyn/a 17219.7710,782 USD-8,276
DAX 40Dailyn/a 61936.837,816 EUR-5,105
Nasdaq 10030 minn/a 1,71918.445,659 EUR-5,120
Nasdaq 100Dailyn/a 47939.465,029 EUR-2,144
Gold10 minn/a 7533.332,089 EUR-692
Gold5 minn/a 5731.581,760 EUR-1,539
FTSE 1005 minn/a 6328.571,710 EUR-889
Gold30 minn/a 11036.361,482 EUR-1,456
FTSE 1001 minn/a 2334.781,089 EUR-445
S&P 5001 minn/a 1442.86458 EUR-425

Charts

Results by run

Net profit against max drawdown

Net profitMax drawdown
0-10K-5K25K50KNikkei 225 · 30 minNikkei 225 · 1 hourNikkei 225 · DailyDAX 40 · DailyNasdaq 100 · 30 minNasdaq 100 · DailyGold · 10 minGold · 5 minFTSE 100 · 5 minGold · 30 minFTSE 100 · 1 minS&P 500 · 1 min

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.

// ============================================================
// Intraday Range Breakout
// ProRealAlgos Strategy Library  |  prorealalgos.com
// Type: Breakout
// Direction: Long & short
// Timeframe tested: 30 minutes
// ============================================================

// --- Settings ---
DEFPARAM CumulateOrders = false
DEFPARAM PreloadBars = 10000

// --- Parameters ---
positionSize = 1             // contracts per trade
maxRangePoints = 160         // no orders if today's range is wider than this; also the stop loss
minLevelGap = 20             // buy and sell levels must be at least this far apart
orderDistance = 4            // entry levels sit this many points inside the day's extremes
minPullbackPct = 35          // price must pull back this percent of the range from an extreme
rangeExtraBars = 2           // bars added to today's bar count for the range window
mayMonth = 5                 // holiday calendar: May
mayDay = 1                   // May 1
decemberMonth = 12           // holiday calendar: December
christmasEve = 24
christmasDay = 25
boxingDay = 26
yearEndEve = 30
newYearsEve = 31

ONCE dayStarted = -1
ONCE longDone = 0
ONCE shortDone = 0

// --- Indicators ---
// No trading on holidays and thin year-end sessions.
IF (Month = mayMonth AND Day = mayDay) OR (Month = decemberMonth AND (Day = christmasEve OR Day = christmasDay OR Day = boxingDay OR Day = yearEndEve OR Day = newYearsEve)) THEN
  tradingDay = 0
ELSE
  tradingDay = 1
ENDIF

56 more lines: the entry and exit rules.

Read this first

Known weaknesses

  • Only sweep data exists, so profit factor was not recorded.
  • The best run wins just 17.53% of its 3,646 trades. Long runs of small losses are part of the design.
  • The best run's drawdown of USD 8,137.8 is large compared with its USD 29,849.8 net profit.
  • The 160 point range and stop are fixed in price units, so the filter barely fits some markets and is loose on others.

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

Is this strategy ready for ProOrder?

It runs on stop orders that ProOrder supports, and both can be live at once. The code was rewritten after testing and has not been compile-checked yet.

How did it do across markets?

All 11 rows in the table were profitable. Nikkei 225 led, with USD 18,297.2 on 1 hour, and DAX 40 Daily made EUR 7,815.6, while S&P 500 1 minute took only 14 trades.

What drawdown does 1 contract bring?

The best run had a max drawdown of USD 8,137.8 with 1 contract, and Nikkei 225 1 hour saw USD 8,883.9.

Why 30 minute bars?

The levels come from the day's high, low and a 35% pullback, which needs a few bars to form. On 30 minutes that happens most days without the noise of 1 minute bars.

Related

Strategies like this one

Monday Dip Buy

Best run on the same market, Nikkei 225.

n/a PF · 146 trades

Breakout Regime Filter

Also a breakout strategy.

6.28 PF · 70 trades

Bollinger Band Walk

Also a breakout strategy.

3.10 PF · 148 trades

Get early access to how ProRealAlgos members trade range breakouts. Join the 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