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

Hidden Bullish/Bearish Divergence Detection

Install and import#

bash
npm install fintech-algorithms
ts
import { 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#

NameTypeNotes
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#

payload
{
  "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#

Hidden Bullish/Bearish Divergence Detection — map

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.

Read the article →

References#

The rest of the Indicator Divergence Detection family#