Indicator

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 label field combines A (absorption, a breakout against the consolidation’s delta) or P (a breakout with it), then C or E. Example: AC is 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: weak to see more of them, strong to 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 with medium, 6.5 with strong), 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 with medium, 10 with strong), 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 with weak), an exhaustion is flagged opposite to the phase (up: true after a selling phase). variant 0: computed on volumes; variant 1: 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 with medium, 1.05 with strong) 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 weak to strong), two lines are drawn. Control (control): the POC of the consolidation’s bars, or, with levelMode: "aggressive", the edge of their bodies on the breakout side. Extreme (extreme): with levelMode: "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, projectionBars bars at most.
  • label: A (absorption) when the breakout goes against the consolidation’s delta, P when it goes with it, then C (control) or E (extreme). side gives the sign of that delta, up the 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 its end).
  • While it is the latest one, a slowdown can move to another anchor bar (bar, start) and price, and switch from visible: true to false or 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 with visible: false: do not show it. In confirmed mode it then arrives directly with visible: false.
  • <kind> is the drawing type and <weekSunday> the YYYY-MM-DD date 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 their end), 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.

Subscribe message
{
  "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.

ParameterTypeDefaultAllowed valuesUnitDescription
absorptionchoicemediumweak · medium · strong—Sensitivity of the control and extreme lines: weak (more lines), medium or strong (only after the heaviest consolidations).
accelerationchoicemediumweak · medium · strong—Acceleration sensitivity: weak (more signals), medium or strong (fewer, more pronounced signals).
exhaustionchoicemediumweak · medium · strong—Exhaustion sensitivity: weak (more signals, on short pushes), medium or strong (fewer signals, on longer pushes).
levelModechoiceconservativeconservative · medium · aggressive—Placement of the control and extreme lines, from farthest from the breakout (conservative) to closest (aggressive).
projectionBarsinteger101 to 1,000barsMaximum length of the control and extreme lines, in bars; a line stops earlier when a bar body crosses it.
slowdownchoicemediumweak · medium · strong—Slowdown sensitivity: weak (more signals), medium or strong (fewer, more pronounced signals).
timeframeinteger601 · 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.

FieldTypeUnitPresentDescription
kindstring · acceleration | exhaustion | slowdown | control | extreme—alwaysType: acceleration (rectangle), exhaustion and slowdown (triangles), control and extreme (lines). It is also the first segment of the id.
activeboolean—sometimesRectangle or line still extended to the right.
barstringtimestamp (ns)alwaysStart of the anchor bar.
endnumberbarssometimesEnd of the drawing, in bars from the anchor bar, rounded to a tenth (can be fractional); present on final rectangles and lines.
highintegertickssometimesTop of a rectangle.
labelstring · AC | PC | AE | PE—sometimesLine: 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.
lowintegertickssometimesBottom of a rectangle.
priceintegertickssometimesPrice 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.
sidestring · buy | sell—sometimesLine: sign of the consolidation’s delta (buy positive or zero, sell negative).
startnumberbarsalwaysStart 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).
upboolean—alwaysBullish direction: positive or zero delta for an acceleration, exhaustion of a selling phase, slowdown at the low, upward consolidation breakout for a line.
variantinteger—sometimesExhaustion: 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.
visibleboolean—alwaysfalse: 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.

Final object
{
  "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
  }
}
Object in progress
{
  "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
  }
}
Object in progress
{
  "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"
  }
}
Object in progress
{
  "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"
  }
}
Final object
{
  "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
  }
}
Final object
{
  "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
JSON
{
  "$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
JSON
{
  "$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"
  ]
}