Price–Indicator Pivot Alignment
Install and import#
npm install fintech-algorithmsimport { priceIndicatorPivotAlignment } from "fintech-algorithms/geometric-chart-patterns/indicator-divergence-detection/price-indicator-pivot-alignment";Signature#
priceIndicatorPivotAlignment(payload)Aligns confirmed price and indicator pivots of the same kind within an explicit lag bound while preserving both event and knowledge indexes.
Parameters#
| Name | Type | Notes |
|---|---|---|
payload | { topic_id: string; data_class: string; as_of: string; bars: { timestamp: string; open: number; high: number; low: number; close: number; finalized: boolean }[]; price_pivots: { kind: string; event_index: number; confirmation_index: number; price: number; prominence: number }[]; indicators: { name: string; family: string; polarity: number; scale: number; pivots: { kind: string; event_index: number; confirmation_index: number; value: number; prominence: number }[] }[]; parameters: { max_lag: number; min_separation: number; max_separation: number; min_price_fraction: number; min_indicator_delta: number; confirmation_horizon: number; invalidation_buffer: number; minimum_indicators: number }; weights: { RSI: number; MACD-Histogram: number; Stochastic-K: number }; as_of_index: number; universe: { symbol: string; state: string; divergence_type: string; confluence_score: number; freshness: number; liquidity: number; data_quality: number; available_index: number; eligible: boolean }[] } | Topic payload containing price pivots, indicator definitions, and parameters.max_lag. |
Returns#
{ topic_id, state, alignments, alignment_count?, reason }
One alignment record. state is warmup when no indicator pivots or fewer than two alignments are available and ready otherwise; it does not describe leading null positions in a returned series.
Warm-up#
The first 2 eligible aligned pivots positions are state: warmup. The function returns one alignment record when fewer than two causal alignments are available; it does not emit a positional null prefix.
Errors#
- When pivot identity, chronology, value, scale, polarity, or max-lag input is invalid — throws
Complexity: time ,
space .
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#
{
"topic_id": "D08-F05-A01",
"data_class": "synthetic-teaching",
"as_of": "2026-01-08T13:30:00Z",
"bars": [
{
"timestamp": "2026-01-05T14:30:00Z",
"open": 105.75,
"high": 107,
"low": 105,
"close": 106,
"finalized": true
},
{
"timestamp": "2026-01-05T15:30:00Z",
"open": 106.112,
"high": 107.362,
"low": 105.362,
"close": 106.362,
"finalized": true
},
{
"timestamp": "2026-01-05T16:30:00Z",
"open": 106.4614,
"high": 107.7114,
"low": 105.7114,
"close": 106.7114,
"finalized": true
}
],
"price_pivots": [
{
"kind": "low",
"event_index": 18,
"confirmation_index": 21,
"price": 98,
"prominence": 0.72
},
{
"kind": "low",
"event_index": 42,
"confirmation_index": 45,
"price": 94,
"prominence": 0.84
}
],
"indicators": [
{
"name": "RSI",
"family": "bounded-momentum",
"polarity": 1,
"scale": 100,
"pivots": [
{
"kind": "low",
"event_index": 19,
"confirmation_index": 22,
"value": 28,
"prominence": 0.76
},
{
"kind": "low",
"event_index": 41,
"confirmation_index": 44,
"value": 36,
"prominence": 0.86
}
]
},
{
"name": "MACD-Histogram",
"family": "moving-average-momentum",
"polarity": 1,
"scale": 5,
"pivots": [
{
"kind": "low",
"event_index": 18,
"confirmation_index": 21,
"value": -2.2,
"prominence": 0.7
},
{
"kind": "low",
"event_index": 42,
"confirmation_index": 45,
"value": -1,
"prominence": 0.81
}
]
},
{
"name": "Stochastic-K",
"family": "range-momentum",
"polarity": 1,
"scale": 100,
"pivots": [
{
"kind": "low",
"event_index": 17,
"confirmation_index": 20,
"value": 18,
"prominence": 0.68
},
{
"kind": "low",
"event_index": 43,
"confirmation_index": 46,
"value": 29,
"prominence": 0.78
}
]
}
],
"parameters": {
"max_lag": 3,
"min_separation": 5,
"max_separation": 40,
"min_price_fraction": 0.005,
"min_indicator_delta": 0.05,
"confirmation_horizon": 12,
"invalidation_buffer": 0.005,
"minimum_indicators": 2
},
"weights": {
"RSI": 0.4,
"MACD-Histogram": 0.35,
"Stochastic-K": 0.25
},
"as_of_index": 71,
"universe": [
{
"symbol": "SYNTH-A",
"state": "confirmed",
"divergence_type": "regular-bullish",
"confluence_score": 86,
"freshness": 92,
"liquidity": 80,
"data_quality": 98,
"available_index": 47,
"eligible": true
},
{
"symbol": "SYNTH-B",
"state": "candidate",
"divergence_type": "regular-bearish",
"confluence_score": 91,
"freshness": 98,
"liquidity": 72,
"data_quality": 94,
"available_index": 54,
"eligible": true
},
{
"symbol": "SYNTH-C",
"state": "confirmed",
"divergence_type": "hidden-bullish",
"confluence_score": 74,
"freshness": 70,
"liquidity": 96,
"data_quality": 90,
"available_index": 39,
"eligible": true
}
]
}Call#
priceIndicatorPivotAlignment(payload)Returns#
object with 5 fields: topic_id, state, alignments, alignment_count, reason
{
"topic_id": "D08-F05-A01",
"state": "ready",
"alignments": [
{
"kind": "low",
"price_event_index": 18,
"price_confirmation_index": 21,
"price": 98,
"price_prominence": 0.72,
"indicator_event_index": 19,
"indicator_confirmation_index": 22,
"indicator_value": 0.28,
"indicator_raw_value": 28,
"indicator_prominence": 0.76,
"lag": 1,
"knowledge_index": 22,
"indicator": "RSI",
"indicator_family": "bounded-momentum"
},
{
"kind": "low",
"price_event_index": 42,
"price_confirmation_index": 45,
"price": 94,
"price_prominence": 0.84,
"indicator_event_index": 41,
"indicator_confirmation_index": 44,
"indicator_value": 0.36,
"indicator_raw_value": 36,
"indicator_prominence": 0.86,
"lag": 1,
"knowledge_index": 45,
"indicator": "RSI",
"indicator_family": "bounded-momentum"
}
],
"alignment_count": 2,
"reason": "aligned"
}Other exports#
This module also exports
adaptIndicator, alignPivots, detectDivergences, scoreDivergence, advanceState, combineConfluence, rankUniverse, runTopic, regularBullishBearishDivergenceDetection, hiddenBullishBearishDivergenceDetection, multiIndicatorDivergenceAdapters, divergenceStrengthAndQualityScoring, divergenceConfirmationAndInvalidationStateMachine, multiIndicatorDivergenceConfluence, marketWideDivergenceScannerAndRanking. Every module additionally exports run as an alias of its
primary function, and a meta object carrying its catalog id, domain, family,
shape and article URL.
Diagrams#
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#
- TradingView — RSI divergence indicator — TradingView
- TradingView — MACD indicator — TradingView
- TradingView Pine Script — Repainting — TradingView Pine Script
- TradingView Pine Script — Visuals FAQ — TradingView Pine Script
- Fidelity — Relative Strength Index — Fidelity
- Fidelity — MACD — Fidelity
- TA-Lib — Function index — TA-Lib
- TA-Lib — RSI — TA-Lib
- SciPy — find_peaks — SciPy
- Bailey et al. — Effects of Backtest Overfitting — Bailey et al.
- Historical-example decision
- Topic-specific applicability map