Spot Trading
Dynamic position sizing and exposure governance for spot positions in Bitcoin and Ethereum. One API call before every trade.
Free during beta
The problem
A fixed 5% position size is too aggressive in PANIC and too conservative in confirmed TREND. Spot traders need sizing that adapts to the current regime, volatility, and macro environment.
You get a signal to buy BTC. But should you deploy 10% or 40%? Spot trading without pre-trade risk limits means every entry is a guess on sizing.
If you borrow stablecoins against BTC collateral to buy more BTC spot, your effective leverage is hidden. A 20% drawdown can cascade through your lending position.
How it works
max_size_fraction adjusts to market regime, composite score, volatility, and DeFi health. PANIC regimes cap exposure at 15%. Confirmed TREND allows up to 80%.
On-chain (MVRV, NUPL, supply in profit), derivatives (funding, OI, basis), macro (yields, DXY, Fed liquidity), and sentiment — scored, normalized, and combined into one number.
BLOCK (reduce only) through EXPANSION (full operations). Each level defines allowed actions, blocked actions, and maximum exposure. Deterministic — same inputs, same output, every time.
Pass a wallet address and RiskState factors your Aave V3 or Spark Protocol health factor into the position limit. Collateral stress and spot exposure governed together.
API response
max_size_fractionMaximum spot position size as fraction of portfolio (0 to 1)
allowed_actionsPermitted actions: DCA, LONG, SHORT, WAIT, HEDGE
tactical_stateCurrent directional bias: LEAN BULL, NEUTRAL, LEAN BEAR
binding_constraintWhich cap is limiting you: RULES, MACRO, DEFI, or CYCLE
Request
curl -X POST https://riskstate.netlify.app/v1/risk-state \
-H "Authorization: Bearer $RISKSTATE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"asset": "BTC"}'Response
{
"exposure_policy": {
"max_size_fraction": 0.42, // ◀
"leverage_allowed": true, // ◀
"allowed_actions": ["DCA", "LONG_SHORT_CONFIRMED"],
"blocked_actions": ["ALL_IN", "LEVERAGE_GT_2X"]
},
"tactical_state": "LEAN BULL", // ◀
"market_regime": "TREND",
"policy_level": 4,
"binding_constraint": {
"source": "MACRO", // ◀
"reason_codes": ["MACRO_NEUTRAL", "COUPLING_NORMAL"]
},
"risk_flags": {
"structural_blockers": [],
"context_risks": ["HIGH_COUPLING", "TREND_NOT_CONFIRMED"]
}
}One POST request. Deterministic policy. No ML to train, no rules to write.
RiskState computes a max_size_fraction (0 to 1) from 4 independent risk caps: rules (30+ signal composite), DeFi health (LTV and health factor), macro regime (yields, DXY, Fed liquidity), and cycle phase (MVRV, halving distance, drawdown). The lowest cap wins. Multiply max_size_fraction by your portfolio to get the maximum dollar amount for a spot entry.
No. RiskState tells you how much you’re allowed to risk, not what to trade. You bring your own signal — technical analysis, on-chain alerts, AI agent, or manual conviction. RiskState adds the missing governance: if you decide to buy, it tells you the maximum position size, whether leverage is permitted, and which actions are blocked.
Yes. BTC and ETH have independent scoring pipelines. BTC uses MVRV, NUPL, halving cycle, and BTC/SPX correlation. ETH uses a structural score (staking ratio, supply dynamics, ETH/BTC strength, network fundamentals), ETH/NASDAQ correlation, and altseason detection. Pass asset: ‘BTC’ or asset: ‘ETH’ to get asset-specific risk permissions.
For active spot trading, poll every 5 minutes. The API caches responses for 60 seconds, so more frequent calls return the same data. For swing or position trading, checking once per hour or before each new entry is sufficient. Risk permissions update automatically as market conditions change.
The policy level drops automatically. In PANIC regime, max_size_fraction drops below 15% and most actions are blocked — only reduce and hedge are allowed. As conditions improve (composite rises, volatility normalizes, macro stabilizes), permissions widen gradually through DEFENSIVE, CAUTIOUS, SELECTIVE, and EXPANSION levels.
Free during beta. API key delivered instantly.