Engulfing Indicator: Formula, Settings and How to Read It
Engulfing flags bars whose body completely contains the previous bar's body, meaning the lower of open and close sits at or below the previous bar's, and the higher sits at or above it. Only the bodies are compared — wicks play no part — and the direction of the marker comes from the flagged bar itself.
Senzoukria · Indicators · Updated September 2026
Engulfing ships with the Senzoukria desktop app, in the Structure & sessions group of the indicator catalogue. It is drawn on the price chart.
What Engulfing measures
Containment is tested inclusively, so a body that touches exactly the prior open or close still engulfs it. That choice reflects how the auction reads — the current body covers the whole zone the previous bar accepted — and avoids missing the clearest engulfings on a discrete tick grid, where exact equality is common. Direction is taken strictly from the current body: a bar closing above its open is marked bullish with an arrow at its low, one closing below its open is marked bearish with an arrow at its high, and a bar closing exactly at its open produces no marker even when the containment test passes. One deliberate departure from the textbook definition: the previous bar is not required to be the opposite colour. Containment is the measurable fact; filtering on the prior bar's direction is an interpretation left to the reader. The first bar on the chart is never marked, having nothing to engulf.
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:
Période entière ≥ `min` depuis les params (garde-fou UI, même helper que momentum.ts). */ function intParam( params: Record<string, unknown>, key: string, fallback: number, min = 1, ): number { return Math.max(min, Math.floor(numParam(params, key, fallback))); } function boolParam( params: Record<string, unknown>, key: string, fallback: boolean, ): boolean { const v = params[key]; return typeof v === "boolean" ? v : fallback; } /** Bas du CORPS (open/close) — le corps ignore les mèches par définition. */ function bodyLow(b: FootprintBar): number { return Math.min(b.open, b.close); } function bodyHigh(b: FootprintBar): number { return Math.max(b.open, b.close); } function bodySize(b: FootprintBar): number { return Math.abs(b.close - b.open); } function barRange(b: FootprintBar): number { return b.high - b.low; } function upperWick(b: FootprintBar): number { return b.high - bodyHigh(b); } function lowerWick(b: FootprintBar): number { return bodyLow(b) - b.low; } function markersOut(markers: SeriesMarker[]): SeriesOutput { return { shape: "markers", markers }; } function histOut( points: HistogramPoint[], positiveColor: string, negativeColor: string, ): SeriesOutput { return { shape: "histogram", points, positiveColor, negativeColor }; } /** Pivot HAUT strict sur `lr` barres de CHAQUE côté : high[i] > high[j] pour tout j de la fenêtre. STRICT des deux côtés — choix documenté : un plateau (double top exact dans la fenêtre) ne produit AUCUN pivot plutôt que deux pivots collés qui feraient double emploi sur le chart et fausseraient le « dernier swing » du break of structure. `false` si la fenêtre déborde du tableau : un pivot n'est confirmable qu'avec ses `lr` barres de droite CHARGÉES — on ne devine pas la suite. / function isSwingHigh( bars: readonly FootprintBar[], i: number, lr: number, ): boolean { if (i - lr < 0 || i + lr >= bars.length) return false; const h = bars[i].high; for (let j = i - lr; j <= i + lr; j++) { if (j !== i && bars[j].high >= h) return false; } return true; } /** Pivot BAS strict — miroir exact d'`isSwingHigh` (mêmes gardes de bord). */ function isSwingLow( bars: readonly FootprintBar[], i: number, lr: number, ): boolean { if (i - lr < 0 || i + lr >= bars.length) return false; const l = bars[i].low; for (let j = i - lr; j <= i + lr; j++) { if (j !== i && bars[j].low <= l) return false; } return true; } // ── Defs ──────────────────────────────────────────────────────────────────── /** Engulfing — le CORPS de la barre englobe entièrement celui de la précédente : bodyLow[i] ≤ bodyLow[i−1] ET bodyHigh[i] ≥ bodyHigh[i−1] haussière ssi close > open (marqueur arrow-up au LOW) baissière ssi close < open (marqueur arrow-down au HIGH) Contenance INCLUSIVE (≤/≥) : un corps qui touche exactement l'open ou le close précédent l'englobe — c'est la lecture de l'auction (le corps couvre toute la zone d'acceptation de la barre d'avant), et l'exiger strictement ferait rater les engulfings les plus nets sur une grille de ticks discrète. Le SENS vient du corps courant, strictement : close == open (doji) → aucun marqueur, même si la contenance passe. Choix assumé : on n'exige PAS que la barre précédente soit de sens opposé (la définition « livre » d'un engulfing de retournement). La contenance du corps est le fait mesurable ; filtrer sur le sens de la barre d'avant est une interprétation qu'on laisse au lecteur du chart. Première barre → rien (pas de précédente à englober).
How to read it
- A marker after a small-bodied bar means a wider body covered the entire price zone the previous bar had accepted between its open and close.
- If you want the classic reversal reading, check yourself whether the engulfed bar was the opposite colour — the indicator does not apply that filter for you.
- An engulfing bar in the middle of an existing trend is often just a larger continuation bar; its position relative to session structure tells you more than the pattern alone.
- Compare the size of the engulfing body to the instrument's typical body: engulfing a very small previous bar is a low bar to clear.
- The pattern is price geometry only — read the flagged bar's footprint or delta to see whether the move came from aggressive buyers, aggressive sellers, or passive absorption.
What it does not show
Four prices enter the test, so an engulfing bar traded on heavy participation and one traded on almost none look identical on the chart. When a single wide bar dwarfs several small ones, as happens in fast markets, engulfings become common and the body being cleared is correspondingly small. Because the previous bar's direction is not filtered, some markers describe continuation rather than reversal, and separating the two is the reader's job. The marker records a shape that has completed and confirms nothing about what follows.
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 High/Low — Structure & sessions
- Opening Range — Structure & sessions
- IB Extensions — Structure & sessions
- Classic Pivots — Structure & sessions
- Camarilla Pivots — Structure & sessions
- Naked POC — 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
- Does an engulfing candle have to engulf the wicks too?
- Not here. The test compares bodies only: the current bar's open-to-close range must contain the previous bar's open-to-close range. The wicks are ignored by definition, so a bar can be flagged as engulfing even though the previous bar's high or low extends beyond it.
- Does the previous candle have to be the opposite colour?
- This indicator does not require it. It marks any bar whose body contains the previous body, then takes the direction from the current bar alone. That is a deliberate choice: containment is the measurable fact, while requiring the prior bar to be the opposite colour is an interpretation layered on top of it, which you can apply yourself by looking at the chart.
- Why is my bar not flagged even though it engulfs the previous one?
- The most likely reason is that the bar closed exactly at its open. A bar with no body direction produces no marker even when the containment condition is satisfied, because the indicator would have no direction to assign to the arrow. The other common case is the very first bar on the chart, which has no predecessor to engulf.