Hidden Bullish/Bearish Divergence Detection
Install and import#
npm install fintech-algorithmsimport { hiddenBullishBearishDivergenceDetection } from "fintech-algorithms/geometric-chart-patterns/indicator-divergence-detection/hidden-bullish-bearish-divergence-detection";Signature#
hiddenBullishBearishDivergenceDetection(payload)Detects hidden bullish and bearish divergence from causally aligned consecutive pivot pairs.
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, indicators, and separation, alignment, price, and indicator thresholds. |
Returns#
{ topic_id, state, events, event_count }
One detection record with state equal to detected or not-detected and hidden-divergence event diagnostics.
Errors#
- When pivot, indicator, lag, separation, or divergence-threshold 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-A03",
"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": 102,
"prominence": 0.84
}
],
"indicators": [
{
"name": "RSI",
"family": "bounded-momentum",
"polarity": 1,
"scale": 100,
"pivots": [
{
"kind": "low",
"event_index": 19,
"confirmation_index": 22,
"value": 36,
"prominence": 0.76
},
{
"kind": "low",
"event_index": 41,
"confirmation_index": 44,
"value": 28,
"prominence": 0.86
}
]
},
{
"name": "MACD-Histogram",
"family": "moving-average-momentum",
"polarity": 1,
"scale": 5,
"pivots": [
{
"kind": "low",
"event_index": 18,
"confirmation_index": 21,
"value": -1,
"prominence": 0.7
},
{
"kind": "low",
"event_index": 42,
"confirmation_index": 45,
"value": -2.2,
"prominence": 0.81
}
]
},
{
"name": "Stochastic-K",
"family": "range-momentum",
"polarity": 1,
"scale": 100,
"pivots": [
{
"kind": "low",
"event_index": 17,
"confirmation_index": 20,
"value": 31,
"prominence": 0.68
},
{
"kind": "low",
"event_index": 43,
"confirmation_index": 46,
"value": 19,
"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#
hiddenBullishBearishDivergenceDetection(payload)Returns#
object with 4 fields: topic_id, state, events, event_count
{
"topic_id": "D08-F05-A03",
"state": "detected",
"events": [
{
"type": "hidden-bullish",
"direction": "bullish",
"kind": "low",
"indicator": "MACD-Histogram",
"indicator_family": "moving-average-momentum",
"price_pair": [18, 42],
"indicator_pair": [18, 42],
"price_values": [98, 102],
"indicator_values": [-0.2, -0.44000000000000006],
"price_delta_fraction": 0.04081632653061224,
"indicator_delta": -0.24000000000000005,
"separation": 24,
"max_alignment_lag": 0,
"prominence": 0.7675
},
{
"type": "hidden-bullish",
"direction": "bullish",
"kind": "low",
"indicator": "RSI",
"indicator_family": "bounded-momentum",
"price_pair": [18, 42],
"indicator_pair": [19, 41],
"price_values": [98, 102],
"indicator_values": [0.36, 0.28],
"price_delta_fraction": 0.04081632653061224,
"indicator_delta": -0.07999999999999996,
"separation": 24,
"max_alignment_lag": 1,
"prominence": 0.795
},
{
"type": "hidden-bullish",
"direction": "bullish",
"kind": "low",
"indicator": "Stochastic-K",
"indicator_family": "range-momentum",
"price_pair": [18, 42],
"indicator_pair": [17, 43],
"price_values": [98, 102],
"indicator_values": [0.31, 0.19],
"price_delta_fraction": 0.04081632653061224,
"indicator_delta": -0.12,
"separation": 24,
"max_alignment_lag": 1,
"prominence": 0.7550000000000001
}
],
"event_count": 3
}Other exports#
This module also exports
adaptIndicator, alignPivots, detectDivergences, scoreDivergence, advanceState, combineConfluence, rankUniverse, runTopic, priceIndicatorPivotAlignment, regularBullishBearishDivergenceDetection, 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#
Calculation flow#
Hidden Bullish/Bearish Divergence Detection calculation flow
flowchart LR
A["Aligned same-kind pivot pair"] --> P{"Price preserves structure?"}
P -->|Higher low| I{"Indicator makes lower low?"}
I -->|Yes, thresholds pass| B["Hidden bullish"]
P -->|Lower high| J{"Indicator makes higher high?"}
J -->|Yes, thresholds pass| S["Hidden bearish"]
I -->|No| N["No hidden event"]
J -->|No| N
B --> C["Continuation-context geometry only"]
S --> C
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