Розроблення індикатора дельти обсягів
Delta обсягів (Volume 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 дивергенція — ключовий сигнал: ціна росте (нові highs), а CVD падає (продавці накопичають) → потенціальна зміна тренду.
Session Delta
Delta з початку торгівельної сесії (08:00 UTC для крипто або відкриття NYSE для пов'язаних активів). Показує накопичений баланс сил за сесію.
Реалізація як TradingView індикатор
Pine Script реалізація
//@version=5
indicator("Volume Delta", shorttitle="VD", overlay=false)
// Параметри
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 був aggressor
} else {
buyVol += t.quantity;
}
}
return { buyVol, sellVol, delta: buyVol - sellVol };
}
}
Інтерпретація сигналів
| Ситуація | Ціна | Delta | Інтерпретація |
|---|---|---|---|
| Бичаче підтвердження | Росте | Позитивна | Покупки підтримують ріст |
| Ведмежа підтвердження | Падає | Негативна | Продажи давлять вниз |
| Бичача дивергенція | Падає | Позитивна | Скриті покупки — можливий розворот |
| Ведмежа дивергенція | Росте | Негативна | Скриті продажи — слабість тренду |
| Absorption | Не рухається | Екстремум | Крупний учасник поглинає ордери |
Delta — не standalone індикатор, а інструмент підтвердження. У зв'язці з рівнями підтримки/опору та volume profile дає значно точніші сигнали.







