Absolute Price Oscillator
Install and import#
npm install fintech-algorithmsimport { 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#
| Name | Type | Notes |
|---|---|---|
input | TopicInput | bars 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_periodis not an integer greater thanfast_period— throws Error - When a bar's
highis below itsopen,close, orlow— 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#
{
"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#
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.
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