Разработка индикатора дельты объемов
Delta объёмов (Volume Delta) — разность между объёмом агрессивных покупок и агрессивных продаж за период. Positive delta — покупатели доминировали. Negative delta — продавцы агрессивнее. Это один из наиболее информативных индикаторов для понимания реального давления на рынке в отличие от просто объёма (который не различает сторону инициатора).
Принцип расчёта
Определение стороны сделки
Каждый трейд на бирже имеет aggressor side — кто был инициатором (пришёл с рыночным ордером):
def determine_trade_side(trade: dict) -> str:
"""
Binance aggTrade: m=True означает buyer был maker (limit ордер).
Значит seller был aggressor (пришёл с market sell).
"""
if trade['m'] is True:
return 'sell' # агрессивная продажа
else:
return 'buy' # агрессивная покупка
Расчёт delta за период (свечу)
from decimal import Decimal
from collections import defaultdict
class VolumeDeltaCalculator:
def calculate_candle_delta(self, trades: list[dict]) -> CandleDelta:
buy_volume = Decimal(0)
sell_volume = Decimal(0)
for trade in trades:
qty = Decimal(str(trade['q']))
if determine_trade_side(trade) == 'buy':
buy_volume += qty
else:
sell_volume += qty
delta = buy_volume - sell_volume
total = buy_volume + sell_volume
return CandleDelta(
buy_volume=buy_volume,
sell_volume=sell_volume,
delta=delta,
total_volume=total,
delta_percent=float(delta / total * 100) if total > 0 else 0
)
Типы delta индикаторов
Bar Delta
Delta за отдельную свечу. Отображается как гистограмма под price chart:
def calculate_bar_deltas(candles: list) -> list[BarDelta]:
result = []
for candle in candles:
trades = fetch_trades_for_candle(candle)
delta_data = calculator.calculate_candle_delta(trades)
result.append(BarDelta(
time=candle.open_time,
delta=float(delta_data.delta),
delta_percent=delta_data.delta_percent,
color='green' if delta_data.delta > 0 else 'red'
))
return result
Cumulative Delta (CVD)
Накопленная сумма delta с начала дня или выбранного периода:
def calculate_cvd(bar_deltas: list[BarDelta]) -> list[float]:
cvd = []
running = 0
for bar in bar_deltas:
running += bar.delta
cvd.append(running)
return cvd
CVD divergence — ключевой сигнал: цена растёт (новые highs), а CVD падает (продавцы накапливают) → потенциальная смена тренда.
Session Delta
Delta с начала торговой сессии (08:00 UTC для крипто или открытие NYSE для связанных активов). Показывает накопленный баланс сил за сессию.
Реализация как TradingView индикатор
Pine Script реализация
//@version=5
indicator("Volume Delta", overlay=false, format=format.volume)
// Параметры
show_cvd = input.bool(true, "Show CVD")
show_bar_delta = input.bool(true, "Show Bar Delta")
// Расчёт delta через close и volume
// Точный расчёт требует tick data; приближение через направление свечи:
candle_up = close >= open
delta_approx = candle_up ? volume : -volume
// Bar Delta гистограмма
if show_bar_delta
hline(0, color=color.gray, linewidth=1)
barcolor_delta = delta_approx >= 0 ? color.new(color.green, 40) : color.new(color.red, 40)
plot(delta_approx, style=plot.style_columns, color=barcolor_delta, title="Bar Delta")
// CVD линия
cvd = ta.cum(delta_approx)
if show_cvd
plot(cvd, color=color.yellow, linewidth=2, title="CVD")
Важное замечание: Pine Script не имеет доступа к tick data, поэтому приближение через направление свечи неточно. Для точного delta нужен кастомный datasource через TradingView Broker API или собственный индикатор.
Точный delta через собственный datasource
// Custom data series для Lightweight Charts
class DeltaDataProvider {
private tradesCache: Map<string, CandleDelta> = new Map();
async getDeltaForCandle(
symbol: string,
openTime: number,
closeTime: number
): Promise<CandleDelta> {
const cacheKey = `${symbol}_${openTime}`;
if (this.tradesCache.has(cacheKey)) {
return this.tradesCache.get(cacheKey)!;
}
const trades = await this.fetchTrades(symbol, openTime, closeTime);
const delta = this.calculate(trades);
this.tradesCache.set(cacheKey, delta);
return delta;
}
private calculate(trades: Trade[]): CandleDelta {
let buyVol = 0, sellVol = 0;
for (const t of trades) {
if (t.isBuyerMaker) {
sellVol += t.quantity; // seller был агрессором
} else {
buyVol += t.quantity;
}
}
return { buyVol, sellVol, delta: buyVol - sellVol };
}
}
Интерпретация сигналов
| Ситуация | Цена | Delta | Интерпретация |
|---|---|---|---|
| Бычье подтверждение | Растёт | Positive | Покупки поддерживают рост |
| Медвежье подтверждение | Падает | Negative | Продажи давят вниз |
| Бычья дивергенция | Падает | Positive | Скрытые покупки — возможен разворот |
| Медвежья дивергенция | Растёт | Negative | Скрытые продажи — слабость тренда |
| Absorption | Не движется | Extreme | Крупный участник поглощает ордера |
Delta — не standalone индикатор, а инструмент подтверждения. В связке с уровнями поддержки/сопротивления и объёмным профилем даёт значительно более точные сигналы.







