Appearance
Personalize your experience
Aurora Ignition
FreeFirst expansion out of ranked volatility compression
Live engine preview
The QuaScript engine's own output on the chart the terminal uses. Change the settings or edit the code and press Run to recompute it.
About
Trades the first expansion out of a quiet market. Volatility (ATR over price) is ranked against its own history; a rank under the quiet level marks stored energy. When, soon after such a compression, price closes outside the second volatility curtain around a two-pole smoothed centre while the rank is rising, the expansion has started. The position rides the centre line: the stop trails at the centre once the trade is a full ATR in profit. Entry: rank below `quiet` within the last `memory` bars, close beyond centre +/- 2 curtains (`width` ATR each), rank rising. Exit: initial stop at the centre (at least 1 ATR), trailing stop at the centre after +1 ATR, close back inside the first curtain on the wrong side, or extreme volatility rank (take the move). Risk: 1 % per trade.
Settings
Centre smoothing: 34
ATR length: 20
Curtain spacing (ATR): 0.6
Volatility rank window: 250
Quiet rank (%): 15
Take-profit rank (%): 97
Compression memory (bars): 20
Measured backtests
Run by the backtest engine on public candles, 2025-11-01 to 2026-11-01, with the script's own commission and slippage, on BTCUSDT 1h (Binance) and ETHUSDT 1h (Binance). The figures per market are in the Measured backtest panel below. Past results do not predict future returns.
Backtest it yourself
Open it on the backtesting page to run it on any symbol, interval and date range, then use Monte Carlo, optimisation, walk-forward and robustness tests.
Strategy Rules
Entry Conditions
- ▸ rank below `quiet` within the last `memory` bars, close beyond centre +/- 2 curtains (`width` ATR each), rank rising
Exit Conditions
- ▸ initial stop at the centre (at least 1 ATR), trailing stop at the centre after +1 ATR, close back inside the first curtain on the wrong side, or extreme volatility rank (take the move)
Measured backtest
BTCUSDT 1h (Binance), 2025-11-01 to 2026-11-01 · backtest engine, script costs included
-21.9%
Return
-2.03
Sharpe
-22.4%
Max DD
29.5%
Win Rate
122
Trades
| Market | Trades | Return | Sharpe | Max DD | Win rate | Profit factor |
|---|---|---|---|---|---|---|
| BTCUSDT 1h | 122 | -21.9% | -2.03 | -22.4% | 29.5% | 0.56 |
| ETHUSDT 1h | 124 | -19.7% | -1.42 | -20.6% | 29.8% | 0.69 |
Past results on historical data do not predict future returns.
Source Code
Edit in IDE| 1 | strategy "Aurora Ignition" { |
| 2 | overlay = true |
| 3 | capital = 100000 |
| 4 | commission = 0.05 |
| 5 | slippage = 1 |
| 6 | sizing = risk_percent |
| 7 | max_leverage = 1 |
| 8 | size = 1 |
| 9 | pyramiding = 1 |
| 10 | } |
| 11 | /// Trades the first expansion out of a quiet market. Volatility (ATR over price) is ranked against |
| 12 | /// its own history; a rank under the quiet level marks stored energy. When, soon after such a |
| 13 | /// compression, price closes outside the second volatility curtain around a two-pole smoothed |
| 14 | /// centre while the rank is rising, the expansion has started. The position rides the centre line: |
| 15 | /// the stop trails at the centre once the trade is a full ATR in profit. |
| 16 | /// Entry: rank below `quiet` within the last `memory` bars, close beyond centre +/- 2 curtains |
| 17 | /// (`width` ATR each), rank rising. Exit: initial stop at the centre (at least 1 ATR), trailing |
| 18 | /// stop at the centre after +1 ATR, close back inside the first curtain on the wrong side, or |
| 19 | /// extreme volatility rank (take the move). Risk: 1 % per trade. |
| 20 | use "viz/premium" as pr |
| 21 | len = param.int(34, title = "Centre smoothing", min = 5, max = 400, group = "Aurora") |
| 22 | atr_n = param.int(20, title = "ATR length", min = 2, max = 400, group = "Aurora") |
| 23 | width = param.float(0.6, title = "Curtain spacing (ATR)", min = 0.1, max = 3, step = 0.05, group = "Aurora") |
| 24 | rank_n = param.int(250, title = "Volatility rank window", min = 30, max = 5000, group = "Regime") |
| 25 | quiet = param.float(15, title = "Quiet rank (%)", min = 1, max = 50, group = "Regime") |
| 26 | hot = param.float(97, title = "Take-profit rank (%)", min = 60, max = 100, group = "Regime") |
| 27 | memory = param.int(20, title = "Compression memory (bars)", min = 2, max = 200, group = "Signals") |
| 28 | mid = ta.super_smoother(close, len) |
| 29 | a = ta.atr(atr_n) |
| 30 | rank = math.coalesce(stat.percent_rank(a / close, rank_n), 50) |
| 31 | since_quiet = ta.bars_since(rank < quiet) |
| 32 | recent = not math.is_na(since_quiet) and since_quiet <= memory |
| 33 | up2 = mid + 2 * width * a |
| 34 | dn2 = mid - 2 * width * a |
| 35 | go_l = recent and close > up2 and rank > rank[1] |
| 36 | go_s = recent and close < dn2 and rank > rank[1] |
| 37 | persist used = false |
| 38 | if rank < quiet { used := false } |
| 39 | flat = position.size == 0 |
| 40 | if flat and go_l and not used { |
| 41 | order.market("L", side.long) |
| 42 | exit.bracket("L stop", entry = "L", stop = math.min(mid, close - a)) |
| 43 | used := true |
| 44 | } |
| 45 | if flat and go_s and not used { |
| 46 | order.market("S", side.short) |
| 47 | exit.bracket("S stop", entry = "S", stop = math.max(mid, close + a)) |
| 48 | used := true |
| 49 | } |
| 50 | // trail at the centre once a full ATR in profit |
| 51 | if position.size > 0 and close - position.avg_price > a { exit.bracket("L stop", entry = "L", stop = mid) } |
| 52 | if position.size < 0 and position.avg_price - close > a { exit.bracket("S stop", entry = "S", stop = mid) } |
| 53 | if position.size > 0 and close < mid - width * a { exit.close("L") } |
| 54 | if position.size < 0 and close > mid + width * a { exit.close("S") } |
| 55 | if position.size != 0 and rank > hot { exit.close_all() } |
| 56 | risk.max_drawdown(25) |
| 57 | c = render.line(mid, "Centre", color = color.translucent(color.white, 35), width = 1.5) |
| 58 | o_up = render.line(up2, "Ignition line above", color = color.translucent(color.amber.300, 40), width = 1) |
| 59 | o_dn = render.line(dn2, "Ignition line below", color = color.translucent(color.amber.300, 40), width = 1) |
| 60 | glow = color.ramp(rank, 0, 100, "magma", 70) |
| 61 | render.band(o_up, c, color = glow, opacity = 1, title = "Upper aurora") |
| 62 | render.band(c, o_dn, color = glow, opacity = 1, title = "Lower aurora") |
| 63 | render.mark(go_l and flat and not used[1], shape = shape.triangle_up, at = anchor.below_bar, color = color.amber.300, text = "Ignite", title = "Long ignition") |
| 64 | render.mark(go_s and flat and not used[1], shape = shape.triangle_down, at = anchor.above_bar, color = color.orange.400, text = "Ignite", title = "Short ignition") |
| 65 | persist t = draw.table.create(anchor.top_right, 5, 2) |
| 66 | if bar.is_last { |
| 67 | pr.heading(t, 2, "Aurora Ignition", "Strategy · compression to expansion") |
| 68 | pr.row(t, 2, "Volatility rank", str.format("{:.0f} %", rank), rank < quiet ? color.violet.300 : rank > hot ? pr.WARN : color.white) |
| 69 | pr.row(t, 3, "Compression", recent ? str.format("{} bars ago", since_quiet) : "None recent", recent ? pr.BULL : pr.LABEL) |
| 70 | pr.row(t, 4, "Armed", recent and not used ? "Yes" : "No", recent and not used ? pr.BULL : pr.LABEL) |
| 71 | } |
| 72 |
Reviews
No reviews yet. Be the first to review this listing.