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

Chaikin A/D Oscillator

Install and import#

bash
npm install fintech-algorithms
ts
import { chaikinADOscillator } from "fintech-algorithms/technical-indicators/volume-indicators/chaikin-a-d-oscillator";

Signature#

chaikinADOscillator(input)

Builds the cumulative accumulation/distribution line from the money flow multiplier and volume, then returns the difference between a fast and a slow EMA of that line.

Parameters#

NameTypeNotes
inputTopicInputbars needs timestamp, open, high, low, close and volume. From parameters this topic uses fast_period (default 3) and slow_period (default 10, minimum fast_period + 1); period (default 14) is validated by the family but unused here.

Returns#

TopicResult

series holds ad, the running cumulative money flow volume, and value, the fast EMA of ad minus the slow EMA of ad. latest carries the last element of each. ad is populated from the first bar, so ready_at is 0 even though value has its own warm-up.

Warm-up#

The first `slow_period` - 1 bars for `value` (9 with the default 10); none for `ad` positions are null. ad is non-null on the first bar, so ready_at reports 0 while value is still null. Read value for readiness, not ready_at.

Errors#

  • When a bar carries a negative volume — throws Error
  • When slow_period is not an integer greater than fast_period — throws Error
  • When bars is empty, or its timestamps are not strictly increasing — throws Error

Complexity: time O(n), 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#

chaikinADOscillator(input)

Returns#

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

{
  "topic_id": "D07-F05-A07",
  "title": "Chaikin A/D Oscillator",
  "state": "calculated",
  "ready": true,
  "ready_at": 0,
  "series": {
    "ad": [
      -39473.6842105251,
      -6702.529515955808,
      66669.61995061857,
      148952.74316349486,
      206717.91744960428,
      202168.88289909757
    ],
    "value": [null, null, null, null, null, null]
  },
  "latest": {
    "ad": -4337333.133776561,
    "value": -148029.1919731265
  },
  "parameters": {},
  "diagnostics": {
    "causal": true,
    "input_count": 96
  }
}

Diagrams#

Chaikin A/D Oscillator — article hero
Chaikin A/D Oscillator — concept map
Chaikin A/D Oscillator — decision comparison
Chaikin A/D Oscillator — worked example

Calculation flow#

Chaikin A/D Oscillator calculation flow
flowchart LR
    A["basis-consistent OHLCV observations with venue/session cov"] --> B["Validate order, basis, and finite values"]
    B --> C["Apply the selected Chaikin A/D Oscillator 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"]
Chaikin A/D Oscillator 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#

  • TA-Lib function groups — see linked primary or authoritative record
  • TA-Lib C/C++ API — see linked primary or authoritative record
  • TA-Lib maintained source — see linked primary or authoritative record
  • Evidence decision
  • Level 1 evidence map

The rest of the Volume Indicators family#