| name | opportunity-radar |
| version | 1.0.0 |
| description | Screens all Hyperliquid perps and surfaces top trading setups |
| author | Nunchi Trade |
| tags | ["radar","screener","technicals","opportunities","hyperliquid"] |
Opportunity Radar
Screens all Hyperliquid perpetual markets through a 4-stage funnel to surface
the highest-conviction trading setups.
Architecture
Stage 0: BTC Macro Context (EMA 5/13 on 4h, 1h momentum)
Stage 1: Bulk Screen (~500 assets → ~70 by volume)
Stage 2: Top-N Selection (by composite liquidity score)
Stage 3: Deep Dive (multi-TF technicals + 3-pillar scoring)
Stage 4: Momentum + Final Ranking
3-Pillar Scoring (0-400 scale)
| Pillar | Weight | Signals |
|---|
| Market Structure | 35% | Volume tiers, surge, OI, OI/Vol health |
| Technicals | 40% | 4h trend, hourly trend, RSI, patterns, volume |
| Funding | 25% | Neutral (+40), favorable, unfavorable penalties |
Hard Disqualifiers
- Counter-trend on hourly structure
- Extreme RSI (>80 for LONG, <20 for SHORT)
- Strong 4h counter-trend (strength > 50)
- Volume dying on both timeframes
- Heavy unfavorable funding (>50% annualized)
- BTC macro headwind (modifier < -30)
Usage
CLI
hl radar once
hl radar run --tick 900
hl radar once --json
hl radar once --mock
hl radar status
hl radar presets
Standalone
from skills.radar.scripts.standalone_runner import RadarRunner
from cli.hl_adapter import DirectHLProxy
runner = RadarRunner(hl=hl, tick_interval=900)
runner.run()
Configuration
Via YAML config or CLI flags:
--min-volume: Minimum 24h volume to qualify (default: $500K)
--top-n: Assets to deep dive (default: 20)
--preset: "default" or "aggressive"
--score-threshold: Minimum final score (default: 150)
Agent Mandate
You are the opportunity radar. Your job is to screen the entire Hyperliquid perps universe and rank assets by trading conviction. You do NOT place trades — you surface setups for APEX or the human operator.
RULES:
- ALWAYS check BTC macro context first — if headwind modifier < -30, all scores are suppressed
- NEVER recommend a disqualified asset — hard disqualifiers are absolute
- Present results sorted by score, highest first
- Include direction (LONG/SHORT) and risk factors for each candidate
- Run at minimum every 15 minutes during active trading
Decision Rules
| Score Range | Interpretation | Action |
|---|
| 250-400 | Elite setup — rare, strong multi-pillar confluence | Immediate entry candidate for APEX |
| 170-250 | Good setup — solid edge | Standard entry if Pulse confirms |
| 140-170 | Marginal — needs confirmation | Queue only, wait for Pulse signal |
| 100-140 | Weak — one pillar carrying | Skip — insufficient edge |
| 0-100 | No edge | Ignore completely |
| BTC Macro | Effect | Action |
|---|
| Strong uptrend (mod > +20) | Tailwind for longs | Score longs normally, penalize shorts |
| Neutral (mod -10 to +10) | No macro effect | Score normally |
| Downtrend (mod < -20) | Headwind | Raise entry threshold to 200+ |
| Crash (mod < -40) | Major headwind | Skip all entries, wait for stabilization |
Anti-Patterns
- Chasing yesterday's winners: An asset scored 300 yesterday but 120 today → do not enter. Scores are point-in-time.
- Ignoring volume decay: High score but volume dying on both timeframes → disqualified. The setup is stale.
- Entering on RSI extremes: RSI > 80 (long) or < 20 (short) means the move already happened. Radar correctly disqualifies these.
- Running in aggressive mode by default: Aggressive lowers thresholds → more candidates but lower quality. Use default unless you have excess budget.
Error Recovery
| Error | Cause | Fix |
|---|
0 candidates after scan | Low-vol period | Normal — no action needed. Don't force trades. |
Candle fetch timeout | HL API rate limit | Reduce --top-n or increase tick interval |
BTC candle unavailable | API issue | Radar defaults to neutral macro — safe fallback |
Score calculation error | Missing data for asset | Asset auto-skipped — check logs for pattern |
Composition
Radar is a sub-component of APEX (runs every 15 ticks). Can also be used standalone for manual trade selection. Pairs with Pulse for confirmation — Radar finds setups, Pulse detects timing.
Cron Template
*/15 8-20 * * 1-5 cd ~/agent-cli && hl radar once --json >> data/radar/scans.jsonl 2>&1