Skip to content

KB / alert

Potential Buying Opportunity

Last verified

Auto-generated. This article is rebuilt from app/signals/config/alert_thresholds.json by scripts/build_alerts_kb.py. Edit the alert config and re-run the script — do not edit this file directly.

Potential Buying Opportunity

Alert ID: BUYING_OPP
Category: composite
Cross-detection: no

Severity

INFO — positive signal or notable event; no action needed

Trigger condition

{
  "type": "and",
  "conditions": [
    {
      "field": "dix",
      "op": "gte",
      "value": 0.47,
      "_registry_band_intentional": true,
      "_intentional_reason": "Threshold tightened from band 0.45 (Inflows) toward 0.48 (Strong Inflows) for composite trigger-rate balance \u2014 the AND-gate with VIX > 25 + breadth < 35 already constrains firing rate, so 0.47 (vs strict 0.48) preserves a useful trigger frequency without fully relaxing the strong-DIX requirement."
    },
    {
      "field": "vix_close",
      "op": "gt",
      "value": 25,
      "_registry_band_intentional": true,
      "_intentional_reason": "B7 (2026-05) tightened the registry Elevated band from 25 \u2192 22; this composite alert deliberately keeps the legacy 25 cutoff. The buy-the-dip signal needs a clearly-elevated VIX (>25) as the third leg of the AND-gate (DIX strong + breadth weak + VIX elevated) \u2014 22 catches too much normal mid-cycle wobble to be a useful 'opportunity' confirmation. The band-edge tightening already pulled the alignment.volatility implication earlier; this alert sits one rung above that to gate the contrarian buy signal."
    },
    {
      "field": "pct_above_50sma",
      "op": "lt",
      "value": 35,
      "_registry_band_intentional": true,
      "_intentional_reason": "Mid-band 'starting to recover' trigger between Weak (30) and Mixed (40); composite buy-the-dip signal AND-gated with high DIX + high VIX."
    }
  ]
}

All of the following must hold:

Message template

Potential buying opportunity: strong institutional demand (DIX {dix:.3f}) with elevated fear (VIX {vix_close:.1f}) and washed-out breadth ({pct_above_50sma:.0f}%).

Rendered with the current signals dict via Python str.format. Placeholders that fail to resolve fall back to the raw template (see _format_message in app/signals/alerts.py).

Cooldown / dedup

Notifies

See also