---
title: "Get Gamma Vwap Confluence Signal"
method: GET
path: "/api/signals/advanced/gamma-vwap-confluence"
tags: ["Trade Signals"]
---

# Get Gamma Vwap Confluence Signal

`GET /api/signals/advanced/gamma-vwap-confluence`

## Request

- Base URL: `https://api.zerogex.io` (the document declares no server; this is the origin it was published from)
- URL: `https://api.zerogex.io/api/signals/advanced/gamma-vwap-confluence`
- Auth: HTTP bearer

Gamma+VWAP confluence detector — multi-level price cluster magnet.

Detects when multiple reference levels (gamma flip, VWAP, max pain, max gamma,
call wall) cluster near the same price, creating a high-conviction magnet or
bounce level.

**Logic highlights** (`src/signals/advanced/gamma_vwap_confluence.py`):
- The gamma flip and VWAP are **always** members — neither is admission-tested,
  so `cluster_members` never holds fewer than two entries and `Members: 2` is
  the floor rather than a reading. `max_pain` / `max_gamma` / `call_wall` each
  join only when they sit within 0.15% of the flip/VWAP **midpoint**:
  `abs(level − mid) / close <= 0.0015`, where `mid = (flip + vwap) / 2`.
- `confluence_level` = arithmetic mean of whichever members qualified.
- `cluster_gap_pct = abs(flip − vwap) / close` — the two core members only. An
  optional level sitting far from the cluster does **not** widen the gap.
- `cluster_quality = clamp(1 − cluster_gap_pct / CONFLUENCE_MAX_GAP_PCT, 0.05, 1.00)`,
  the divisor defaulting to **1.0%** (`SIGNAL_CONFLUENCE_MAX_GAP_PCT`). The floor is
  **0.05, not 0** — a wide-gap card still prints a small non-zero score, so a ±5
  reports *no cluster* rather than weak direction.
- `multi_mult = 1.0 + 0.15 × (len(cluster_members) − 2)` — 1.30× at four members.
- `distance = (close − confluence_level) / close`, divided by `0.003` and clamped
  to ±1, so **|distance| ≥ 0.30% saturates** the reading.
- `net_gex < 0` → continuation, regime factor `+1` (bullish above the cluster,
  bearish below); `net_gex >= 0` → mean reversion, regime factor `−0.7` — the sign
  **inverts** and the magnitude is damped.
- Composition is a plain product, clipped once at the end:
  `clamped_score = clip(quality × multi_mult × scaled_distance × regime, −1, 1)`,
  and `score = clamped_score × 100`.
- **Triggered when `|score| ≥ 20` (clamped 0.20).**

**Params:** `symbol` (default `SPY`). Returns 404 when no data exists.

**Returns:**
```json
{
  "score": 22.0, "clamped_score": 0.22, "direction": "bullish",
  "triggered": true,
  "signal": "bullish_confluence",
  "confluence_level": 678.25,
  "cluster_gap_pct": 0.0009,
  "gamma_flip": 677.82, "vwap": 678.10,
  "max_pain": 678.0, "max_gamma": 678.5, "call_wall": 681.0,
  "expected_target": 680.5,
  "context_values": {"...gamma_flip, vwap, max_pain, max_gamma, call_wall, cluster_gap_pct, cluster_members, cluster_quality, distance_from_level_pct, regime_direction, net_gex..."},
  "score_history": [{"score": 22.0, "timestamp": "..."}, "...up to 90"]
}
```

- `score` — [-100, +100].
- `signal` — `"bullish_confluence"` | `"bearish_confluence"` | `"neutral"`.
- `triggered` — `true` when `|score| ≥ 20`.
- `confluence_level` — mean of the qualifying `cluster_members`; a midpoint only
  in the two-member case. `null` in the same `missing_levels` case as
  `cluster_gap_pct` below.
- `cluster_gap_pct` — `|flip − vwap| / close`; ≥ 0 and **not bounded above** (it is
  `cluster_quality` that floors, at 0.05, not the gap). `null` when flip or vwap
  is unavailable or close <= 0 — the `missing_levels` short-circuit, which also
  omits `confluence_level`, `cluster_quality` and `cluster_members` and scores 0.
  Clients should render the absence rather than back-computing a gap: in that
  state no cluster was built.
- `gamma_flip`, `vwap`, `max_pain`, `max_gamma`, `call_wall` — raw input
  levels used in the computation; `null` when unavailable. Always present
  regardless of whether the level ended up in `cluster_members`.
- `expected_target` — `confluence_level` itself under mean reversion; under
  continuation `close + 2 × (close − confluence_level)`, i.e. projected past spot
  by twice the distance already travelled from the cluster, on the side price
  has already left. Geometric: it does not scale with the score.
- `regime_direction` (in `context_values`) — `"mean_reversion"` | `"continuation"`.

**Trader interpretation:**
- `signal == "bullish_confluence"` + `cluster_quality > 0.8` + `regime_direction == "mean_reversion"`:
  `confluence_level` is a buy zone; `expected_target` is the reversion target.
- `regime_direction == "continuation"` (short gamma): breaks tend to run;
  use `expected_target` as the first profit taker.

**Page design.** Vertical price axis with cluster members as colored tick marks and
`confluence_level` as a bold band. Arrow from current price to `expected_target`.
Regime chip ("reversion" vs "continuation").

## Query parameters

- `symbol` string

## Response `200`

Successful Response

- unknown

## Other responses

- `422`: Validation Error

---

[API](https://skmtc.dev/zerogex/apis/zerogex-api.md) · [All operations](https://skmtc.dev/zerogex/apis/zerogex-api/llms.txt) · [OpenAPI document](https://skmtc.dev/zerogex/apis/zerogex-api/revisions/753b26bf0592?raw)
