In This Article
- Why I built it — the problem with reading derivatives manually
- The four scoring components and their exact thresholds
- The regime detection system and why weights change dynamically
- The consensus boost — when 3 components agree
- The Market Evidence panel — what it is and isn't
- Why I changed data sources twice
- Why ATR is in a bias dashboard
- What this tool cannot do
- How to actually use it
Why I built it — the problem with reading derivatives manually
The BTC Bias Dashboard started as a personal frustration. I was reading funding rates, taker ratios, open interest and VWAP position separately, in different tabs, on different refresh cycles, trying to manually synthesise them into a view on whether conditions were supportive of a trade. The problem wasn't a lack of information. It was that I had no systematic way to weight conflicting signals against each other.
When funding is elevated but taker buy ratio is dominant and price is above VWAP, what does that actually mean for your next trade? Elevated funding is a warning. Dominant taker buys is a confirmation. Above VWAP is a structural positive. In isolation, each is interpretable. Together, without a framework, they produce a paragraph of mental gymnastics where you arrive at whatever conclusion you already wanted.
The tool exists to force that framework to be explicit, consistent, and immune to in-the-moment rationalisation.
The four scoring components and their exact thresholds
Each component returns −1 (bearish), 0 (neutral), or +1 (bullish). There are no fractional values at the component level — each is a clear verdict. This was a deliberate choice. Fractional component scores create a false precision that the underlying data doesn't support.
1. Leverage Risk
This component reads the funding rate from Kraken Futures perpetual contracts. Funding rate is the clearest single signal I've found for crowded positioning.
if avgFunding > 0.02% → −1 (BEARISH) // longs crowded, squeeze risk
if avgFunding < −0.005% → +1 (BULLISH) // shorts crowded, short squeeze fuel
else → 0 (NEUTRAL) // balanced positioning
The thresholds are asymmetric — the bullish trigger (−0.005%) is much tighter than the bearish trigger (0.02%). That asymmetry is intentional. Slightly negative funding is relatively common during healthy consolidations; it doesn't carry the same predictive weight as strongly elevated positive funding, which consistently precedes corrections. I tested equal thresholds and they produced too many false bullish signals during ranging markets.
2. Price Acceptance (VWAP + Range Position)
This component answers: is the market accepting current price levels, or rejecting them? It combines two sub-checks.
// rangePos = where price sits in the 14-day range (0–100%)
// priceTrend = 5-day avg vs prior 5-day avg, as %
if !aboveVWAP AND priceTrend < −0.3% → −1 // below VWAP and declining
if rangePos < 25% → +1 // at range lows — potential base
if rangePos > 70% AND !aboveVWAP → −1 // high range but losing VWAP
if aboveVWAP AND priceTrend > 0.5% → +1 // above VWAP and accelerating
else → 0
The third condition — high range position but below VWAP — is the one that trips people up the most. A price at the top of a recent range feels bullish. But if it's also below VWAP, that means the market is at high prices that aren't being supported by average transaction cost. That combination precedes sharp reversions more reliably than low range position alone.
3. Structural Demand
This component measures whether there's actual buying pressure behind price movement, not just price movement itself. It uses 7-day price change as its primary input, with taker flow as a secondary confirmation when the price change is ambiguous.
if ch7d > 0.5% → +1 // 7-day price change positive
// If price change is flat, check taker proxy
elif takerProxy < 0.95 → −1 // sell-side takers dominating
elif takerProxy > 1.05 → +1 // buy-side takers dominating
else → 0
The 0.5% threshold on 7-day change is deliberately conservative. Bitcoin moves 0.5% in minutes during active sessions — at the 7-day level, anything under that is essentially noise. I tested tighter thresholds and the component fired constantly on irrelevant micro-movements. Wider thresholds missed the early stages of meaningful moves.
4. Momentum
The simplest component. It compares the 3-day average price to the 7-day average price to ask: is recent price moving faster or slower than the medium-term trend?
if momentum > 0.7% → +1 // short-term above medium-term trend
if momentum < −0.7% → −1 // short-term below medium-term trend
else → 0
This component is intentionally kept simple because momentum is already partially captured by the Structural Demand component's 7-day price change input. I didn't want to double-count the same underlying signal. The 0.7% threshold creates a meaningful gap between noise and signal at this timeframe.
The regime detection system and why weights change dynamically
This is the part of the tool most people don't know about, and the part I'm most satisfied with in terms of design.
The four components don't all carry equal weight all the time. The tool detects what kind of market environment Bitcoin is currently in — trending up, trending down, or ranging — and adjusts each component's contribution accordingly. The same bias score has a different meaning and a different composition depending on whether the market is trending or consolidating.
Regime is determined by comparing the 7-day average price to the 14-day average price:
if trendStrength > 1.0% AND avg7d > avg14d → TRENDING UP
if trendStrength < −1.0% AND avg7d < avg14d → TRENDING DOWN
if |trendStrength| < 0.7% → RANGING
else → NEUTRAL
Once the regime is known, the weights shift:
📈 Trending Market
- Leverage: 0.8×
- Price: 0.9×
- Demand: 1.1×
- Momentum: 1.3×
↔ Ranging Market
- Leverage: 0.9×
- Price: 1.4×
- Demand: 0.8×
- Momentum: 0.3×
◈ Neutral
- Leverage: 1.0×
- Price: 1.0×
- Demand: 1.0×
- Momentum: 0.8×
The logic behind these shifts: in a trending market, momentum and demand are genuinely predictive — when something is trending, those signals have follow-through. Funding rates and VWAP positioning matter less because trend continuation overrides normal mean-reversion signals.
In a ranging market, the opposite is true. Momentum signals are noise — they fire constantly on small oscillations and have no follow-through. Price acceptance at VWAP becomes the dominant signal because ranging markets are defined by price oscillating around a central value. The VWAP position tells you much more about the likely next move than any momentum reading.
This means a Momentum score of +1 contributes 1.3 points to the total in a trend but only 0.3 points in a range. The same component, the same raw signal, different weight based on context. That's the key insight behind the regime system.
The consensus boost — when 3 components agree
After the weighted total is calculated, there's a second pass. If three or more components agree on direction — all pointing bullish or all pointing bearish — the total gets an additional ±1 point.
bearCount = components where score < 0
if bullCount ≥ 3 AND totalScore < 3 → totalScore += 1
if bearCount ≥ 3 AND totalScore > −3 → totalScore -= 1
The reasoning: a +2 score built from two strong bullish components and two neutral ones is a different market from a +2 score built from three bullish components and one bearish one. The three-way consensus version has more confirmation behind it and historically has better follow-through. The boost only applies when the total hasn't already hit the maximum, which prevents the adjustment from pushing the score into an invalid range.
The final score is capped at ±3 for display purposes, though the raw calculation allows ±4.
Extreme Bear
Bearish
Mild Bear
Neutral
Mild Bull
Bullish
Extreme Bull
The Market Evidence panel — what it is and isn't
The Market Evidence panel at the top of the dashboard shows five raw data readings: taker buy/sell ratio, open interest delta, funding rate, price vs 7-day average, and mark vs spot basis. It has its own summary score. I want to be precise about what this panel is, because it is often misread.
The Market Evidence panel is not the bias score. It's a raw data readout — an unweighted, unregimed summary of the most recent derivatives signals. It updates to give you a fast first read when you open the tool. The bias score below it is the considered, regime-adjusted calculation that I would actually trade from.
There's also something you should know about two of the five evidence inputs. The taker buy/sell ratio and open interest delta are proxies, not direct feeds. Direct taker and OI data from Binance requires authentication that can't be done from a public-facing serverless function without exposing API keys. The proxies are derived from price change direction and volume ratio — a reasonable approximation that tracks the real signal well in most conditions, but will diverge during high-volume sideways action where volume is elevated but price isn't moving.
The funding rate and basis are real direct figures from Kraken Futures. The price vs 7-day average is calculated from CoinGecko price data. If you need precision on taker flow, a paid data subscription to CryptoQuant or Coinalyze will give you the real number.
Why I changed data sources twice
The original version of this tool pulled directly from the Binance API. Binance has better liquidity, better data granularity, and more direct relevance to BTC perpetuals trading. It was the obvious first choice.
The problem was CORS. Binance blocks cross-origin requests from browser-side JavaScript, which meant every data call had to route through a Netlify serverless function as a proxy. This added latency, occasionally produced rate-limit errors during high-traffic periods, and — most critically — meant the tool silently showed stale data when the function timed out rather than failing visibly. Users would see an apparently live dashboard showing conditions from 10 minutes ago. That's worse than no dashboard.
I moved to Kraken Futures for the funding rate data because their API has permissive CORS headers and consistent uptime. For price, volume, and OHLC data I moved to CoinGecko, whose free tier is slower but reliable and doesn't require authentication.
The trade-off is honest: Kraken + CoinGecko gives less granular data than Binance direct, but gives consistently available data rather than occasionally great data with silent failure modes. For a bias dashboard used to make position-sizing decisions before entering a trade, reliability beats precision.
The second data source change was smaller — the original version used the Binance long/short ratio endpoint as a direct sentiment signal, with no proxying. That endpoint disappeared from Binance's public API without notice in late 2025. The replacement is the price vs 7-day average calculation described in the evidence panel section above. It's a weaker signal, which is why it's in the evidence panel rather than the component scoring.
Why ATR is in a bias dashboard
ATR — Average True Range — measures daily price volatility over the last 14 days. It doesn't measure direction, only magnitude. I included it because bias without volatility context is incomplete information for sizing decisions.
A +2 bias score when ATR is $4,000 per day is a different risk proposition than a +2 score when ATR is $1,200. In the first case, a trade sized correctly for a $1,200 ATR environment is already undersized. In the second, a trade sized for $4,000 volatility is taking far more risk than the environment warrants. The ATR reading tells you which environment you're in before you calculate your position size.
The ATR trend indicator shows whether volatility is expanding, contracting, or stable — comparing the last 7-day average true range against the prior 7. Expanding volatility is a caution signal even in bullish conditions: it means the market is becoming less predictable, and stops need to be wider to avoid being triggered by noise. Contracting volatility into a range often precedes a breakout — either direction.
What this tool cannot do
It cannot tell you where to enter. A bias score of +2 tells you conditions favour longs. It does not tell you that $83,400 is the right level to buy, or that a specific candle pattern is your trigger. The bias dashboard is a conditions filter. Entry is a separate decision that requires your own analysis of price structure.
It lags sudden events. The CoinGecko price data updates every few minutes at the daily interval. The Kraken funding rate updates more frequently but is still a lagging indicator of positioning — it reflects what happened over the last funding period, not what's happening right now. A sudden CPI print or exchange outage will move the market before the dashboard reflects the new conditions.
It measures BTC, not altcoins. Every input is Bitcoin-specific. The bias score says nothing useful about Ethereum or any other asset. Derivatives market structure, funding rates, and VWAP position all differ across assets. Applying a BTC bias reading to an altcoin trade is a category error.
The regime detection can lag transitions. The regime is determined from a 7-day vs 14-day price average comparison. At the early stage of a regime change — when a ranging market begins to trend, or a trend begins to break — the tool will still be using the old regime weights. The component scores may be changing, but the weights won't shift until the averages diverge enough to cross the threshold. During these transition periods, I weight the evidence panel more heavily and the bias score less so.
How to actually use it
My workflow is consistent. I check the bias dashboard before sizing any position — not before finding a setup, but before converting a setup into a position size.
- Read the bias score first. −2 or worse means I'm not looking for longs. A +1 or better means long setups are in play. At 0, I'm flat and patient.
- Check the regime label. If the tool says "ranging," I weight the Price Acceptance component heavily in my interpretation and ignore the momentum readings. If it says "trending up," the Demand and Momentum components are driving the score and I trust them more.
- Check the ATR. This directly sets my stop-loss distance and therefore my position size. I don't skip this step.
- Read the strategy permission table. This translates the bias score into an explicit recommendation for my specific trade type — long swing, long day trade, scalp. The table is the check against wishful thinking.
- Cross-reference with the Signal Aggregator. The BTC Bias score feeds into the Signal Aggregator as one of five indicators. If the aggregator's combined score disagrees with the bias dashboard, I know there's a conflict between the macro structure (EMA200 regime, risk score) and the derivatives picture. That disagreement is itself useful information.
The most common misuse I see: using the evidence panel score instead of the bias score. The evidence panel total can be +3 or +4 even when the bias score is 0 or negative, because the evidence panel is unweighted and unregimed. A raw evidence total means much less than the bias score without the regime adjustment applied. Always use the bias score, not the evidence total, for trading decisions.
Use the Live Tool
The BTC Bias Dashboard is free, requires no sign-up, and updates every 60 seconds from Kraken Futures and CoinGecko.
Open BTC Bias Dashboard →Related Tools & Reading
- BTC Signal Aggregator — the BTC Bias score feeds into this as one of five combined indicators
- How the Signal Aggregator works — how BTC Bias is weighted against the other four components
- Funding Rates Explained — deep dive on the funding rate input used in Leverage Risk
- How to Read Open Interest — background on the OI proxy in the evidence panel
- Trading Calculator — position sizing using the ATR reading from this dashboard