Session High/Low Indicator: Formula, Settings and How to Read It
Session High/Low plots the highest and lowest prices traded since the session opened, as two lines on the price chart. Both extremes reset at each session open (17:00 CT on the CME calendar) and step outward only when a new extreme prints.
Senzoukria · Indicators · Updated September 2026
Session High/Low ships with the Senzoukria desktop app, in the Structure & sessions group of the indicator catalogue. It is drawn on the price chart.
What Session High/Low measures
The two lines track running extremes, not the final high and low of a completed session: at any bar they show the furthest price reached so far on each side. Because a running extreme exists from the very first bar of a session, the lines are defined immediately, with none of the warm-up an average requires. The running values are built bar by bar in chronological order and reset the moment a bar belongs to a new session open, so the only thing that moves a line is a bar that trades beyond it.
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:
`to` d'un niveau : borne droite (dernière barre) d'une tranche passée, null (= bord droit du chart) pour la dernière tranche chargée. */ function rangeTo( endBarIdx: number, isLast: boolean, bars: readonly FootprintBar[], ): number | null { return isLast ? null : bars[endBarIdx].bucketTsNs; } /** H/L des barres d'une session STRICTEMENT avant `endSec` (bucket start < endSec — même règle de fenêtre que l'IB de profiles.ts). `null` si aucune barre de la fenêtre n'est chargée (chargement en cours de séance) : un range partiel serait un mensonge. */ function windowHiLo( bars: readonly FootprintBar[], ses: SessionSlice, endSec: number, ): { hi: number; lo: number } | null { let hi = Number.NEGATIVE_INFINITY; let lo = Number.POSITIVE_INFINITY; for (let i = ses.start; i <= ses.end; i++) { const b = bars[i]; if (b.bucketTsNs / 1e9 >= endSec) break; // barres chronologiques (moteur) if (b.high > hi) hi = b.high; if (b.low < lo) lo = b.low; } return Number.isFinite(hi) && Number.isFinite(lo) ? { hi, lo } : null; } /** H, L et close (dernière barre) d'une session complète. Les tranches de `splitSessions` sont non vides par construction → extrêmes finis. */ function sessionHLC( bars: readonly FootprintBar[], ses: SessionSlice, ): { h: number; l: number; c: number } { let h = Number.NEGATIVE_INFINITY; let l = Number.POSITIVE_INFINITY; for (let i = ses.start; i <= ses.end; i++) { if (bars[i].high > h) h = bars[i].high; if (bars[i].low < l) l = bars[i].low; } return { h, l, c: bars[ses.end].close }; } /** Extrêmes COURANTS (running high/low) par barre, reset à chaque ouverture de session (17:00 CT). Partagé par session-high-low et session-mid. */ function runningSessionExtremes( bars: readonly FootprintBar[], ctx: SeriesContext, ): Array<{ hi: number; lo: number }> { const out: Array<{ hi: number; lo: number }> = []; let hi = 0; let lo = 0; let curOpen: number | null = null; for (const b of bars) { const open = barSessionOpenSec(b, ctx); if (open !== curOpen) { curOpen = open; hi = b.high; lo = b.low; } else { if (b.high > hi) hi = b.high; if (b.low < lo) lo = b.low; } out.push({ hi, lo }); } return out; } /** Clé de semaine CME d'une session, depuis son `openSec` (17:00 CT). Jour de TRADE = jour UTC de (openSec + 12 h) : l'open est à 22:00 (CDT) ou 23:00 (CST) UTC, +12 h tombe toujours le lendemain 10:00/11:00 UTC — juste dans les deux régimes DST (l'ouverture du dimanche = session du lundi). Semaines base LUNDI, ancrées sur l'epoch-day 4 (lundi 5 janv. 1970) : lundi→vendredi de trade partagent la même clé. */ function cmeWeekKey(openSec: number): number { const tradeDay = Math.floor((openSec + 12 * 3600) / 86400); return Math.floor((tradeDay - 4) / 7); } // ── Indicateurs ───────────────────────────────────────────────────────────── /** High/Low de session « developing » : extrêmes courants (running max des highs / min des lows) depuis l'ouverture de session (17:00 CT), reset à CHAQUE ouverture. Défini dès la 1ʳᵉ barre — un extrême courant existe immédiatement, contrairement à une moyenne : pas de warm-up. 2 lignes.
How to read it
- A flat high line while price works lower simply means no new extreme has printed; the level is where the last attempt upward stopped.
- When both lines move outward within the same bar, the session range expanded on both sides at once, which is what an outside bar looks like on this indicator.
- The vertical gap between the two lines is the session range so far; read it alongside Range Compression to see whether the day is still contracting.
- Price returning to an untouched session extreme is the moment to look at the footprint there rather than assume the level holds or breaks.
- Just after the 17:00 CT reset the lines sit close together by construction, so early readings carry little information about the day.
Parameters and defaults
The only substantive setting is Smoothing, which defaults to 1, meaning the raw extremes are drawn. Raising it (up to 200) averages the plotted lines over that many bars, which makes them lag the actual extreme and stop marking the exact price that traded — rarely what you want from a level meant to be precise. The two colours (#26a69a for the high, #ef5350 for the low) only separate the lines visually.
| Parameter | Type | Default | Range |
|---|---|---|---|
| Smoothing | number | 1 | 1 – 200 |
What it does not show
The indicator reports two prices and nothing else: it cannot tell you how much volume traded at an extreme, or which side was aggressing when it was set. Its session boundary is the 17:00 CT CME open, so an instrument on a different trading calendar will show a reset that does not match its own day. The extremes are measured from the bars present in the chart, so a session whose opening hours are not loaded — the first session at the left edge, typically — produces lines drawn from a fraction of that session. A level being reached says nothing about whether it will hold.
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
- Session Mid — Structure & sessions
- Prior Session VWAP — Structure & sessions
- Prior Week High/Low — Structure & sessions
- Engulfing — Structure & sessions
- Pin Bar — Structure & sessions
- Inside Bar — Structure & sessions
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
- When does the session high and low reset?
- The running high and low reset at each session open, anchored to 17:00 CT on the CME calendar. Everything traded from that open onward belongs to the new session, including the overnight hours, so the reset does not fall at midnight or at the regular-hours open.
- Why does the first session on my chart show a narrower range than it should?
- The lines are computed from the bars that are actually loaded. If your history begins in the middle of a session, the running extremes start at the first loaded bar rather than at the 17:00 CT open, so anything that traded before it is not part of the range shown. Scrolling back far enough to load the full session restores the correct extremes.
- Is the session high and low the same as the daily high and low?
- Not usually. This indicator anchors the session to the 17:00 CT open, so the overnight hours are included. A daily high and low quoted for regular trading hours only will differ whenever the extreme was made outside those hours.