# Squeeze Momentum

`D07-F07-A12` · Technical Indicators → Bands, Envelopes, and Squeezes · archetype `series-transform` · difficulty 2/5 · verification **verified**

Full page: https://docs.thefintechbuilder.com/technical-indicators/bands-envelopes-and-squeezes/squeeze-momentum/
Agent skill: `npx skills add IslamBaraka90/Fintech-Algorithms-Library` — https://docs.thefintechbuilder.com/guides/agent-skill/

## Install and import

```bash
npm install fintech-algorithms
```

```ts
import { squeezeMomentum } from "fintech-algorithms/technical-indicators/bands-envelopes-and-squeezes/squeeze-momentum";
```

## Signature

```ts
squeezeMomentum(input)
```

Squeeze Momentum: the TTM squeeze flag and its two band pairs, plus a momentum line -- the regression slope of the close's distance from the midpoint of the `period`-bar high-low range.

## Parameters

| Name | Type | Required | Notes |
| --- | --- | --- | --- |
| `input` | `TopicInput` | yes | `bars` is the required OHLCV array -- each bar carries `timestamp`, `open`, `high`, `low`, `close`, `volume` and an optional `basis`, strictly ordered by timestamp. From `parameters` this topic reads `period` (default 20, integer >= 2), used for the moving average, the standard deviation, the Keltner EMA, the ATR, the range extremes and the momentum regression, and `multiplier` (default 2, a finite number >= 0), applied to both band pairs. |

## Returns

`TopicResult`

`series` holds `squeeze_on`, `bb_upper`, `bb_lower`, `kc_upper`, `kc_lower` and `momentum`; `latest` carries the last of each. `squeeze_on` is a boolean and `false` is a real reading meaning no squeeze. The warm-ups differ: the flag and the four bands appear at `period - 1` (19 at the default), which sets `ready_at`, while `momentum` needs a full window of those readings and first appears at `2 * period - 2` (38).

## Warm-up

The first ``period - 1` bars for the bands and the flag, `2 * period - 2` bars for `momentum` (19 and 38 at the default period)` positions are `null`. `momentum` regresses the close-minus-midpoint displacement over `period` bars, and that displacement is itself null until the range extremes fill, so it lags the rest of the payload by another `period - 1` bars. The topic reports ready before `momentum` exists.

## Errors

- When `parameters.period` is not an integer >= 2 — throws Error
- When `parameters.multiplier` is not a finite number, or is negative — throws Error
- When a bar is missing open, high, low, close, or volume, or one of them is not a finite number — throws Error

## Complexity

Time `O(n * period)`, space `O(n)`.

## Worked example

Captured by running this function on the input its own test provides. Real output of real code — but not asserted against a published figure.

### Input

`input`:

```json
{
  "bars": [
    {
      "timestamp": "2024-01-02",
      "basis": "synthetic-unadjusted",
      "open": 100,
      "high": 101.45,
      "low": 98.695,
      "close": 100,
      "volume": 750000,
      "benchmark": 200
    },
    {
      "timestamp": "2024-01-03",
      "basis": "synthetic-unadjusted",
      "open": 101.49111452,
      "high": 103.38381693,
      "low": 100.05480022,
      "close": 101.78791214,
      "volume": 795117,
      "benchmark": 200.56326135
    },
    {
      "timestamp": "2024-01-04",
      "basis": "synthetic-unadjusted",
      "open": 102.45519048,
      "high": 104.6701838,
      "low": 100.91147007,
      "close": 102.9549389,
      "volume": 840234,
      "benchmark": 201.11020913
    }
  ],
  "parameters": {}
}
```

### Call

```ts
squeezeMomentum(input)
```

### Returns

object with 9 fields: topic_id, title, state, ready, ready_at, series, latest, parameters, …

```json
{
  "topic_id": "D07-F07-A12",
  "title": "Squeeze Momentum",
  "state": "calculated",
  "ready": true,
  "ready_at": 19,
  "series": {
    "squeeze_on": [null, null, null, null, null, null],
    "bb_upper": [null, null, null, null, null, null],
    "bb_lower": [null, null, null, null, null, null],
    "kc_upper": [null, null, null, null, null, null],
    "kc_lower": [null, null, null, null, null, null],
    "momentum": [null, null, null, null, null, null]
  },
  "latest": {
    "squeeze_on": true,
    "bb_upper": 108.52982269312228,
    "bb_lower": 99.87127834687767,
    "kc_upper": 110.40185024876313,
    "kc_lower": 97.50750454809507,
    "momentum": 0.0214809381766915
  },
  "parameters": {},
  "diagnostics": {
    "causal": true,
    "input_count": 96
  }
}
```

## Verification and provenance

Tier: **verified** (via E).

The worked example below is the figure published in this algorithm's article, replayed and asserted by the test suite on every build. The arithmetic cannot drift without the build failing.

Both tiers guarantee the signature. Full explanation: https://docs.thefintechbuilder.com/guides/verification/

Generated from the docs.json payload shipped inside fintech-algorithms@0.13.0.
The signature and parameter list are checked against the compiled implementation at build time,
so a description that contradicts the code fails the build rather than reaching this file.

## Links

- Article (how it works, step by step): https://thefintechbuilder.com/technical-indicators/bands-envelopes-and-squeezes/squeeze-momentum/
- Implementation source: https://github.com/IslamBaraka90/Fintech-Algorithms-Library/blob/main/src/technical-indicators/bands-envelopes-and-squeezes/squeeze-momentum/impl.ts
- Package on npm: https://www.npmjs.com/package/fintech-algorithms
- Domain index for agents: https://docs.thefintechbuilder.com/technical-indicators/llms.txt
