ATR Stop (long) Indicator: Formula, Settings and How to Read It
ATR Stop (long) draws a reference line a fixed number of Average True Ranges below each bar's close, giving a volatility-scaled level for a long position. It is an overlay on price and a drawing only — no order is placed from it.
Senzoukria · Indicators · Updated September 2026
ATR Stop (long) ships with the Senzoukria desktop app, in the Volatility group of the indicator catalogue. It is drawn on the price chart.
What ATR Stop (long) measures
The line is close minus multiplier × the N-period Wilder ATR, with defaults of 14 bars and a multiplier of 2. Expressing the distance in ATRs rather than fixed points keeps the chance of the level being touched roughly comparable between a fast open and a quiet overnight session, where twenty points mean two very different things. This version follows the close in both directions: it rises when the close rises and comes back down when the close falls, so it does not ratchet. Nothing is drawn while the ATR is still warming up, rather than a partial level built from an incomplete average.
The formula, as implemented
This is not a description of how the indicator is usually defined elsewhere — it is what the shipped code computes, documented next to the implementation:
Param entier ≥ 1 (les périodes n'ont pas de sens en fractions de barre). */ function intParam( params: Record<string, unknown>, key: string, fallback: number, ): number { return Math.max(1, Math.floor(numParam(params, key, fallback))); } /** Plus haut des N dernières barres (fenêtre [i−N+1, i]). Warm-up → null : fenêtre incomplète = période mensongère (règle `donchian`). */ function rollingHigh( bars: readonly FootprintBar[], n: number, ): Array<number | null> { const out: Array<number | null> = new Array(bars.length).fill(null); for (let i = n - 1; i < bars.length; i++) { let hi = Number.NEGATIVE_INFINITY; for (let j = i - n + 1; j <= i; j++) { if (bars[j].high > hi) hi = bars[j].high; } out[i] = hi; } return out; } /** Plus bas des N dernières barres — symétrique de `rollingHigh`. */ function rollingLow( bars: readonly FootprintBar[], n: number, ): Array<number | null> { const out: Array<number | null> = new Array(bars.length).fill(null); for (let i = n - 1; i < bars.length; i++) { let lo = Number.POSITIVE_INFINITY; for (let j = i - n + 1; j <= i; j++) { if (bars[j].low < lo) lo = bars[j].low; } out[i] = lo; } return out; } /** Range COMPLET d'une session (max high − min low). Les tranches de `splitSessions` sont non vides par construction → extrêmes finis. */ function sessionRange( bars: readonly FootprintBar[], ses: SessionSlice, ): number { let hi = Number.NEGATIVE_INFINITY; let lo = Number.POSITIVE_INFINITY; for (let i = ses.start; i <= ses.end; i++) { if (bars[i].high > hi) hi = bars[i].high; if (bars[i].low < lo) lo = bars[i].low; } return hi - lo; } /** `to` d'un niveau de session : borne droite pour une session passée, null (= bord droit du chart) pour la dernière session chargée. */ function sessionTo( ses: SessionSlice, isLast: boolean, bars: readonly FootprintBar[], ): number | null { return isLast ? null : bars[ses.end].bucketTsNs; } /** Sortie ligne alignée sur un tableau de valeurs déjà calculé. */ function valuesLine( bars: readonly FootprintBar[], vals: ReadonlyArray<number | null>, ): SeriesPoint[] { return bars.map((b, i) => ({ time: b.bucketTsNs, value: vals[i] })); } // ── 1-2. Stops ATR ────────────────────────────────────────────────────────── /** ATR Stop (long) — stop suiveur THÉORIQUE d'une position longue : stop[i] = close[i] − mult × ATR_N[i] Défauts N=14 (Wilder), mult=2 : deux ATR sous le close, la distance classique pour laisser respirer un indice CME sans se faire sortir par le bruit d'une barre. POURQUOI en ATR et pas en points fixes : un stop à 20 points est serré à 09:30 et large à 03:00 — l'ATR le met à l'échelle de la volatilité de l'instant, donc la probabilité de touche reste comparable d'un régime à l'autre. ATTENTION (documenté, assumé) : cette version SUIT le close, elle ne cliquete PAS (elle peut redescendre si le close redescend). Le stop qui ne recule jamais est `volatility-stop`. Warm-up ATR → null (le renderer lève le crayon), jamais de stop partiel.
How to read it
- The gap between price and the line is the current volatility budget: when it widens, bars are covering more ground and a fixed-point stop would be hit by ordinary noise.
- A close below the line marks the level being given up, but check which of the two moved — price can fall through it, or the line can have followed price down.
- Because it tracks the close, a deep pullback drags the level down with it. The study built to never retreat is the volatility stop; the chandelier exit changes the anchor to a window high, which is a different behaviour again.
- Raising the multiplier moves the line further away — fewer touches, larger distance; lowering it does the opposite. Neither is safer, they simply trade frequency against distance.
- A line that falls inside a heavily traded price area sits where activity is already concentrated, something the calculation itself knows nothing about.
Parameters and defaults
ATR period defaults to 14 and decides how quickly the distance adapts — a short period tightens the line soon after a calm stretch, a long one keeps its distance through it. The multiplier defaults to 2, accepts 0.1 to 10, and scales the offset linearly; it is the parameter that decides how much ordinary movement the level tolerates.
| Parameter | Type | Default | Range |
|---|---|---|---|
| ATR period | number | 14 | 1 – 200 |
| ATR multiplier | number | 2 | 0.1 – 10 |
What it does not show
The line is a chart study, not an order and not a position: nothing submits, moves or cancels a stop from it, and live routing in Senzoukria goes through the explicit trading path with its own manual arming. It knows nothing about your entry, size or account, so the distance to price is not a loss figure. Because it follows the close, it can retreat during a drawdown, which is the opposite of a locked-in trailing stop. And ATR measures range alone, so the level is blind to order flow — absorption or a large resting bid at that price is outside its inputs.
Using it in Senzoukria
Add it from the Indicators panel of any footprint chart or candle chart. It runs on futures data from Rithmic or Databento and on crypto pairs from Binance and Bybit, on the same engine — the calculation does not change with the venue, only the data feeding it does. Market data subscriptions are billed by the provider, separately from the app.
Related indicators
- True Range — Volatility
- Std Dev — Volatility
- Squeeze — Volatility
- Chaikin Volatility — Volatility
- Realized Vol — Volatility
- Skewness — Volatility
See the full indicator library, or start with the order flow guide if you are new to reading aggression, delta and absorption.
Frequently asked questions
- Does the ATR Stop indicator place a real stop order?
- No. It draws a line on the chart and nothing more. Order entry in Senzoukria is a separate action that requires explicit human arming, and this study is not connected to it.
- Why does my ATR stop line move down?
- This version is anchored on the close, not on a running maximum, so when the close falls the line falls with it. That is documented behaviour, not a bug. If you need a level that never moves against a long position, use the volatility stop, which is built to ratchet.
- What ATR multiplier should I use?
- The default is 2 ATRs with a 14-period average, the usual distance for letting an index future breathe. A smaller multiplier places the level inside the range of a normal bar and it will be touched often; a larger one keeps the level away at the cost of distance. There is no value that is correct independently of the instrument and the bar type.