Why AI Trading Agents Need a Cycle-Position Read
An AI agent that trades the same way at $20K BTC as at $100K BTC is misallocating risk. Crypto is regime-dependent. The same RSI dip means "buy" in accumulation and "sell" in euphoria. Same funding flip, same volume spike — interpretation flips depending on where in the cycle the market actually is.
That cycle-position read is hard to derive from price alone, because price is exactly what you're trying to predict. You need a structural anchor: an on-chain metric that tells you whether long-term holders are sitting on losses, modest gains, or euphoric paper profits. The canonical answer is MVRV — market value over realized value.
Crypto Data API exposes BTC MVRV plus zone classification at /api/v1/on-chain/dormancy/btc. This post shows how an LLM trading agent should consume the endpoint to build a robust macro bias.
What Is MVRV, Mathematically?
MVRV = market cap divided by realized cap.
Market cap is what every coin would be worth at current spot price — the standard number you see on CoinGecko.
Realized cap is the sum of every UTXO valued at the price it last moved at. It approximates what holders actually paid, in aggregate, for the supply they currently hold.
- MVRV = 1.0: the average holder is breakeven.
- MVRV > 1: holders sit on unrealized gains.
- MVRV < 1: holders sit on unrealized losses — historical capitulation territory.
The metric is structurally bounded by history. Every BTC top since 2013 occurred at MVRV > 3.5; every bottom occurred at MVRV < 1. That gives us five empirically-derived zones an AI agent can use as cycle bias.
The Five MVRV Zones and Their Bias
The endpoint returns the current MVRV value plus a pre-classified zone label so your agent doesn't have to implement the bands itself:
| Zone | MVRV range | Historical context | Agent bias |
|---|---|---|---|
| capitulation | < 1.0 | Long-term holders underwater. Bear cycle bottoms. | Maximum constructive — start scaling in |
| accumulation | 1.0 – 1.5 | Early-bull / late-bear. The boring bottoming phase. | Constructive — overweight |
| neutral | 1.5 – 2.5 | Mid-cycle. Trend conditions dominate. | Neutral — let other signals decide |
| elevated | 2.5 – 3.5 | Late-cycle. Watch for distribution. | Cautious — trim, tighten stops |
| euphoria | > 3.5 | Cycle-top territory. | Defensive — hedge or exit |
These zones are not arbitrary thresholds. They are derived from the band ranges that have historically demarcated cycle phases on the BTC chart since 2013. The endpoint will surface the value, the zone, and a human-readable interpretation string — useful directly in LLM prompts.
What the Dormancy Endpoint Returns
One call gives you MVRV plus the supporting metrics an agent uses to confirm or contradict the primary signal:
curl -H "X-API-Key: cdk_live_yourkey" \
"https://cryptodataapi.com/api/v1/on-chain/dormancy/btc"Live response:
{
"as_of_date": "2026-05-27",
"mvrv_signal": {
"zone": "accumulation",
"value": 1.3721,
"interpretation": "early-bull / late-bear bottoming"
},
"metrics": {
"mvrv": 1.3721,
"mvrv_7d_change_pct": -3.93,
"mvrv_30d_change_pct": -3.88,
"active_addresses": 608435,
"active_addresses_7d_change_pct": -6.15,
"exchange_inflow_usd_24h": 1917259402,
"exchange_outflow_usd_24h": 1600666739,
"exchange_net_flow_usd_24h": -316592663,
"issuance_usd_24h": 32492589,
"price_usd": 74268.78
}
}The signal-and-zone pair gives the agent a one-shot cycle read. The metrics block lets it explain why — and that explanation is what good LLM prompts surface to the user.
Wiring MVRV Zone Into Your Agent's Macro Bias
Because MVRV moves slowly (daily-frequency data), the polling cadence should be hourly at most. The integration pattern is simple but high-impact:
import httpx
API = "https://cryptodataapi.com/api/v1"
KEY = "cdk_live_yourkey"
HEADERS = {"X-API-Key": KEY}
ZONE_TO_BIAS = {
"capitulation": ("max_constructive", 1.5), # leverage multiplier
"accumulation": ("constructive", 1.25),
"neutral": ("neutral", 1.0),
"elevated": ("cautious", 0.5),
"euphoria": ("defensive", 0.0),
"unknown": ("neutral", 1.0),
}
async def macro_bias() -> dict:
async with httpx.AsyncClient(timeout=10) as c:
r = await c.get(f"{API}/on-chain/dormancy/btc", headers=HEADERS)
data = r.json()
zone = data["mvrv_signal"]["zone"]
bias_label, leverage = ZONE_TO_BIAS[zone]
return {
"zone": zone,
"mvrv": data["metrics"]["mvrv"],
"bias": bias_label,
"leverage": leverage,
"context": data["mvrv_signal"].get("interpretation", ""),
}Notice the leverage multiplier. The macro bias is most useful as a position-sizing modifier rather than an entry/exit trigger. Tactical signals (funding flips, exchange inflow spikes) decide when to act; MVRV zone decides how much.
MVRV vs Other Cycle Indicators
There are many cycle indicators in the BTC ecosystem. They are not interchangeable:
- MVRV measures where holders sit profitably. Best for distribution / accumulation detection.
- Puell Multiple measures miner revenue stress. Best for confirming miner-driven bottoms.
- NUPL (Net Unrealized P&L) is essentially MVRV expressed as a percentage. Same information, different presentation.
- Pi Cycle Top / 2-Year MA Multiplier are price-derived. Useful for tops; less so for bottoms.
- SOPR measures realized profit on spending. Daily-noisy but excellent for intraday capitulation flags.
The cleanest stack uses MVRV as the macro bias, the Hash Ribbon for bottom confirmation, and exchange flows for tactical timing. Each addresses a different time horizon. The /on-chain/score endpoint already weights MVRV at 25% of the composite — the heaviest single component — precisely because cycle position dominates everything else.
When Does MVRV Mislead?
Two known failure modes a thoughtful agent guards against:
- Long sideways periods. When BTC chops in a range for months, MVRV drifts slowly. The zone may not change for half a year. The agent should not interpret "stable zone" as "no signal" — it's the persistent bias that matters, not the rate of change.
- Cycle compression. Each successive BTC cycle has compressed the MVRV peak — the 2021 top hit ~3.96, the 2017 top hit ~4.7, the 2013 top hit ~5.8. If the next cycle continues the compression, the "euphoria" threshold of 3.5 might fire too early. Use MVRV rate-of-change (7d, 30d) as a secondary read to spot when the zone is being touched briefly versus sustained.
The endpoint surfaces mvrv_7d_change_pct and mvrv_30d_change_pct for exactly this confirmation. An agent should weight zone signals more heavily when the move into the zone was sustained (multi-week trend) versus when MVRV briefly touched the boundary.
How to Plug MVRV Into Your Agent Today
Three-step minimal integration:
- Get a free API key at cryptodataapi.com.
- Add an hourly polling job hitting
/api/v1/on-chain/dormancy/btc. - Use the returned zone as a position-sizing multiplier — not as an entry trigger.
For richer cycle awareness, layer on:
/on-chain/miners/hash-ribbonfor bottom confirmation./on-chain/whales/accumulation-scorefor smart-money positioning./on-chain/stablecoin-reserves/dry-powderfor capital-staging context./on-chain/scorefor the integrated composite read.
Partners building cycle-aware LLM trading agents — including Cabal Trader — consume MVRV via this endpoint because the data is sourced from CoinMetrics Community API, free of paid-tier gatekeeping, and pre-classified into action-ready zones. No band-tuning required.



