Trade Signals (v2)

Api V2 Signals Basic Positioning-Trap Get

Crowd-positioning trap — squeeze/flush risk from one-way crowding.

Flags setups where tape behavior is starting to invalidate crowd direction — the classic squeeze/flush patterns.

  • +score (squeeze risk): puts crowded + aggressive put-buying + up-momentum + price above gamma flip + short-gamma regime → upside squeeze fuel.
  • −score (flush risk): calls crowded + aggressive call-buying + down-momentum + price below gamma flip + short-gamma → downside air-pocket.

Uses signed net smart-money premium (buy − sell) from flow_contract_facts when available — more informative than legacy total_premium because opposite-side buying nets out (a big put-buy

  • big put-sell should not count as crowd skew).

Logic highlights (src/signals/basic/positioning_trap.py):

short_crowding = clip((put_call_ratio − 1.05) / 0.35, [0, 1])
long_crowding  = clip((0.95 − put_call_ratio) / 0.35, [0, 1])
put_skew       = max(0, −smart_imbalance)
call_skew      = max(0, +smart_imbalance)

squeeze = 0.45·short_crowding + 0.25·put_skew
        + 0.15·clip(momentum_5bar / 0.004, [0,1])
        + 0.10·above_flip + 0.05·neg_gex
flush   = 0.45·long_crowding  + 0.25·call_skew
        + 0.15·clip(−momentum_5bar / 0.004, [0,1])
        + 0.10·below_flip + 0.05·neg_gex
score   = clip(squeeze − flush, [-1, 1])
  • smart_imbalance = (smart_call_net − smart_put_net) / (|call_net| + |put_net|), abstaining when denominator < $100K.

Params:

  • symbol (default SPY). Returns 404 if no row exists yet.

Returns:

{
  "underlying": "SPY", "timestamp": "...",
  "clamped_score": 0.52, "score": 52.0, "direction": "bullish",
  "weighted_score": 0.0, "weight": 0.0,
  "smart_imbalance": -0.41,
  "smart_imbalance_source": "signed_net_premium",
  "momentum_5bar": 0.0025,
  "context_values": {
    "put_call_ratio": 1.28, "smart_imbalance": -0.41,
    "smart_imbalance_source": "signed_net_premium",
    "momentum_5bar": 0.0025, "close": 577.24,
    "gamma_flip": 574.5, "net_gex": -1.4e9
  },
  "score_history": [{"score": 31.0, "timestamp": "..."}, "...up to 90"]
}
  • score / clamped_score — [-100, +100] / [-1, +1]. + = squeeze risk, − = flush risk.
  • smart_imbalance — [-1, +1]; + = call-buy heavy, − = put-buy heavy. Counter-intuitively, put-heavy imbalance drives +score (squeeze fuel).
  • smart_imbalance_source — "signed_net_premium" (best) | "signed_top_level" (older fields).
  • momentum_5bar — 5-bar price %, e.g. 0.0035 = +0.35%.
  • context_values.put_call_ratio — float, typically [0.5, 2.0].
  • context_values.close / gamma_flip — used to derive above_flip/below_flip.
  • context_values.net_gex — signed; < 0 amplifies both sides.
  • score_history — up to 90 recent points.

Trader interpretation.

  • score > +50 → upside squeeze setup. Long-delta; size up if close > gamma_flip AND net_gex < 0.
  • score < −50 → downside flush setup. Put debit spreads; trim longs.
  • Moderate magnitude (±25–50) plus contradictory tape_flow_bias → the trap may already be unwinding; wait.
  • smart_imbalance_source = "signed_top_level" → lower-precision fields; signal still valid.

Page design. Horizontal ±100 "trap meter" with "Flush Risk" (left) and "Squeeze Risk" (right). Decomposition panel showing the five input factors as mini-bars (short/long_crowding, put/call_skew, momentum, above/below_flip, neg_gex) so the trader sees why. Contextual footer with put_call_ratio, momentum_5bar %, close vs gamma_flip, net_gex sign.

get/api/v2/signals/basic/positioning-trap

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/v2/signals/basic/positioning-trap
  • Auth: HTTP bearer

Query parameters

symbolstring

Response

Successful Response

dataunknown required

Changes

No recorded changes to this operation across all 1 revision of this API.