Fathom Flow
Accelerations, exhaustions, slowdowns and absorption levels.
What the indicator shows
- Exhaustion: a push runs out of steam despite the volume (filled triangle on the Fathom chart).
- Slowdown: aggression fades near an extreme (hollow triangle on the Fathom chart).
- Acceleration: volume suddenly takes off over one or two bars (rectangle on the Fathom chart).
- Control (C) and extreme (E) lines, drawn when price leaves a consolidation; on the Fathom chart, the control line is solid and the extreme line dotted.
- The
labelfield combines A (absorption, a breakout against the consolidation’s delta) or P (a breakout with it), then C or E. Example:ACis the control line after an absorption.
How to use it
- An acceleration in the direction of the move confirms it. An exhaustion or a slowdown near an extreme warns that it is losing strength, often before a reversal.
- After a consolidation, the control (C) and extreme (E) lines are reference levels to follow the breakout. A breakout marked A (
AC,AE) went against delta: the aggression was absorbed. - Tune each signal separately:
weakto see more of them,strongto keep only the most pronounced. - Do not show a drawing with
visible: false.
How it is computed
- Acceleration (rectangle): volume is summed over 1-second windows. Once per bar, the largest window volume seen since the previous check is compared with the last 50, itself included: if it reaches their mean + k standard deviations (k = 3.25 with
weak, 4.75 withmedium, 6.5 withstrong), a rectangle covers the price range of the checked window (start-0.5, or -1.5 when it began in the previous bar). It stays extended until a bar body crosses it, 12 bars at most. - Exhaustion (filled triangle): over the last n bars (n = 5 with
weak, 8 withmedium, 10 withstrong), the sum of deltas and the sum of volumes are tracked. When the sign of that delta sum flips after at least n/2 bars (rounded down), the phase that ends is compared with the last 10: if its peak volume reaches their mean + 0.5 standard deviation while its peak absolute delta stays within their mean + 1 standard deviation (1.25 withweak), an exhaustion is flagged opposite to the phase (up: trueafter a selling phase).variant0: computed on volumes;variant1: the same on the number of buying and selling trades. - Slowdown (hollow triangle): a profile of buying and selling volume per tick is tracked while price stays within an 8-tick spread; beyond it, and at every session open, it restarts from the trade’s price. The threshold is the mean − k standard deviations (k = 0.45 with
weak, 0.8 withmedium, 1.05 withstrong) of the largest per-tick volume of the 35 previous profiles, truncated. When a bar closes, if the profile spans at least 3 ticks and, on its 3 lowest ticks, selling volume stays within the threshold while decreasing toward the low, a bullish slowdown is placed at the profile’s low; likewise at the high with buying volume. - Consolidation: at least 5 bars whose bodies fit within 85% of the average true range of the last 21 bars. It extends as long as no bar closes more than 20% of that range beyond its bodies (with
absorption: "strong", as long as no wick goes that far). - Lines: when price leaves a consolidation, if its volume, its delta or its bars’ volume reaches its threshold (mean + k standard deviations of the last 25 consolidations or of the last 50 consolidation bars, this one included, k rising from
weaktostrong), two lines are drawn. Control (control): the POC of the consolidation’s bars, or, withlevelMode: "aggressive", the edge of their bodies on the breakout side. Extreme (extreme): withlevelMode: "conservative", the wick opposite to the breakout; otherwise, the edge of the 70% value area opposite to the breakout. A line stays extended until a bar body crosses it,projectionBarsbars at most. label:A(absorption) when the breakout goes against the consolidation’s delta,Pwhen it goes with it, thenC(control) orE(extreme).sidegives the sign of that delta,upthe breakout direction.
When it updates
- Each drawing is sent when its anchor bar (
bar) closes, sent again on every change, then sent final once it can no longer change: an exhaustion is final as soon as it is sent; a rectangle or a line, once it stops being extended (active: false, with itsend). - While it is the latest one, a slowdown can move to another anchor bar (
bar,start) and price, and switch fromvisible: truetofalseor back: it is visible while a consolidation is in progress, or when its price is within the body of the last consolidation, at most 5 bars after it. It becomes final when a new slowdown replaces it, or at the end of the week, sometimes withvisible: false: do not show it. Inconfirmedmode it then arrives directly withvisible: false. <kind>is the drawing type and<weekSunday>theYYYY-MM-DDdate of the week’s Sunday reopen. The ordinal is shared by all kinds: for a given kind, the numbers are not consecutive.- Weekly reset: on the first trade of the Sunday reopen (6:00 pm New York time), the week’s last bar is processed, rectangles and lines still extended stop (
active: false, with theirend), drawings still in progress are sent final and the computation starts over.
- Identifier
flow-tracker- Objects received
drawing- Historical cost
- 1 compute unit per trade
Subscribe
The same params work in real time, on historical data and in exports. Parameters you omit take their default values.
{
"t": "subscribe",
"sub": "flow-tracker",
"instrument": "NQ.front",
"indicator": "flow-tracker",
"params": {
"absorption": "medium",
"acceleration": "medium",
"exhaustion": "medium",
"levelMode": "conservative",
"projectionBars": 10,
"slowdown": "medium",
"timeframe": 60
},
"mode": "live",
"from": "live"
}Parameters
As soon as a parameter differs from its default, the subscription counts as a custom configuration. To change a parameter, open a new subscription.
| Parameter | Type | Default | Allowed values | Unit | Description |
|---|---|---|---|---|---|
absorption | choice | medium | weak · medium · strong | — | Sensitivity of the control and extreme lines: weak (more lines), medium or strong (only after the heaviest consolidations). |
acceleration | choice | medium | weak · medium · strong | — | Acceleration sensitivity: weak (more signals), medium or strong (fewer, more pronounced signals). |
exhaustion | choice | medium | weak · medium · strong | — | Exhaustion sensitivity: weak (more signals, on short pushes), medium or strong (fewer signals, on longer pushes). |
levelMode | choice | conservative | conservative · medium · aggressive | — | Placement of the control and extreme lines, from farthest from the breakout (conservative) to closest (aggressive). |
projectionBars | integer | 10 | 1 to 1,000 | bars | Maximum length of the control and extreme lines, in bars; a line stops earlier when a bar body crosses it. |
slowdown | choice | medium | weak · medium · strong | — | Slowdown sensitivity: weak (more signals), medium or strong (fewer, more pronounced signals). |
timeframe | integer | 60 | 1 · 5 · 10 · 15 · 30 · 60 · 120 · 180 · 300 · 600 · 900 · 1800 · 3600 | — | Bar duration in seconds: from 1 second (1) to 1 hour (3600). |
Objects received
Each object keeps the same id from one update to the next. Its data is in the data field. Prices are in ticks: multiply them by the instrument’s tick size (GET /v1/instruments) to get points.
drawing sent in progress
Drawing; in progress while it can still change.
id format: <kind>:<weekSunday>:<ordinal>. The object is sent in progress (final: false), then sent again on every change; each version fully replaces the previous one. Once it can no longer change, its last version carries final: true, except for objects whose description says they are removed without a final version.
| Field | Type | Unit | Present | Description |
|---|---|---|---|---|
kind | string · acceleration | exhaustion | slowdown | control | extreme | — | always | Type: acceleration (rectangle), exhaustion and slowdown (triangles), control and extreme (lines). It is also the first segment of the id. |
active | boolean | — | sometimes | Rectangle or line still extended to the right. |
bar | string | timestamp (ns) | always | Start of the anchor bar. |
end | number | bars | sometimes | End of the drawing, in bars from the anchor bar, rounded to a tenth (can be fractional); present on final rectangles and lines. |
high | integer | ticks | sometimes | Top of a rectangle. |
label | string · AC | PC | AE | PE | — | sometimes | Line: A (absorption) when the consolidation breakout goes against its delta, P when it goes with it; then C for the control line, E for the extreme line. AC is the control line after an absorption. |
low | integer | ticks | sometimes | Bottom of a rectangle. |
price | integer | ticks | sometimes | Price of a triangle or a line. Exhaustion: 3 ticks below the bar’s low (up: true) or above its high; slowdown: low or high of the tracked profile. |
side | string · buy | sell | — | sometimes | Line: sign of the consolidation’s delta (buy positive or zero, sell negative). |
start | number | bars | always | Start of the drawing, in bars from the anchor bar, rounded to a tenth: can be fractional or negative (-0.5, or -1.5 for an acceleration over two bars). Matching time, in nanoseconds: BigInt(bar) + BigInt(Math.round(start × timeframe × 1e9)) (bar is in nanoseconds, timeframe in seconds). |
up | boolean | — | always | Bullish direction: positive or zero delta for an acceleration, exhaustion of a selling phase, slowdown at the low, upward consolidation breakout for a line. |
variant | integer | — | sometimes | Exhaustion: 0 when detected on volumes, 1 on the number of buying and selling trades. Both variants can flag the same bar, at the same price. |
visible | boolean | — | always | false: the signal is not valid, do not show it. Only a slowdown can switch to false, then back to true, while it is in progress; it can end with false, and then arrives that way in confirmed mode. |
Example messages
Messages as the WebSocket sends them to the subscription above, taken from a real NQ session. Historical data returns the same objects, with the same cursor, without the sub field.
{
"sub": "flow-tracker",
"cursor": "20720.2457.0",
"t": "upsert",
"id": "exhaustion:2026-09-20:1101",
"final": true,
"ts": "1790209200076693991",
"data": {
"kind": "exhaustion",
"bar": "1790209140000000000",
"start": 0,
"price": 122953,
"up": true,
"visible": true,
"variant": 0
}
}{
"sub": "flow-tracker",
"cursor": "20720.3293.1",
"t": "upsert",
"id": "slowdown:2026-09-20:1104",
"final": false,
"ts": "1790209860030424303",
"data": {
"kind": "slowdown",
"bar": "1790209800000000000",
"start": 0,
"price": 122940,
"up": false,
"visible": true
}
}{
"sub": "flow-tracker",
"cursor": "20720.3454.0",
"t": "upsert",
"id": "control:2026-09-20:1105",
"final": false,
"ts": "1790209920141869579",
"data": {
"kind": "control",
"bar": "1790209860000000000",
"start": 0,
"price": 122927,
"up": true,
"visible": true,
"active": true,
"label": "AC",
"side": "sell"
}
}{
"sub": "flow-tracker",
"cursor": "20720.3454.1",
"t": "upsert",
"id": "extreme:2026-09-20:1106",
"final": false,
"ts": "1790209920141869579",
"data": {
"kind": "extreme",
"bar": "1790209860000000000",
"start": 0,
"price": 122913,
"up": true,
"visible": true,
"active": true,
"label": "AE",
"side": "sell"
}
}{
"sub": "flow-tracker",
"cursor": "20720.3770.0",
"t": "upsert",
"id": "slowdown:2026-09-20:1104",
"final": true,
"ts": "1790210280761988745",
"data": {
"kind": "slowdown",
"bar": "1790209800000000000",
"start": 0,
"price": 122940,
"up": false,
"visible": true
}
}{
"sub": "flow-tracker",
"cursor": "20720.4035.0",
"t": "upsert",
"id": "control:2026-09-20:1105",
"final": true,
"ts": "1790210520086671473",
"data": {
"kind": "control",
"bar": "1790209860000000000",
"start": 0,
"end": 10,
"price": 122927,
"up": true,
"visible": true,
"active": false,
"label": "AC",
"side": "sell"
}
}JSON schemas
To validate or type your data: the JSON schemas of the parameters and of data, also available from GET /v1/indicators. The SDK can generate types from them.
Parameters schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://fathomcharts.com/schemas/flow-tracker/params.json",
"type": "object",
"additionalProperties": false,
"properties": {
"absorption": {
"description": "Sensitivity of the control and extreme lines: `weak` (more lines), `medium` or `strong` (only after the heaviest consolidations).",
"type": "string",
"default": "medium",
"enum": [
"weak",
"medium",
"strong"
]
},
"acceleration": {
"description": "Acceleration sensitivity: `weak` (more signals), `medium` or `strong` (fewer, more pronounced signals).",
"type": "string",
"default": "medium",
"enum": [
"weak",
"medium",
"strong"
]
},
"exhaustion": {
"description": "Exhaustion sensitivity: `weak` (more signals, on short pushes), `medium` or `strong` (fewer signals, on longer pushes).",
"type": "string",
"default": "medium",
"enum": [
"weak",
"medium",
"strong"
]
},
"levelMode": {
"description": "Placement of the control and extreme lines, from farthest from the breakout (`conservative`) to closest (`aggressive`).",
"type": "string",
"default": "conservative",
"enum": [
"conservative",
"medium",
"aggressive"
]
},
"projectionBars": {
"description": "Maximum length of the control and extreme lines, in bars; a line stops earlier when a bar body crosses it.",
"type": "integer",
"default": 10,
"minimum": 1,
"maximum": 1000
},
"slowdown": {
"description": "Slowdown sensitivity: `weak` (more signals), `medium` or `strong` (fewer, more pronounced signals).",
"type": "string",
"default": "medium",
"enum": [
"weak",
"medium",
"strong"
]
},
"timeframe": {
"description": "Bar duration in seconds: from 1 second (`1`) to 1 hour (`3600`).",
"type": "integer",
"default": 60,
"enum": [
1,
5,
10,
15,
30,
60,
120,
180,
300,
600,
900,
1800,
3600
]
}
}
}data field schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "https://fathomcharts.com/schemas/flow-tracker/data.json",
"title": "drawing",
"type": "object",
"additionalProperties": false,
"properties": {
"kind": {
"description": "Type: acceleration (rectangle), exhaustion and slowdown (triangles), control and extreme (lines). It is also the first segment of the `id`.",
"type": "string",
"enum": [
"acceleration",
"exhaustion",
"slowdown",
"control",
"extreme"
]
},
"active": {
"description": "Rectangle or line still extended to the right.",
"type": "boolean"
},
"bar": {
"description": "Start of the anchor bar.",
"type": "string",
"pattern": "^[0-9]+$"
},
"end": {
"description": "End of the drawing, in bars from the anchor bar, rounded to a tenth (can be fractional); present on final rectangles and lines.",
"type": "number"
},
"high": {
"description": "Top of a rectangle.",
"type": "integer"
},
"label": {
"description": "Line: `A` (absorption) when the consolidation breakout goes against its delta, `P` when it goes with it; then `C` for the control line, `E` for the extreme line. `AC` is the control line after an absorption.",
"type": "string",
"enum": [
"AC",
"PC",
"AE",
"PE"
]
},
"low": {
"description": "Bottom of a rectangle.",
"type": "integer"
},
"price": {
"description": "Price of a triangle or a line. Exhaustion: 3 ticks below the bar’s low (`up: true`) or above its high; slowdown: low or high of the tracked profile.",
"type": "integer"
},
"side": {
"description": "Line: sign of the consolidation’s delta (`buy` positive or zero, `sell` negative).",
"type": "string",
"enum": [
"buy",
"sell"
]
},
"start": {
"description": "Start of the drawing, in bars from the anchor bar, rounded to a tenth: can be fractional or negative (-0.5, or -1.5 for an acceleration over two bars). Matching time, in nanoseconds: `BigInt(bar) + BigInt(Math.round(start × timeframe × 1e9))` (`bar` is in nanoseconds, `timeframe` in seconds).",
"type": "number"
},
"up": {
"description": "Bullish direction: positive or zero delta for an acceleration, exhaustion of a selling phase, slowdown at the low, upward consolidation breakout for a line.",
"type": "boolean"
},
"variant": {
"description": "Exhaustion: `0` when detected on volumes, `1` on the number of buying and selling trades. Both variants can flag the same bar, at the same price.",
"type": "integer"
},
"visible": {
"description": "`false`: the signal is not valid, do not show it. Only a slowdown can switch to `false`, then back to `true`, while it is in progress; it can end with `false`, and then arrives that way in `confirmed` mode.",
"type": "boolean"
}
},
"required": [
"kind",
"bar",
"start",
"up",
"visible"
]
}