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

Absolute Price Oscillator

Install and import#

bash
npm install fintech-algorithms
ts
import { absolutePriceOscillator } from "fintech-algorithms/technical-indicators/momentum/absolute-price-oscillator";

Signature#

absolutePriceOscillator(input)

Subtracts a slow EMA of close from a fast EMA of close, leaving the momentum spread in price units rather than as a percentage.

Parameters#

NameTypeNotes
inputTopicInputbars is a chronological array of OHLCV rows, each with a non-empty timestamp plus finite open, high, low, close and volume. From parameters this topic reads fast_period (integer >= 2, default 5) and slow_period (integer >= fast_period + 1, default 34). period (default 14) is validated by the shared momentum preamble but is not used here.

Returns#

TopicResult

series and latest carry one key, value, holding the fast EMA minus the slow EMA at each bar. Both EMAs seed from the simple average of their first full window, so the series opens with a null warm-up prefix.

Warm-up#

The first slow_period - 1 bars (33 with the default 34) positions are null. value stays null until the slow EMA is seeded, which happens at index slow_period - 1; ready_at is 33 on the canonical fixture.

Errors#

  • When slow_period is not an integer greater than fast_period — throws Error
  • When a bar's high is below its open, close, or low — 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#

absolutePriceOscillator(input)

Returns#

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

{
  "topic_id": "D07-F03-A09",
  "title": "Absolute Price Oscillator",
  "state": "calculated",
  "ready": true,
  "ready_at": 33,
  "series": {
    "value": [null, null, null, null, null, null]
  },
  "latest": {
    "value": -2.0125312416213603
  },
  "parameters": {},
  "diagnostics": {
    "causal": true,
    "input_count": 96
  }
}

Diagrams#

Absolute Price Oscillator — article hero
Absolute Price Oscillator — concept map
Absolute Price Oscillator — decision comparison
Absolute Price Oscillator — worked example

Calculation flow#

Absolute Price Oscillator calculation flow
flowchart LR
    A["an ordered price or OHLC series, declared lookbacks, smoot"] --> B["Validate order, basis, and finite values"]
    B --> C["Apply the selected Absolute Price 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"]
Absolute Price 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 Momentum family#