fintech-algorithms
Using a coding agent? Give it the skill: npx skills add IslamBaraka90/Fintech-Algorithms-Library What it does →

Trend/Range Regime Classifier

Install and import#

bash
npm install fintech-algorithms
ts
import { trendRangeRegimeClassifier } from "fintech-algorithms/geometric-chart-patterns/market-structure-breakouts-and-regimes/trend-range-regime-classifier";

Signature#

trendRangeRegimeClassifier(input)

Labels each bar trend, range or uncertain by requiring two independent readings to agree: efficiency ratio at or above 0.55 with Choppiness at or below 45 gives trend, efficiency at or below 0.25 with Choppiness at or above 55 gives range, and anything else is uncertain.

Parameters#

NameTypeNotes
inputTopicInputbars is the required OHLCV history, strictly ordered by timestamp and on a single adjustment basis. parameters.period (default 20, integer of at least 2) sets both inputs - it is forwarded verbatim to the Choppiness Index implementation, which reads no other key. The four thresholds are fixed in the implementation.

Returns#

TopicResult

series and latest carry efficiency, choppiness and the string series regime. The warm-up is uneven: choppiness starts at period - 1 and efficiency at period, so ready_at is 19 with the default while the regime label itself stays null until index 20.

Warm-up#

The first period - 1 bars for choppiness, period bars for efficiency and regime positions are null. ready_at reports the earliest non-null across all series, which is choppiness at index period - 1. A caller reading regime should wait one bar longer, since the label is null whenever either input is.

Errors#

  • When period is supplied as a non-integer or as a value below 2 — throws Error
  • When a bar's high, low, or close is not a finite number — throws Error

Complexity: time O(n × period), space O(n).

Worked example#

executed 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
{
  "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#

trendRangeRegimeClassifier(input)

Returns#

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

{
  "topic_id": "D08-F07-A12",
  "title": "Trend/Range Regime Classifier",
  "state": "calculated",
  "ready": true,
  "ready_at": 19,
  "series": {
    "efficiency": [null, null, null, null, null, null],
    "choppiness": [null, null, null, null, null, null],
    "regime": [null, null, null, null, null, null]
  },
  "latest": {
    "efficiency": 0.08092573520497529,
    "choppiness": 58.89834097590164,
    "regime": "range"
  },
  "parameters": {},
  "diagnostics": {
    "causal": true,
    "input_count": 96
  }
}

Diagrams#

Trend/Range Regime Classifier — article hero
Trend/Range Regime Classifier — concept map
Trend/Range Regime Classifier — decision comparison
Trend/Range Regime Classifier — worked example

Calculation flow#

Trend/Range Regime Classifier calculation flow
flowchart LR
    A["ordered OHLC observations, explicit lookbacks and threshol"] --> B["Validate order, basis, and finite values"]
    B --> C["Apply the selected Trend/Range Regime Classifier convention"]
    C --> D["Emit value, readiness, and diagnostics"]
    D --> E["Interpret descriptively; test outcomes separately"]
    B -->|invalid or insufficient| X["Withhold output with a reason"]
Trend/Range Regime Classifier readiness and evidence states
stateDiagram-v2
    [*] --> Waiting
    Waiting --> Ready: enough valid causal observations
    Waiting --> Rejected: malformed or unsupported input
    Ready --> Calculated: selected formula applied
    Calculated --> Interpreted: diagnostic and limitation retained
    Interpreted --> Ready: next observation arrives
    Rejected --> Waiting: corrected input and deterministic reset

How it works#

This page states the contract — how to call it correctly. The article explains the concept: why it works, and where it breaks.

Read the article →

References#

  • CFA Institute technical-analysis overview — see linked primary or authoritative record
  • TA-Lib maintained source — see linked primary or authoritative record
  • Long-Term Storage Capacity of Reservoirs — see linked primary or authoritative record
  • Evidence decision
  • Level 1 evidence map

The rest of the Market Structure, Breakouts, and Regimes family#