Volume Profile System for Crypto Exchanges and Trading Platforms
Introduction: The Hidden Liquidity Problem
Most volume indicators only show activity per candle, hiding where liquidity truly sits. Our Volume Profile (VP) system distributes volume across price levels, revealing key support and resistance zones. This allows traders to build strategies based on real supply and demand areas — not just time-based aggregates.
Problems We Solve
- Lack of precise liquidity analysis: Standard volume doesn't tell you at which price the trading occurred. VP fills this gap, showing exactly where volume is concentrated.
- False signals in range-bound markets: Many indicators generate noise in sideways markets. VP's POC (Point of Control) acts as a natural magnet, reducing false breakouts.
- High latency in real-time aggregation: Our stack (Python/NumPy, ClickHouse, Redis) processes over 100 exchange pairs with 10 million trades daily, maintaining latency under 10 ms.
How We Do It: Technical Deep Dive
Volume Profile Calculation
Volume Profile distributes each candle's volume across price bins. The standard approach uses 200 bins and the 70% rule for Value Area.
The 70% rule originates from Market Profile (TPO method) by Peter Steidlmayer.
def calculate_volume_profile(df, n_bins=200): price_min = df['low'].min() price_max = df['high'].max() bin_size = (price_max - price_min) / n_bins profile = np.zeros(n_bins) for _, row in df.iterrows(): candle_low_bin = int((row['low'] - price_min) / bin_size) candle_high_bin = int((row['high'] - price_min) / bin_size) bins_covered = candle_high_bin - candle_low_bin + 1 vol_per_bin = row['volume'] / bins_covered profile[candle_low_bin:candle_high_bin+1] += vol_per_bin return profile, price_min, bin_size def find_poc_and_va(profile, target_pct=0.7): poc_idx = np.argmax(profile) total_volume = np.sum(profile) target_volume = total_volume * target_pct va_volume = profile[poc_idx] upper, lower = poc_idx, poc_idx while va_volume < target_volume: expand_up = profile[upper + 1] if upper + 1 < len(profile) else 0 expand_down = profile[lower - 1] if lower > 0 else 0 if expand_up >= expand_down: upper += 1 va_volume += expand_up else: lower -= 1 va_volume += expand_down return poc_idx, lower, upper Architecture
- Data: Full tick data or OHLCV. Exchanges: Binance, Coinbase Advanced Trade, Kraken. Storage: ClickHouse.
- Calculation: Python/NumPy. Composite VP over 30 days takes 2–5 seconds.
- Visualization: Horizontal histogram (React + D3.js) or TradingView indicator (Pine Script v5).
- Realtime: Updated per trade, with Redis caching.
Case Study: Composite VP for a Prop Trading Firm
For one client, we implemented Composite VP over 30 days of 1-minute data. The system reduced false signals by 25% and improved entry accuracy by 35% compared to their previous volume-based strategy.
Our Process: From Data to Dashboard
- Data aggregation: Collect tick or OHLCV data from exchange APIs.
- Profile calculation: Implement Session, Composite, Anchored, Visible Range, and Fixed Range VP.
- Visualization: Build web dashboard and TradingView indicator.
- Realtime updates: Add WebSocket feed and caching.
- Testing and validation: Backtest against historical data.
- Deployment and training: Deploy on client infrastructure and train the team.
What's Included
- Data architecture (ticks, aggregation) and VP calculation module
- Ready-made TradingView indicators (Pine Script)
- Web dashboard with charts (React, D3.js)
- REST and WebSocket API for integration with your platform
- Deployment and usage documentation
- Trader and developer training
- 3 months of support and enhancements
Timelines and Cost Estimation
- Basic VP (Session + Composite): from 2 weeks. Cost determined after analysis.
- Full set (all types + realtime + dashboard): 4 to 6 weeks. Cost depends on complexity.
Developing in-house would require hiring a dedicated team; our solution saves up to 30% in costs. Contact us to discuss your project and request a demo with your own data — we'll show how VP can improve your analysis accuracy.
Common Mistakes with Volume Profile
- Using too few bins: Less than 100 bins loses detail; 200–300 is optimal.
- Ignoring tick data: For highly liquid pairs, OHLCV may miss volume distribution within a candle.
- Misinterpreting LVN: Low Volume Nodes are not always breakout points; they indicate where price moves quickly, often requiring confirmation.
| Type | Period | Application |
|---|---|---|
| Session VP | Single session (24h for crypto) | Intraday trading |
| Composite VP | Multiple days/weeks | Medium-term analysis |
| Anchored VP | From event (ATH, hard fork) | Market reaction analysis |
| Visible Range VP | Visible chart range | Dynamic analysis |
| Fixed Range | User-defined interval | Manual customization |
| Data Type | Calculation Speed | Profile Accuracy | API Load |
|---|---|---|---|
| Tick | Slow (seconds per day) | High | High |
| OHLCV 1min | Fast (milliseconds) | Medium | Low |
| OHLCV 5min | Very fast | Low | Minimal |
Contact us to get a consultation and see how Volume Profile fits your trading system.







