What Is Bitcoin Dominance and How Trading Bots Use It as a Signal
Bitcoin dominance measures BTC's share of total crypto market cap. Learn how automated trading bots use BTC dominance shifts to predict altcoin seasons and rotate between assets.
Builder of AI agents, crypto trading bots, and open-source automation tools. Sharing practical guides on how to build, deploy, and profit from AI and DeFi technology.
What Is Bitcoin Dominance?
Bitcoin Dominance (BTC.D) is the percentage of total cryptocurrency market capitalization held by Bitcoin. If the total crypto market is worth $3 trillion and Bitcoin is worth $1.5 trillion, BTC dominance is 50%.
This metric is one of the most powerful macro signals in crypto โ and it's surprisingly underused by automated trading systems.
Why BTC Dominance Matters for Bots
BTC dominance follows predictable patterns across market cycles:
Falling BTC dominance โ Altcoins are outperforming BTC โ "Altcoin Season" Rising BTC dominance โ Money flowing from alts into BTC โ "Bitcoin Season" or risk-off
A simple rotation strategy:
- BTC.D falling + trending down โ Rotate capital from BTC into quality altcoins (ETH, SOL, BNB)
- BTC.D rising + trending up โ Rotate from alts back to BTC or stablecoins
Fetching BTC Dominance Data
import requests
import pandas as pd
from datetime import datetime
def get_btc_dominance_history(days: int = 365) -> pd.DataFrame:
"""Fetch historical BTC dominance from CoinGecko"""
url = "https://api.coingecko.com/api/v3/global/market_cap_chart"
params = {'vs_currency': 'usd', 'days': days}
response = requests.get(url, params=params).json()
# Calculate daily BTC dominance
btc_caps = response.get('market_cap', [])
# CoinGecko doesn't directly give dominance history, so we use the global endpoint
# For dominance, use CoinGecko's dedicated endpoint
dom_url = "https://api.coingecko.com/api/v3/global"
global_data = requests.get(dom_url).json()['data']
current_dominance = global_data['market_cap_percentage']['btc']
print(f"Current BTC Dominance: {current_dominance:.1f}%")
return current_dominance
def get_altcoin_season_index() -> int:
"""
Altcoin Season Index from blockchaincenter.net
>75 = Altcoin Season, <25 = Bitcoin Season
"""
response = requests.get(
"https://www.blockchaincenter.net/altcoin-season-index/"
)
# Parse the index value (simplified)
# In practice, scrape or use their API
return 65 # Example value
Building a BTC Dominance Signal Engine
import numpy as np
import pandas as pd
class BTCDominanceSignalEngine:
"""Generate trading signals based on BTC dominance trends"""
def __init__(self):
self.history = [] # Historical dominance readings
def update(self, dominance: float):
"""Add new dominance reading"""
self.history.append({
'timestamp': datetime.now().isoformat(),
'value': dominance
})
# Keep last 90 days
if len(self.history) > 90:
self.history.pop(0)
def calculate_trend(self, window: int = 14) -> str:
"""Calculate short-term dominance trend"""
if len(self.history) < window:
return 'neutral'
values = [h['value'] for h in self.history[-window:]]
recent_avg = np.mean(values[-7:])
older_avg = np.mean(values[:7])
change = (recent_avg - older_avg) / older_avg
if change < -0.02: # Dominance falling 2%+
return 'altcoin_season'
elif change > 0.02: # Dominance rising 2%+
return 'bitcoin_season'
else:
return 'neutral'
def get_rotation_signal(self, current_dominance: float) -> dict:
"""
Generate rotation recommendations based on dominance
"""
trend = self.calculate_trend()
# Historical ranges: below 40% = strong alt season, above 65% = btc season
if current_dominance < 40 and trend == 'altcoin_season':
return {
'signal': 'ROTATE_TO_ALTS',
'confidence': 'high',
'recommended_alts': ['ETH', 'SOL', 'BNB', 'AVAX'],
'btc_allocation': 0.20,
'alt_allocation': 0.60,
'stable_allocation': 0.20,
'reasoning': f'BTC dominance at {current_dominance:.1f}% and falling โ altseason active'
}
elif current_dominance > 60 and trend == 'bitcoin_season':
return {
'signal': 'ROTATE_TO_BTC',
'confidence': 'high',
'btc_allocation': 0.70,
'alt_allocation': 0.10,
'stable_allocation': 0.20,
'reasoning': f'BTC dominance at {current_dominance:.1f}% and rising โ BTC season'
}
elif current_dominance > 55 and trend == 'altcoin_season':
return {
'signal': 'STARTING_ALT_ROTATION',
'confidence': 'medium',
'btc_allocation': 0.40,
'alt_allocation': 0.40,
'stable_allocation': 0.20,
'reasoning': 'Dominance high but trend shifting โ early alt rotation'
}
else:
return {
'signal': 'HOLD',
'confidence': 'low',
'reasoning': f'No clear regime โ BTC.D at {current_dominance:.1f}%'
}
Combining BTC Dominance with Other Macro Signals
class MacroRotationBot:
"""Portfolio rotation bot using multiple macro signals"""
def __init__(self, exchange):
self.exchange = exchange
self.dominance_engine = BTCDominanceSignalEngine()
def get_macro_score(self) -> dict:
"""Composite macro signal from multiple indicators"""
# 1. BTC Dominance
dominance = get_btc_dominance()
dom_signal = self.dominance_engine.get_rotation_signal(dominance)
# 2. Fear & Greed Index (0-100, extreme fear = 0, extreme greed = 100)
fear_greed = get_fear_greed_index()
# 3. Bitcoin price vs 200-day MA
btc_vs_200ma = get_btc_vs_200ma()
# 4. Altcoin season index
alt_season_index = get_altcoin_season_index()
# Composite score
composite_signals = {
'btc_dominance': dom_signal['signal'],
'fear_greed': 'bullish' if fear_greed > 50 else 'bearish',
'btc_trend': 'bullish' if btc_vs_200ma > 1.0 else 'bearish',
'alt_season': 'altseason' if alt_season_index > 60 else 'btcseason',
}
return composite_signals
async def rebalance_portfolio(self):
"""Rebalance based on macro signals"""
signals = self.get_macro_score()
# Count bullish vs bearish signals
bullish_count = sum(1 for s in signals.values()
if 'bullish' in s or 'alt' in s)
total = len(signals)
bull_pct = bullish_count / total
if bull_pct >= 0.75:
target_allocation = {'BTC': 0.25, 'ETH': 0.30, 'SOL': 0.20, 'USDT': 0.25}
elif bull_pct <= 0.25:
target_allocation = {'BTC': 0.50, 'ETH': 0.10, 'SOL': 0.05, 'USDT': 0.35}
else:
target_allocation = {'BTC': 0.40, 'ETH': 0.20, 'SOL': 0.10, 'USDT': 0.30}
await self.execute_rebalance(target_allocation)
print(f"Rebalanced: {bull_pct:.0%} bullish signals โ {target_allocation}")
Backtesting the Dominance Strategy
Historical backtests show that a simple BTC dominance rotation strategy:
- Outperforms buy-and-hold BTC during altcoin seasons by 30-50%
- Reduces drawdown during bear markets by rotating to stablecoins
- Works best with a 2-4 week rebalancing frequency (not too reactive)
The most important lesson: BTC dominance is a macro signal, not a day-trading signal. Rebalancing quarterly based on dominance trends outperforms trying to trade every dominance tick.
Tagged in
Related Articles
Crypto Bot Risk Management: The 10 Rules That Separate Winners From Losers
7 min read
Crypto BotsHow to Build a Self-Healing Trading Bot That Fixes Its Own Errors
5 min read
Crypto BotsPump.fun and Solana Meme Coin Bots: How to Automate the Hottest Trend
5 min read
Crypto BotsHow to Build a Crypto Portfolio Auto-Rebalancing Bot
5 min read