# 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](https://fathomcharts.com/docs/websocket.md), on [historical data](https://fathomcharts.com/docs/history.md) and in exports. Parameters you omit take their default values.

**Subscribe message**

```json
{
  "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](https://fathomcharts.com/docs/limits.md#how-limits-are-counted). 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](https://fathomcharts.com/docs/history.md) returns the same objects, with the same `cursor`, without the `sub` field.

**Final object**

```json
{
  "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**

```json
{
  "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**

```json
{
  "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**

```json
{
  "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**

```json
{
  "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**

```json
{
  "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](https://fathomcharts.com/docs/sdk.md#indicator-types).

**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"
  ]
}
```
