Skip to main content
Glama

Opportunity Scan

research_opportunities
Read-only

Cross-sectional opportunity scan across every major and medium-cap coin at once — the screener the per-coin tools cannot be looped into safely. Two whole-universe feeds (the merged market snapshot + venue perp contexts) build a liquidity-filtered universe and rank it, then candles are fetched for a bounded shortlist only; ZERO per-symbol calls are made to the rate-limited derivatives provider, which is what lets this cover a universe without silently degrading. Up to eight signals per candidate: crowding (annualized funding vs the venue-standard anchor AND its percentile across the screened universe right now — a cross-sectional read, explicitly NOT the own-history percentile research_positioning reports; reported without a vote, because funding extremes have tended to continue rather than reverse), stress (24h long and short liquidations each as a share of open interest, both read on Bybit so the ratio is one book — longs flushed leans long, shorts flushed (a spent squeeze) leans short), leverage (open interest as a share of market cap — the gap-through-your-stop condition), compression (4h Bollinger bandwidth ranked against the coin's own trailing window — the per-coin form of the reading research_regime computes for BTC alone; says energy is loading, never direction), trend (ADX with the +DI/-DI separation on 4h, confirmed against 1d — votes +1 only for a strong 3:1 trend the slow timeframe agrees with), location (distance from the 4h EMA20 in ATR units — an extended coin scores DOWN, because a chase is not a setup), entry (whether the limit is still live) and reward (net-of-fees reward:risk and stop distance). Each signal reports its state, the numbers, and a +1/0/-1 setup-quality vote; the setup name and score come from a disclosed rule shipped with every scan, under which the reading that named the setup counts 0. Each candidate also says why it is worth a look now: its 24h price, OI (venue contracts) and volume against its own last 60 days, the plain-word labels those earn (longs building, short covering, crowded short, coiling, ...), and for each label what followed it in a 2-year backtest, verdict included (often 'no edge'). Priced setups carry their setup type's backtest track record (trades, win rate, average R after fees, against random entries). Each candidate says whether it is ACTIONABLE (a priced live entry, net reward:risk >= 1.5, score >= +1) and, when not, which gates it missed; actionable candidates rank first. Candidates carry ATR-and-structure trade plans priced so they feed research_trade_plan directly. A TRENDING PULLBACK is entered at market with its levels from the EMA20 pullback, taking half at +1R and moving the rest to breakeven (60% of 19,139 backtested trades won, about 0R on average, the same as random entries with those exits); an ABSORPTION SHORT (yesterday's Binance taker-buy share in the bottom 10% of the coin's own 60 days while the day closed flat or up) is a short at market, stop 2.5 ATR, target 2R, the one setup type that beat random entries in the backtest; a BREAKDOWN (24h drop in the bottom 5% of the coin's own 60 days) is a short at market; a COIL BREAKOUT (volatility squeezed, no trend) is a stop bracket around the 10-candle range. Stops sit behind the recent swing (a bracket's at the range midpoint), and targets at the structural level or 2R, whichever is nearer. Every priced plan carries its type's 2-year backtest record and a plain caveat; none of the three types passed a pre-registered edge test. No geometry is priced after a 24h move beyond ±30% or with a stop over 15% from entry, nor, for 7 days after BTC moves ±6% in 24h, for a TRENDING PULLBACK against that move (such plans lost in the backtest, in and out of sample; marketShock reports the active shock); the candidate says why. News is on the board but never scored: 'news.market' lists the last 24h's headlines after which BTC or ETH moved 1%+ (or a major coin 3%+) within the hour, and each candidate carries up to 3 headlines tagged with its coin (Tree of Alpha's feed, kept up to 48h by the server). Tokenized gold (XAUT, PAXG) is not screened, and one coin listed under two venue tickers (e.g. PUMP and PUMPFUN) is screened once. 'tier' filters major/medium/all; 'limit' caps the ranked list; 'symbols' narrows the universe to specific coins, and every symbol named there is accounted for individually in the response — selected, excluded by your own tier filter, below the liquidity floors (never screened, so no band was ever applied to it), below the tier floor, or not quoted at all — because mere absence from the ranked list conflates four different answers. Reports a board, not a forecast: the bands are disclosed constants chosen for plausibility with no backtest behind them, and 'NO CANDIDATES' is a real and frequent answer. Use it to pick what to look at, then research_positioning and ta_technicals on the two or three that stand out.

Input Schema

NameRequiredDescriptionDefault
tierNoSize tier to screen: 'major' (market cap >= $10B), 'medium' ($300M-$10B), or 'all' (default).
limitNoRanked candidates to return. Default 10, max 25.
symbolsNoOptional: narrow the universe to these coin symbols, e.g. ["SOL","AVAX"]. Omit to screen everything that clears the tier and liquidity floors.
intervalsNoThe timeframe pair to analyse, FINEST FIRST: [fast] or [fast, slow]. Default ["4h","1d"]. This is the most consequential argument: entry, stop, target, ATR and every AT STRUCTURE verdict are measured on the fast timeframe, so changing it produces a DIFFERENT trade rather than a refinement of the same one — on one live BTC read the 1h pair put the entry 0.2% above spot while the 1d pair put it 10.7% below, with stops of 0.77% and 3.31%. Lookbacks are counted in candles, so the swing windows scale too (30 candles is 5 days at 4h, 7 hours at 15m). The second interval only CONFIRMS the first and must be slower; pass one interval to skip confirmation, which halves the candle cost and makes the trend vote abstain.

Output Schema

NameRequiredDescriptionDefault
newsNoHeadlines, shown and never scored: no setup, score or price reads them. Null when the news feed did not answer (no data, not no news).
ruleNoThe exact rule that produced setup and score
caveatsNoWhat the scan cannot see, stated rather than implied
backdropNoThe market's direction as research_regime reads it, shown and never scored: each candidate's backdrop field says whether its side is with or against it, but nothing is priced or ranked by it. Null when the regime read failed.
coverageNoWhat the scan actually looked at — read this before treating an empty candidate list as a quiet market
candidatesNo
marketShockNoThe BTC shock whose guard is active, or null. After BTC's hourly close first sits 6% or more from its close 24h earlier, for 168h a TRENDING PULLBACK on notPricedSide (against the move) is not priced; those candidates say so in notPriced. In the backtest such plans lost (−0.05R a trade out of sample, −0.10R in sample, against about 0R otherwise). Loss avoidance, not an edge for the other side.
absorptionTodayNoHow many selected coins fired the ABSORPTION SHORT reading on the last closed UTC day. Descriptive only: in the backtest the count did not separate results (days it fired widely +0.18R per trade, other days +0.16R), so a high count is not a better trade. Null when the reading was not taken (a fast interval other than 4h).
exchangeNoticesNoScheduled and recent (within 7 days) exchange listings and delistings for the coins in this answer; see catalysts_exchange_listings. Shown, never scored.
requestedSymbolsNoOne entry per symbol named in the 'symbols' argument, so a symbol missing from 'candidates' can be explained. Empty when no symbols were named. A status other than 'selected' means no band was applied to that coin, so its absence says nothing about its setup.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / exchangeNotices
      Added value: +{
      +  "description": "Scheduled and recent (within 7 days) exchange listings and delistings for the coins in this answer; see catalysts_exchange_listings. Shown, never scored.",
      +  "type": "array"
      +}
  2. Changed5 schema fields changed
    • addedOutput schema / properties / backdrop
      Added value: +{
      +  "description": "The market's direction as research_regime reads it, shown and never scored: each candidate's backdrop field says whether its side is with or against it, but nothing is priced or ranked by it. Null when the regime read failed.",
      +  "properties": {
      +    "axes": {
      +      "description": "The regime axes: Trend, Volatility, Cycle, Sentiment (Fear & Greed), Leverage, Liquidity (ETF flows), Rotation",
      +      "items": {
      +        "properties": {
      +          "detail": {
      +            "type": "string"
      +          },
      +          "name": {
      +            "type": "string"
      +          },
      +          "state": {
      +            "type": "string"
      +          },
      +          "vote": {
      +            "type": "integer"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "bearishNews": {
      +      "description": "... followed by a fall",
      +      "type": "integer"
      +    },
      +    "bullishNews": {
      +      "description": "Market headlines of the last 24h followed by a rise within the hour",
      +      "type": "integer"
      +    },
      +    "direction": {
      +      "description": "bull | bear | empty for NEUTRAL",
      +      "type": "string"
      +    },
      +    "posture": {
      +      "description": "RISK-ON | CAUTIOUS RISK-ON | NEUTRAL | DEFENSIVE | RISK-OFF, with its vote score",
      +      "type": "string"
      +    }
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / candidates / items / properties / backdrop
      Added value: +{
      +  "description": "with | against | empty: whether this candidate's side agrees with the market backdrop's direction. Shown, never scored.",
      +  "type": "string"
      +}
    • addedOutput schema / properties / candidates / items / properties / headlines
      Added value: +{
      +  "description": "Up to 3 headlines of the last 24h the feed tagged with this coin, newest first. Shown, never scored.",
      +  "items": {
      +    "properties": {
      +      "atMs": {
      +        "type": "integer"
      +      },
      +      "coins": {
      +        "description": "The feed's own coin tags, a word match that can be wrong",
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "impact": {
      +        "description": "The move the feed measured on a tagged coin within the hour after the headline: what followed it, not proof it caused it",
      +        "properties": {
      +          "coin": {
      +            "type": "string"
      +          },
      +          "down": {
      +            "type": "number"
      +          },
      +          "pct": {
      +            "description": "Net move over the window, percent",
      +            "type": "number"
      +          },
      +          "up": {
      +            "type": "number"
      +          },
      +          "windowMs": {
      +            "type": "integer"
      +          }
      +        },
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "kind": {
      +        "description": "article | tweet | exchange",
      +        "type": "string"
      +      },
      +      "title": {
      +        "type": "string"
      +      },
      +      "url": {
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / marketShock
      Added value: +{
      +  "description": "The BTC shock whose guard is active, or null. After BTC's hourly close first sits 6% or more from its close 24h earlier, for 168h a TRENDING PULLBACK on notPricedSide (against the move) is not priced; those candidates say so in notPriced. In the backtest such plans lost (−0.05R a trade out of sample, −0.10R in sample, against about 0R otherwise). Loss avoidance, not an edge for the other side.",
      +  "properties": {
      +    "atMs": {
      +      "description": "When the guard started (the hour after the crossing close)",
      +      "type": "integer"
      +    },
      +    "changePct": {
      +      "description": "BTC's 24h change at the hour that crossed",
      +      "type": "number"
      +    },
      +    "direction": {
      +      "description": "up | down",
      +      "type": "string"
      +    },
      +    "notPricedSide": {
      +      "description": "long | short: the TRENDING PULLBACK side not priced",
      +      "type": "string"
      +    },
      +    "untilMs": {
      +      "description": "When the guard lapses",
      +      "type": "integer"
      +    }
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / news
      Added value: +{
      +  "description": "Headlines, shown and never scored: no setup, score or price reads them. Null when the news feed did not answer (no data, not no news).",
      +  "properties": {
      +    "market": {
      +      "description": "Headlines of the last 24h after which, within the hour, BTC or ETH moved 1%+ or a major-tier coin 3%+ (a Binance hack tags BNB, not BTC), newest first",
      +      "items": {
      +        "properties": {
      +          "atMs": {
      +            "type": "integer"
      +          },
      +          "coins": {
      +            "description": "The feed's own coin tags, a word match that can be wrong",
      +            "items": {
      +              "type": "string"
      +            },
      +            "type": "array"
      +          },
      +          "impact": {
      +            "description": "The move the feed measured on a tagged coin within the hour after the headline: what followed it, not proof it caused it",
      +            "properties": {
      +              "coin": {
      +                "type": "string"
      +              },
      +              "down": {
      +                "type": "number"
      +              },
      +              "pct": {
      +                "description": "Net move over the window, percent",
      +                "type": "number"
      +              },
      +              "up": {
      +                "type": "number"
      +              },
      +              "windowMs": {
      +                "type": "integer"
      +              }
      +            },
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "kind": {
      +            "description": "article | tweet | exchange",
      +            "type": "string"
      +          },
      +          "title": {
      +            "type": "string"
      +          },
      +          "url": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "type": "array"
      +    },
      +    "sinceMs": {
      +      "description": "The oldest headline the server's news memory holds (the feed keeps about 6 hours; the server up to 48, from its last deploy)",
      +      "type": "integer"
      +    }
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  3. Changed1 schema field changed
    • changedOutput schema / properties / absorptionToday / description
      Previous value: -"How many selected coins fired the ABSORPTION SHORT reading on the last closed UTC day. Descriptive only: the setup's backtested result came mostly from days it fired on many coins at once. Null when the reading was not taken (a fast interval other than 4h)."New value: +"How many selected coins fired the ABSORPTION SHORT reading on the last closed UTC day. Descriptive only: in the backtest the count did not separate results (days it fired widely +0.18R per trade, other days +0.16R), so a high count is not a better trade. Null when the reading was not taken (a fast interval other than 4h)."
  4. Changed2 schema fields changed
    • addedOutput schema / properties / absorptionToday
      Added value: +{
      +  "description": "How many selected coins fired the ABSORPTION SHORT reading on the last closed UTC day. Descriptive only: the setup's backtested result came mostly from days it fired on many coins at once. Null when the reading was not taken (a fast interval other than 4h).",
      +  "properties": {
      +    "count": {
      +      "type": "integer"
      +    },
      +    "fired": {
      +      "items": {
      +        "type": "string"
      +      },
      +      "type": "array"
      +    },
      +    "read": {
      +      "description": "Coins whose taker flow answered and could be ranked",
      +      "type": "integer"
      +    }
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / candidates / items / properties / evidence
      Added value: +{
      +  "description": "passed | failed | none: whether this setup type passed its pre-registered backtest (beat random entries in both years after fees and funding). Only ABSORPTION SHORT passed; read a 'failed' plan as a described setup, not an edge. none = EXTENDED or NO SETUP, which carry no plan.",
      +  "type": "string"
      +}
  5. Changed1 schema field changed
    • changedOutput schema / properties / candidates / items / properties / setup / description
      Previous value: -"TRENDING PULLBACK (resting limit) | BREAKDOWN (short at market) | COIL BREAKOUT (stop bracket) | EXTENDED | NO SETUP. EXTENDED is reported so it is NOT taken as an entry."New value: +"ABSORPTION SHORT (short at market) | TRENDING PULLBACK (at market, half at +1R) | BREAKDOWN (short at market) | COIL BREAKOUT (stop bracket) | EXTENDED | NO SETUP. EXTENDED is reported so it is NOT taken as an entry."
  6. Changed1 schema field changed
    • addedOutput schema / properties / candidates / items / properties / geometry / properties / management
      Added value: +{
      +  "description": "Post-fill management the plan was backtested with: take partialFraction at partialAtR from the fill, then move the stop on the rest to breakeven",
      +  "properties": {
      +    "breakevenAfterPartial": {
      +      "type": "boolean"
      +    },
      +    "partialAtR": {
      +      "type": "number"
      +    },
      +    "partialFraction": {
      +      "type": "number"
      +    }
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  7. Changed7 schema fields changed
    • changedOutput schema / properties / candidates / items / properties / geometry / description
      Previous value: -"ATR-and-structure prices, ready for research_trade_plan. Absent for a setup with no priceable side (COILED) and for EXTENDED, where refusing to price a chase is the point."New value: +"ATR-and-structure prices, ready for research_trade_plan. Absent for EXTENDED and NO SETUP, and whenever a plan was refused a price (see notPriced)."
    • addedOutput schema / properties / candidates / items / properties / geometry / properties / bracket
      Added value: +{
      +  "description": "Both legs of a stop bracket: the first to trade fills and cancels the other",
      +  "properties": {
      +    "longEntryUsd": {
      +      "type": "number"
      +    },
      +    "longStopUsd": {
      +      "type": "number"
      +    },
      +    "longTargetUsd": {
      +      "type": "number"
      +    },
      +    "shortEntryUsd": {
      +      "type": "number"
      +    },
      +    "shortStopUsd": {
      +      "type": "number"
      +    },
      +    "shortTargetUsd": {
      +      "type": "number"
      +    }
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
    • changedOutput schema / properties / candidates / items / properties / geometry / properties / entryUsd / description
      Previous value: -"Resting limit at the 4h EMA20 — never the current price"New value: +"Where the entry is placed, per orderType: the 4h EMA20 for a limit, the live price for market, the buy-stop for a stop bracket (see bracket for both legs)"
    • addedOutput schema / properties / candidates / items / properties / geometry / properties / orderType
      Added value: +{
      +  "description": "limit | market | stop bracket",
      +  "type": "string"
      +}
    • changedOutput schema / properties / candidates / items / properties / lean / description
      Previous value: -"long, short, or empty. A lean, never a call; COILED deliberately carries none."New value: +"long, short, or empty. A lean, never a call; a COIL BREAKOUT carries none until a leg of its bracket fills."
    • changedOutput schema / properties / candidates / items / properties / setup / description
      Previous value: -"TRENDING PULLBACK | COILED | SQUEEZE FUEL | EXTENDED | NO SETUP. EXTENDED is reported so it is NOT taken as an entry."New value: +"TRENDING PULLBACK (resting limit) | BREAKDOWN (short at market) | COIL BREAKOUT (stop bracket) | EXTENDED | NO SETUP. EXTENDED is reported so it is NOT taken as an entry."
    • changedOutput schema / properties / requestedSymbols / items / properties / status / description
      Previous value: -"selected | tier_excluded | below_liquidity_floors | below_tier_floor | not_quoted"New value: +"selected | tier_excluded | below_liquidity_floors | below_tier_floor | not_quoted | excluded | alias"
  8. Changed2 schema fields changed
    • addedOutput schema / properties / candidates / items / properties / geometry / properties / breakEvenWinRatePct
      Added value: +{
      +  "description": "Win rate at which the setup breaks even net of those fees, in percent; null when a win doesn't cover its fees",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / candidates / items / properties / geometry / properties / netRewardRisk
      Added value: +{
      +  "description": "Reward:risk net of base-tier fees (Binance: maker entry and target, taker stop). What the geometry pays; research_trade_plan adds carry and slippage.",
      +  "type": "number"
      +}
  9. Changed1 schema field changed
    • changedOutput schema / properties / candidates / items / properties / geometry / description
      Previous value: -"ATR-and-structure prices, ready for risk_position_size. Absent for a setup with no priceable side (COILED) and for EXTENDED, where refusing to price a chase is the point."New value: +"ATR-and-structure prices, ready for research_trade_plan. Absent for a setup with no priceable side (COILED) and for EXTENDED, where refusing to price a chase is the point."
  10. Changed1 schema field changed
    • addedOutput schema / properties / requestedSymbols
      Added value: +{
      +  "description": "One entry per symbol named in the 'symbols' argument, so a symbol missing from 'candidates' can be explained. Empty when no symbols were named. A status other than 'selected' means no band was applied to that coin, so its absence says nothing about its setup.",
      +  "items": {
      +    "properties": {
      +      "detail": {
      +        "description": "The numbers behind the status, with the floor each was measured against",
      +        "type": "string"
      +      },
      +      "status": {
      +        "description": "selected | tier_excluded | below_liquidity_floors | below_tier_floor | not_quoted",
      +        "type": "string"
      +      },
      +      "symbol": {
      +        "type": "string"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  11. Changed3 schema fields changed
    • addedInput schema / properties / intervals
      Added value: +{
      +  "description": "The timeframe pair to analyse, FINEST FIRST: [fast] or [fast, slow]. Default [\"4h\",\"1d\"]. This is the most consequential argument: entry, stop, target, ATR and every AT STRUCTURE verdict are measured on the fast timeframe, so changing it produces a DIFFERENT trade rather than a refinement of the same one — on one live BTC read the 1h pair put the entry 0.2% above spot while the 1d pair put it 10.7% below, with stops of 0.77% and 3.31%. Lookbacks are counted in candles, so the swing windows scale too (30 candles is 5 days at 4h, 7 hours at 15m). The second interval only CONFIRMS the first and must be slower; pass one interval to skip confirmation, which halves the candle cost and makes the trend vote abstain.",
      +  "items": {
      +    "enum": [
      +      "1m",
      +      "5m",
      +      "15m",
      +      "30m",
      +      "1h",
      +      "4h",
      +      "12h",
      +      "1d",
      +      "1w"
      +    ],
      +    "type": "string"
      +  },
      +  "type": "array"
      +}
    • addedOutput schema / properties / coverage / properties / fastInterval
      Added value: +{
      +  "description": "The timeframe every level in this report is measured on",
      +  "type": "string"
      +}
    • addedOutput schema / properties / coverage / properties / slowInterval
      Added value: +{
      +  "description": "The confirmation timeframe; absent when only one interval was requested, in which case the trend vote abstains",
      +  "type": "string"
      +}
  12. Added

TDQS

Score is being calculated.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources