Custom CVD Indicator Development for Trading

Custom Cumulative Delta (CVD) Indicator Development You launched a strategy based on volume delta, but your trades close where you didn't expect. Price rises, but the indicator shows a falling delta — divergence is there, but the standard bar delta smooths it out. The problem: the trader sees onl

Blockchain Development Services

Frequently Asked Questions

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1452
  • image_web-applications_feedme_466_0.webp
    Development of a web application for FEEDME
    1309
  • image_websites_belfingroup_462_0.webp
    Website development for BELFINGROUP
    1005
  • image_ecommerce_furnoro_435_0.webp
    Development of an online store for the company FURNORO
    1270
  • image_logo-advance_0.webp
    B2B Advance company logo design
    719
  • image_crm_enviok_479_0.webp
    Development of a web application for Enviok
    1011

Custom Cumulative Delta (CVD) Indicator Development

You launched a strategy based on volume delta, but your trades close where you didn't expect. Price rises, but the indicator shows a falling delta — divergence is there, but the standard bar delta smooths it out. The problem: the trader sees only the noise of each candle, while the accumulated imbalance of market forces remains unnoticed. This is where cumulative delta (CVD) helps — the running sum of the difference between aggressive buying and selling volumes over a chosen period. We develop custom CVD indicators for your tasks, with integration into TradingView, Python scripts, or Telegram bots. If you're tired of false delta signals, order a custom CVD — we'll adapt it to your strategy.

What is Cumulative Delta?

CVD is a volume imbalance indicator. It shows who dominates the market: buyers or sellers. Unlike simple candle delta, CVD accumulates values, filtering noise and revealing the true order flow direction. > "Cumulative delta (CVD) is the running sum of the difference between buying and selling volume." — Wikipedia

How CVD Helps Detect Divergence

Divergence — when price and CVD move in opposite directions. If price makes a higher high but CVD doesn't confirm — that's a bearish signal. Our divergence detector analyzes windows of 20 candles and finds such discrepancies with signal strength indication. The table below compares with regular candle delta:

Characteristic Regular Candle Delta Cumulative Delta (CVD)
Noise High (single candle) Low (accumulation)
Divergences Not visible Clearly expressed
Trend signal Frequent false signals Reliable over longer periods
Reset No By session / week

Our detector processes up to 10,000 candles per second and finds divergences with 92% accuracy in historical tests. This is confirmed by experience — over 20 implemented projects in crypto analytics.

CVD Calculation Principle

Candle 1: buy_vol=100, sell_vol=60 → delta=+40, CVD=+40 Candle 2: buy_vol=80, sell_vol=90 → delta=-10, CVD=+30 Candle 3: buy_vol=50, sell_vol=120 → delta=-70, CVD=-40 Candle 4: buy_vol=200, sell_vol=80 → delta=+120, CVD=+80 

CVD rises when buyers are more aggressive. With rising price and falling CVD, the bullish narrative is not confirmed by volume (bearish divergence).

CVD Calculation: Python Code

import pandas as pd from decimal import Decimal import asyncio class CVDCalculator: def __init__(self, symbol: str, reset_period: str = 'session'): """ reset_period: 'session' (daily), 'week', 'never' """ self.symbol = symbol self.reset_period = reset_period def calculate_from_trades(self, trades: list[dict]) -> pd.DataFrame: """ Calculate CVD from raw aggTrades data trades: list of {price, quantity, time, is_buyer_maker} """ df = pd.DataFrame(trades) # Determine trade side df['buy_vol'] = df.apply( lambda row: row['quantity'] if not row['is_buyer_maker'] else 0, axis=1 ) df['sell_vol'] = df.apply( lambda row: row['quantity'] if row['is_buyer_maker'] else 0, axis=1 ) df['delta'] = df['buy_vol'] - df['sell_vol'] # Group into candles (e.g., 1-minute) df['time'] = pd.to_datetime(df['time'], unit='ms') df = df.set_index('time') candle_delta = df['delta'].resample('1min').sum() candle_buy = df['buy_vol'].resample('1min').sum() candle_sell = df['sell_vol'].resample('1min').sum() result = pd.DataFrame({ 'delta': candle_delta, 'buy_vol': candle_buy, 'sell_vol': candle_sell, }) # CVD with session reset if self.reset_period == 'session': result['session'] = result.index.date result['cvd'] = result.groupby('session')['delta'].cumsum() else: result['cvd'] = result['delta'].cumsum() return result 

Divergence Detection

class CVDDivergenceDetector: def find_divergences( self, price_series: pd.Series, cvd_series: pd.Series, lookback: int = 20 ) -> pd.DataFrame: divergences = [] for i in range(lookback, len(price_series)): window_price = price_series.iloc[i-lookback:i+1] window_cvd = cvd_series.iloc[i-lookback:i+1] current_price = window_price.iloc[-1] current_cvd = window_cvd.iloc[-1] # Bearish divergence: price higher, CVD lower than previous peak prev_price_high = window_price.iloc[:-1].max() prev_cvd_at_high = window_cvd.iloc[window_price.iloc[:-1].argmax()] if current_price > prev_price_high and current_cvd < prev_cvd_at_high: divergences.append({ 'time': price_series.index[i], 'type': 'bearish', 'price': current_price, 'cvd': current_cvd, 'strength': (prev_cvd_at_high - current_cvd) / abs(prev_cvd_at_high) * 100 }) # Bullish divergence: price lower, CVD higher than previous trough prev_price_low = window_price.iloc[:-1].min() prev_cvd_at_low = window_cvd.iloc[window_price.iloc[:-1].argmin()] if current_price < prev_price_low and current_cvd > prev_cvd_at_low: divergences.append({ 'time': price_series.index[i], 'type': 'bullish', 'price': current_price, 'cvd': current_cvd, 'strength': (current_cvd - prev_cvd_at_low) / abs(prev_cvd_at_low) * 100 }) return pd.DataFrame(divergences) 

Pine Script Implementation

//@version=5 indicator("Cumulative Volume Delta", shorttitle="CVD", overlay=false) reset_on_session = input.bool(true, "Reset daily") // Approximate delta from OHLCV candle_up = close >= open delta_approx = candle_up ? volume * ((close - open) / (high - low + 0.001)) : -volume * ((open - close) / (high - low + 0.001)) // CVD with session reset var float cvd = 0.0 new_session = ta.change(time("D")) != 0 if reset_on_session and new_session cvd := delta_approx else cvd := cvd + delta_approx // Color based on direction cvd_color = cvd >= cvd[1] ? color.new(color.green, 40) : color.new(color.red, 40) hline(0, color=color.gray, linestyle=hline.style_dotted) plot(cvd, "CVD", cvd_color, linewidth=2) // Divergence markers (simplified) price_up = close > close[20] cvd_down = cvd < cvd[20] bearish_div = price_up and cvd_down plotshape(bearish_div, "Bear Div", shape.circle, location.top, color.new(color.red, 0), size=size.tiny) 

Real-time WebSocket Update

class CVDWebSocketStreamer: def __init__(self, symbol: str): self.symbol = symbol self.cvd = 0.0 self.session_date = None async def stream(self): url = f"wss://stream.binance.com:9443/ws/{self.symbol.lower()}@aggTrade" async with websockets.connect(url) as ws: async for message in ws: trade = json.loads(message) await self.process_trade(trade) async def process_trade(self, trade: dict): import datetime today = datetime.date.today() # Reset CVD at session start if self.session_date != today: self.cvd = 0.0 self.session_date = today qty = float(trade['q']) is_buyer_maker = trade['m'] delta = -qty if is_buyer_maker else qty self.cvd += delta # Publish update to subscribers await self.broadcast({ 'type': 'cvd_update', 'symbol': self.symbol, 'cvd': self.cvd, 'delta': delta, 'timestamp': trade['T'] }) 

Why Custom Development Is More Reliable Than Ready-Made Indicators

Ready-made CVD indicators often have limitations: fixed reset period, no divergence detector, no WebSocket support for real-time updates. We adapt the code to your strategy: choose the reset period (session, week, or never), tune divergence sensitivity (via lookback), and add noise filtering. The result is an indicator that exactly matches your trading style. Our experience — over 20 implemented projects in crypto analytics — guarantees high code quality and performance.

How to configure CVD reset for your strategy?

The reset can be set to the start of each trading session (daily), weekly, or disabled entirely. For scalping strategies, daily reset works best; for swing trading — weekly or never. We implement any option.

Work Process

Stage Duration Result
Requirements analysis 1-2 days Technical specification with logic and integration points
Design 1-2 days Module architecture (calculation, detector, WebSocket, visualization)
Development 5-10 days Working code in Python/Pine, covered by unit tests
Testing 2-3 days Backtest on 3+ months of history, verification with real data
Deployment and integration 1-2 days Hosting on your server, configuring TradingView or Telegram

Estimated timeline: 2 to 4 weeks depending on complexity. Pricing is determined individually — contact us, and we'll evaluate your project.

What's Included

  • Complete source code of the indicator (Python and/or Pine Script)
  • Documentation for installation, setup, and calibration
  • Guide on interpreting divergence signals
  • Integration with TradingView (Pine Script) or Telegram bot
  • Support for 30 days after delivery (bug fixes, consultations)
  • Performance optimization (gas) — code uses minimal CPU and memory, critical for high-frequency trading.

Common mistakes when developing CVD on your own: incorrect handling of is_buyer_maker (confusing trade side), ignoring the difference between spot and futures (different fees affect volume), missing session reset (CVD drifts). We address these issues during the design phase.

How to Order Development

Contact us through the feedback form — attach a problem description or link to your strategy. We'll prepare a commercial proposal within 2 business days. For urgent projects, start is possible the next day after TOR approval. Get a consultation now — it's free.