# Trend Intensity Index

`D07-F02-A12` · Technical Indicators → Trend Systems · archetype `series-transform` · difficulty 2/5 · verification **verified**

Full page: https://docs.thefintechbuilder.com/technical-indicators/trend-systems/trend-intensity-index/
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 { trendIntensityIndex } from "fintech-algorithms/technical-indicators/trend-systems/trend-intensity-index";
```

## Signature

```ts
trendIntensityIndex(input)
```

Splits each close into the part above and the part below a simple moving average, sums each part over a second window, and reports the upside sum as a percentage of the two sums combined.

## Parameters

| Name | Type | Required | Notes |
| --- | --- | --- | --- |
| `input` | `TopicInput` | yes | `bars` is the OHLCV series, validated for finite prices, strictly increasing `timestamp`, a single adjustment `basis`, non-negative `volume`, and a high and low that bracket the other prices. From `parameters` this topic reads `period` (integer, minimum 2, default 14), the moving-average length, and `intensity_period` (integer, minimum 2, defaulting to whatever `period` resolved to), the length of the deviation sums. |

## Returns

`TopicResult`

`series` and `latest` carry a single `value` key, a percentage between 0 and 100. A bar is null when both deviation sums are zero, which happens only when every close in the window sits exactly on its moving average. The two windows stack, which is what makes the warm-up longer than callers expect.

## Warm-up

The first `period + intensity_period - 2 bars (26 by default)` positions are `null`. The moving average needs `period` bars, and the deviation sum then needs `intensity_period` non-null deviations on top of it. With both at the default 14 the first value lands at index 26, so `ready_at` is 26.

## Errors

- When `parameters.period` or `parameters.intensity_period` is present but is not an integer of at least 2 — throws Error
- When `bars` is empty, or a bar has a non-finite price, a negative volume, a timestamp not greater than the previous one, or a high below its open, low, or close — 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
trendIntensityIndex(input)
```

### Returns

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

```json
{
  "topic_id": "D07-F02-A12",
  "title": "Trend Intensity Index",
  "state": "calculated",
  "ready": true,
  "ready_at": 26,
  "series": {
    "value": [null, null, null, null, null, null]
  },
  "latest": {
    "value": 57.21213322600646
  },
  "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/trend-systems/trend-intensity-index/
- Implementation source: https://github.com/IslamBaraka90/Fintech-Algorithms-Library/blob/main/src/technical-indicators/trend-systems/trend-intensity-index/impl.ts
- Package on npm: https://www.npmjs.com/package/fintech-algorithms
- Domain index for agents: https://docs.thefintechbuilder.com/technical-indicators/llms.txt
