Market-Wide Divergence Scanner and Ranking
Install and import#
npm install fintech-algorithmsimport { marketWideDivergenceScannerAndRanking } from "fintech-algorithms/geometric-chart-patterns/indicator-divergence-detection/market-wide-divergence-scanner-and-ranking";Signature#
marketWideDivergenceScannerAndRanking(payload)Filters point-in-time eligible universe records and ranks them from explicit confluence, state, freshness, liquidity, and data-quality components.
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 universe records and an as_of_index or bars from which that index can be derived. |
Returns#
{ topic_id, state, ranking, eligible_count }
One scanner record with state equal to ranked or empty; each eligible row has a stable rank and component trace.
Errors#
- When as-of index, universe score, availability, or scanner-state 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-A08",
"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#
marketWideDivergenceScannerAndRanking(payload)Returns#
object with 4 fields: topic_id, state, ranking, eligible_count
{
"topic_id": "D08-F05-A08",
"state": "ranked",
"ranking": [
{
"symbol": "SYNTH-A",
"state": "confirmed",
"divergence_type": "regular-bullish",
"rank_score": 89.3,
"components": {
"confluence_score": 86,
"freshness": 92,
"liquidity": 80,
"data_quality": 98
},
"as_of_index": 71,
"interpretation": "deterministic triage priority; not an order or return forecast",
"rank": 1
},
{
"symbol": "SYNTH-B",
"state": "candidate",
"divergence_type": "regular-bearish",
"rank_score": 86.95,
"components": {
"confluence_score": 91,
"freshness": 98,
"liquidity": 72,
"data_quality": 94
},
"as_of_index": 71,
"interpretation": "deterministic triage priority; not an order or return forecast",
"rank": 2
},
{
"symbol": "SYNTH-C",
"state": "confirmed",
"divergence_type": "hidden-bullish",
"rank_score": 81.3,
"components": {
"confluence_score": 74,
"freshness": 70,
"liquidity": 96,
"data_quality": 90
},
"as_of_index": 71,
"interpretation": "deterministic triage priority; not an order or return forecast",
"rank": 3
}
],
"eligible_count": 4
}Other exports#
This module also exports
adaptIndicator, alignPivots, detectDivergences, scoreDivergence, advanceState, combineConfluence, rankUniverse, runTopic, priceIndicatorPivotAlignment, regularBullishBearishDivergenceDetection, hiddenBullishBearishDivergenceDetection, multiIndicatorDivergenceAdapters, divergenceStrengthAndQualityScoring, divergenceConfirmationAndInvalidationStateMachine, multiIndicatorDivergenceConfluence. 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