Join today
Strategies / Volatility / DAX Survivor

DAX Survivor

ADX(14) decides the mode. In quiet markets the system buys after a large down candle and shorts after a large up candle, and when ADX is high it follows the candle instead. Longs close 30 bars after the last trade and shorts after 5 bars.

VolatilityLong & shortSwingFTSE 1004 hours
1.17Profit factor
7,580Net profit EUR
55.75%Win rate
1,514Trades
-1,646Max drawdown
5.01Avg trade

Best run of 4. FTSE 100, 4 hours, spread 2, from run pf:2026-09-24-FTSE100-4h.tsv:2.

Entry rules, long

  1. Members only
  2. Breakout mode: ADX(14) is above 36 and an up candle's body is larger than 1 x ATR(14)
  3. ATR(14) is below 100
  4. The seasonal table does not block the current half month (second half of January and second half of September are blocked)

Entry rules, short

  1. Members only
  2. Breakout mode: ADX(14) is above 24 and a down candle's body is larger than 2 x ATR(14)
  3. ATR(14) is below 200

Exit rules

  1. Members only
  2. Close a short 5 bars after the last trade
  3. No stop loss or target

Test conditions

PeriodUp to 2026-09-25
InstrumentFTSE 100, 4 hours
Spread2 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-25

Parameters

positionSize
Contracts per trade
1
atrPeriod
ATR length for candle size and volatility cap
14
adxPeriod
ADX length for the regime switch
14
adxLongThreshold
Longs: ADX above = breakout regime, below = mean reversion
36
adxShortThreshold
Shorts: ADX above = breakout regime, below = mean reversion
24
atrMaxLong
No longs when ATR is at or above this
100
atrMaxShort
No shorts when ATR is at or above this
200
longReversionMultiplier
Long after a down candle larger than this many ATRs
1
longBreakoutMultiplier
Long after an up candle larger than this many ATRs
1
shortReversionMultiplier
Short after an up candle larger than this many ATRs
1
shortBreakoutMultiplier
Short after a down candle larger than this many ATRs
2
maxBarsLong
Close a long after this many bars
30
maxBarsShort
Close a short after this many bars
5
midMonthDay
Days up to this count as the first half of the month
15
janFirstHalf
Seasonal weight, first half of January (zero blocks new longs)
3
janSecondHalf
Seasonal weight, second half of January (zero blocks new longs)
0
febFirstHalf
Seasonal weight, first half of February (zero blocks new longs)
3
febSecondHalf
Seasonal weight, second half of February (zero blocks new longs)
3
marFirstHalf
Seasonal weight, first half of March (zero blocks new longs)
3
marSecondHalf
Seasonal weight, second half of March (zero blocks new longs)
2
aprFirstHalf
Seasonal weight, first half of April (zero blocks new longs)
3
aprSecondHalf
Seasonal weight, second half of April (zero blocks new longs)
3
mayFirstHalf
Seasonal weight, first half of May (zero blocks new longs)
1
maySecondHalf
Seasonal weight, second half of May (zero blocks new longs)
1
junFirstHalf
Seasonal weight, first half of June (zero blocks new longs)
1
junSecondHalf
Seasonal weight, second half of June (zero blocks new longs)
2
julFirstHalf
Seasonal weight, first half of July (zero blocks new longs)
3
julSecondHalf
Seasonal weight, second half of July (zero blocks new longs)
2
augFirstHalf
Seasonal weight, first half of August (zero blocks new longs)
2
augSecondHalf
Seasonal weight, second half of August (zero blocks new longs)
3
sepFirstHalf
Seasonal weight, first half of September (zero blocks new longs)
3
sepSecondHalf
Seasonal weight, second half of September (zero blocks new longs)
0
octFirstHalf
Seasonal weight, first half of October (zero blocks new longs)
3
octSecondHalf
Seasonal weight, second half of October (zero blocks new longs)
2
novFirstHalf
Seasonal weight, first half of November (zero blocks new longs)
1
novSecondHalf
Seasonal weight, second half of November (zero blocks new longs)
3
decFirstHalf
Seasonal weight, first half of December (zero blocks new longs)
3
decSecondHalf
Seasonal weight, second half of December (zero blocks new longs)
2

Every run

Markets and timeframes tested

MarketTimeframePFTradesWin %NetMax DD
FTSE 100Best run4 hours1.17 1,51455.757,580 EUR-1,646
DAX 40Dailyn/a 34758.219,871 EUR-2,471
GBP/USDDailyn/a 79955.697,847 USD-7,788
Nasdaq 100Dailyn/a 58550.772,959 EUR-1,721

Charts

Results by run

Net profit against max drawdown

Net profitMax drawdown
0-10K-5K5K10KDAX 40 · DailyGBP/USD · DailyFTSE 100 · 4 hoursNasdaq 100 · Daily

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.

// ============================================================
// DAX Survivor
// ProRealAlgos Strategy Library  |  prorealalgos.com
// Type: Volatility
// Direction: Long & short
// Timeframe tested: 4 hours
// ============================================================

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

// --- Parameters ---
positionSize = 1                // contracts per trade
atrPeriod = 14                  // ATR length for candle size and volatility cap
adxPeriod = 14                  // ADX length for the regime switch
adxLongThreshold = 36           // longs: ADX above = breakout regime, below = mean reversion
adxShortThreshold = 24          // shorts: ADX above = breakout regime, below = mean reversion
atrMaxLong = 100                // no longs when ATR is at or above this
atrMaxShort = 200               // no shorts when ATR is at or above this
longReversionMultiplier = 1     // long after a down candle larger than this many ATRs
longBreakoutMultiplier = 1      // long after an up candle larger than this many ATRs
shortReversionMultiplier = 1    // short after an up candle larger than this many ATRs
shortBreakoutMultiplier = 2     // short after a down candle larger than this many ATRs
maxBarsLong = 30                // close a long after this many bars
maxBarsShort = 5                // close a short after this many bars
midMonthDay = 15                // days up to this count as the first half of the month

// Seasonal weights per half month. Only zero matters now: zero blocks new longs.
janFirstHalf = 3
janSecondHalf = 0
febFirstHalf = 3
febSecondHalf = 3
marFirstHalf = 3
marSecondHalf = 2
aprFirstHalf = 3
aprSecondHalf = 3
mayFirstHalf = 1
maySecondHalf = 1
junFirstHalf = 1
junSecondHalf = 2
julFirstHalf = 3
julSecondHalf = 2
augFirstHalf = 2
augSecondHalf = 3
sepFirstHalf = 3
sepSecondHalf = 0
octFirstHalf = 3
octSecondHalf = 2
novFirstHalf = 1
novSecondHalf = 3
decFirstHalf = 3
decSecondHalf = 2

// --- Indicators ---
atrValue = AverageTrueRange[atrPeriod]
adxValue = ADX[adxPeriod]
candleBody = abs(open - close)

longVolatilityOk = atrValue < atrMaxLong
shortVolatilityOk = atrValue < atrMaxShort
longBreakoutRegime = adxValue > adxLongThreshold
longReversionRegime = adxValue < adxLongThreshold
shortBreakoutRegime = adxValue > adxShortThreshold
shortReversionRegime = adxValue < adxShortThreshold

firstHalf = Day <= midMonthDay
IF CurrentMonth = 1 THEN
  IF firstHalf THEN
    seasonWeight = janFirstHalf
  ELSE
    seasonWeight = janSecondHalf
  ENDIF
ELSIF CurrentMonth = 2 THEN
  IF firstHalf THEN
    seasonWeight = febFirstHalf
  ELSE
    seasonWeight = febSecondHalf
  ENDIF
ELSIF CurrentMonth = 3 THEN
  IF firstHalf THEN
    seasonWeight = marFirstHalf
  ELSE
    seasonWeight = marSecondHalf
  ENDIF
ELSIF CurrentMonth = 4 THEN
  IF firstHalf THEN
    seasonWeight = aprFirstHalf
  ELSE
    seasonWeight = aprSecondHalf
  ENDIF
ELSIF CurrentMonth = 5 THEN
  IF firstHalf THEN
    seasonWeight = mayFirstHalf
  ELSE
    seasonWeight = maySecondHalf
  ENDIF
ELSIF CurrentMonth = 6 THEN
  IF firstHalf THEN
    seasonWeight = junFirstHalf
  ELSE
    seasonWeight = junSecondHalf
  ENDIF
ELSIF CurrentMonth = 7 THEN
  IF firstHalf THEN
    seasonWeight = julFirstHalf
  ELSE
    seasonWeight = julSecondHalf
  ENDIF
ELSIF CurrentMonth = 8 THEN
  IF firstHalf THEN
    seasonWeight = augFirstHalf
  ELSE
    seasonWeight = augSecondHalf
  ENDIF
ELSIF CurrentMonth = 9 THEN
  IF firstHalf THEN
    seasonWeight = sepFirstHalf
  ELSE
    seasonWeight = sepSecondHalf
  ENDIF
ELSIF CurrentMonth = 10 THEN
  IF firstHalf THEN
    seasonWeight = octFirstHalf
  ELSE
    seasonWeight = octSecondHalf
  ENDIF
ELSIF CurrentMonth = 11 THEN
  IF firstHalf THEN
    seasonWeight = novFirstHalf
  ELSE
    seasonWeight = novSecondHalf
  ENDIF
ELSE
  IF firstHalf THEN
    seasonWeight = decFirstHalf
  ELSE
    seasonWeight = decSecondHalf
  ENDIF
ENDIF

// The weight used to scale size; with fixed size a zero weight still means "no long".
seasonAllowsLong = seasonWeight <> 0

35 more lines: the entry and exit rules.

Read this first

Known weaknesses

  • There is no stop loss or profit target. Trades only end on time, so a sharp move against a position runs until the bar count is reached.
  • The best run on FTSE 100 4 hours had a profit factor of 1.17, a thin edge after costs.
  • On GBP/USD Daily the max drawdown (USD 7,788) almost equals the net profit (USD 7,847.10).
  • The original version scaled size by season and ATR. The tested code trades a fixed 1 contract, so it is a simplified version.

Indicators used

ATRADX

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 DAX Survivor ProOrder compatible?

Yes. The rewritten code has not been compile-checked yet and the published stats come from the earlier code, so test it in demo before going live.

How did it do across markets?

FTSE 100 4 hours made EUR 7,579.90 over 1,514 trades. DAX 40 Daily made EUR 9,870.90, GBP/USD Daily USD 7,847.10 and Nasdaq 100 Daily EUR 2,959.40.

What does 1 contract risk?

The best run's max drawdown at 1 contract was EUR 1,645.70. With no stop in place, keep extra room above that figure.

Why 4 hour and Daily bars?

Holding periods of 30 and 5 bars need slower bars to capture a real swing. All tested rows were 4 hour or Daily.

Related

Strategies like this one

ATR Band

Uses the same indicator.

10.31 PF · 53 trades

Bollinger Reversal

Best run on the same market, FTSE 100.

1.74 PF · 117 trades

Breakout Failures

A similar profit factor.

1.17 PF · 911 trades

Regime switching is one piece of the puzzle. Join the ProRealAlgos waitlist to see the rest.

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