Ринкові дані: кластери, дельта, OI, біржовий стакан
Що скрипт на LootScript читає крім свічок: кластери, дельта, відкритий інтерес, ставка фінансування, записана і жива історія біржового стакана, стрічка угод, скринер, інший таймфрейм і інструмент.
Окрім свічок, скрипт на LootScript читає дані потоку ордерів: кластери, дельту, відкритий інтерес, ставку фінансування, записану історію біржового стакана, живий біржовий стакан і стрічку угод, метрики скринера. Нічого вмикати не потрібно: щойно скрипт звертається, наприклад, до cluster.poc, термінал сам підписується на кластери інструмента і таймфрейма графіка — навіть якщо графік показує звичайні свічки. Коли скрипт знімають із графіка, підписка звільняється.
На цій сторінці — що є в кожному просторі імен, звідки беруться дані, на яких майданчиках вони доступні і як узяти значення іншого таймфрейма або іншого інструмента.
Головне правило: немає даних — це na, а не 0
Будь‑яке значення з цієї сторінки може виявитися na. Так відбувається, якщо майданчик не покритий сервером, таймфрейм не підтримується, історія ще завантажується або бар старший за доступну історію. Нуль означав би «торгів не було», а це інший факт: накопичена сума з підставленими нулями виглядає правдоподібно й водночас невірна.
У кожного простору є прапорець наявності — cluster.available, delta.available, oi.available тощо. Перевіряйте його або функцією na(x). Порівняння з na через == компілятор не пропустить.
indicator("Накопленная дельта без подмены нулём", overlay = false)
var float cvd = 0.0
if delta.available {
cvd := cvd + delta.value
}
plot(delta.available ? cvd : na, "CVD", color = color.teal)Чому даних немає, підказує легенда графіка поруч із назвою скрипта: «майданчик не покритий», «таймфрейм не підтримується», «дані завантажуються…», «немає відкритого стакана», «скринер недоступний».
Звідки що береться
| Простір | Що це | Історія на графіку |
|---|---|---|
cluster.* |
Кластери (футпринт) бара: об’єм по цінах | Є, з сервера кластерів |
delta.* |
Дельта агресивних покупок і продажів | Є |
oi.* |
Відкритий інтерес | Є |
funding.* |
Ставка фінансування і її розрахунки | Є |
depth.* |
Біржовий стакан, записаний сервером, по барах | Є, обмеженої глибини |
book.* |
Живий біржовий стакан | Лише останній бар |
tape.* |
Жива стрічка угод | Лише останній бар |
screener.* |
Метрики скринера по інструменту | Лише останній бар |
Кластери: cluster.*
Об’єм кожного цінового рівня всередині бару з розподілом на агресивні покупки і продажі — ті самі дані, що малює кластерний графік. Рівні нумеруються знизу вгору, від 0 до cluster.levels - 1.
| Ім’я | Що повертає |
|---|---|
cluster.available |
Чи є кластери на цьому барі |
cluster.levels |
Число цінових рівнів у барі |
cluster.price(i) |
Ціна рівня i |
cluster.bid(i) |
Агресивні покупки на рівні i |
cluster.ask(i) |
Агресивні продажі на рівні i |
cluster.total |
Весь об’єм бару |
cluster.delta |
Покупки мінус продажі по всіх рівнях |
cluster.poc, cluster.poc_index |
Ціна і номер рівня з найбільшим об’ємом |
cluster.max_cell |
Об’єм найважчої клітинки бару |
cluster.imbalance(i) |
Перекіс рівня: +1 покупки, -1 продажі, 0 немає |
cluster.stacked_buy, cluster.stacked_sell |
Ціна, з якої починається найдовша серія рівнів із перекосом |
cluster.stacked_buy_steps, cluster.stacked_sell_steps |
Довжина цієї серії в рівнях |
cluster.value_area(pct) |
Нижня й верхня межі зони вартості; pct — частка об’єму, 0.7 = 70 % |
cluster.grid_step |
Крок цінової сітки бару |
Зверніть увагу на назви: cluster.bid(i) — це покупки, які «зняли» аск, а не заявки на покупку в біржовому стакані.
Кластери є на таймфреймах від 30 секунд до одного дня.
indicator("POC и зона стоимости", overlay = true)
[vaLow, vaHigh] = cluster.value_area(0.7)
plot(cluster.poc, "POC", color = color.orange, style = plot.style_circles)
plot(vaHigh, "Верх зоны", color = color.gray, style = plot.style_linebr)
plot(vaLow, "Низ зоны", color = color.gray, style = plot.style_linebr)Дельта: delta.*
Різниця між агресивними покупками і продажами за бар. Об’єми — в монетах (базовій валюті).
| Ім’я | Що повертає |
|---|---|
delta.value |
Дельта бару: покупки мінус продажі |
delta.buy, delta.sell |
Ці дві частини окремо |
delta.cum |
Накопичена дельта від початку завантаженої історії |
delta.min, delta.max |
Мінімум і максимум бігаючої дельти всередині бару |
delta.open, delta.high, delta.low, delta.close |
Дельта бару у вигляді свічки |
delta.trades |
Число угод у барі |
delta.usd |
Дельта в валюті котирування, за сумами самих угод |
delta.available |
Чи є дельта на цьому барі |
delta.min і delta.max з кластерів не порахувати — це шлях дельти всередині бару, його рахує сервер. За ними видно, що покупці вели бар, а закрили його продавці. delta.usd точніша, ніж delta.value * close: на різкому барі ціна угод сильно відрізняється від ціни закриття.
delta.cum починається з нуля на першому завантаженому барі, тому її рівень залежить від глибини завантаженої історії. Порівнюйте зміни, а не абсолютні значення.
Дельта є на таймфреймах від 30 секунд.
indicator("Дельта и разворот внутри бара", overlay = false)
d = delta.value
reversed = delta.available and d < 0 and delta.max > -d
plot(d, "Дельта", style = plot.style_columns, color = d >= 0 ? color.teal : color.red)
plotshape(reversed, "Разворот", style = shape.xcross, location = location.top, color = color.orange, size = size.tiny)Відкритий інтерес: oi.*
| Ім’я | Що повертає |
|---|---|
oi.open, oi.high, oi.low, oi.close |
Відкритий інтерес за бар у одиницях, які публікує майданчик |
oi.coins |
Відкритий інтерес в монетах |
oi.usd |
Відкритий інтерес у валюті котирування |
oi.change |
Зміна oi.close до попереднього бару |
oi.available |
Чи є дані на цьому барі |
Одиниці oi.open…oi.close у майданчиків різні, тому для порівняння майданчиків беріть oi.coins або oi.usd. Відкритий інтерес надходить з хвилинною сіткою: на секундних таймфреймах всі значення — na.
indicator("Цена и открытый интерес", overlay = false)
dp = ta.change(close)
build = oi.available and dp > 0 and oi.change > 0
plot(oi.change, "Изменение OI", style = plot.style_columns, color = build ? color.teal : color.gray)Ставка фінансування: funding.*
| Ім’я | Що повертає |
|---|---|
funding.rate |
Прогноз ставки на найближчий розрахунок |
funding.interval_hours |
Годин між розрахунками |
funding.settled |
true на барі, де пройшов розрахунок |
funding.settled_rate |
Ставка, реально списана на цьому барі; якщо розрахунків у барі кілька — їх сума |
funding.cum |
Сума списаних ставок за завантажену історію |
funding.available |
Чи є ставка фінансування у інструмента |
Ставка — частка, а не відсотки: 0.0001 — це 0,01 %. Графік показує відсотки, мова нічого не перераховує. Для перевірки гіпотез на історії беріть funding.settled_rate: funding.rate — це прогноз, він змінюється до самого розрахунку. У спота ставки фінансування немає, на секундних таймфреймах значення — na.
indicator("Фандинг за расчёт, %", overlay = false)
plot(funding.rate * 100, "Прогноз ставки", style = plot.style_area, color = funding.rate >= 0 ? color.teal : color.red)
plotshape(funding.settled, "Расчёт", style = shape.circle, location = location.bottom, color = color.orange, size = size.tiny)Історія біржового стакана: depth.*
Біржовий стакан у тому вигляді, в якому його записав сервер, — ті самі дані, що малює теплова карта, — розкладений по барах. На відміну від живого book.*, ці значення є на кожному записаному барі. Ціни згруповані в корзини, об’єм корзини — найбільший за бар, у монетах.
| Ім’я | Що повертає |
|---|---|
depth.available |
Чи записаний стакан для цього бару |
depth.levels |
Число непорожніх корзин у барі |
depth.price(i) |
Нижня межа корзини i, за зростанням |
depth.qty(i) |
Найбільший об’єм, що стояв у корзині за бар |
depth.side(i) |
+1 біди, -1 аски, 0 корзина була по обох боках |
depth.at(price) |
Об’єм у корзині, куди потрапляє ціна |
depth.grid_step |
Розмір корзини в одиницях ціни |
depth.best_bid, depth.best_ask |
Найкращі ціни на кінець бару |
depth.max_cell |
Об’єм найважчої корзини |
depth.bid_sum(pct), depth.ask_sum(pct) |
Об’єм сторони в межах pct % від середини |
depth.imbalance(pct) |
Перекіс у тій же смузі: від -1 до +1 |
depth.max_bid(pct), depth.max_ask(pct) |
Ціна й об’єм найважчої корзини сторони в смузі |
Обмеження:
- Дані є там же, де серверна теплова карта, і на таймфреймах від секунди.
- Сервер зберігає смугу приблизно ±4 % від ціни. Поза нею
depth.atповертаєna, всередині смуги порожня корзина —0. - Глибина історії обмежена: найстаріші бари довгої історії дають
na. - Значення формуючогося бару змінюються, доки надходять дані.
indicator("Перекос записанного стакана", overlay = false)
band = input.float(1.0, "Полоса, % от цены", minval = 0.1, maxval = 4.0, step = 0.1)
imb = depth.imbalance(band)
plot(imb, "Перекос", style = plot.style_columns, color = imb >= 0 ? color.teal : color.red)Щоб намалювати записаний біржовий стакан під свічками, достатньо одного рядка heatmap.depth() в скрипті з overlay = true. Кольори й пороги поля — на сторінці Налаштування і відображення.
indicator("Записанный стакан теплом", overlay = true)
heatmap.config(palette = heatmap.inferno, low = 25)
heatmap.depth()Живий біржовий стакан і стрічка угод: book.* і tape.*
Живий біржовий стакан і стрічку ніхто не записує, тому значення є тільки на останньому барі, а в історії — завжди na. Для них потрібна відкрита панель біржового стакана того ж інструмента: інакше book.available і tape.available хибні, а в легенді — «немає відкритого стакана». У режимі реплея ці дані недоступні.
| Ім’я | Що повертає |
|---|---|
book.bid(i), book.ask(i) |
Ціна рівня i; 0 — найкраща ціна |
book.bid_qty(i), book.ask_qty(i) |
Об’єм на рівні, в монетах |
book.spread |
Найкращий аск мінус найкращий бид |
book.mid |
Середина між найкращими цінами |
book.imbalance(n) |
Перекіс об’єму по n верхнім рівням кожної сторони: від -1 до +1 |
book.available |
Чи є знімок стакана |
tape.last_price, tape.last_qty |
Ціна й об’єм останньої угоди |
tape.last_side |
+1 покупець‑агресор, -1 продавець, 0 — угод ще не було |
tape.count(ms) |
Число угод за останні ms мілісекунд |
tape.buy_volume(ms), tape.sell_volume(ms) |
Об’єм агресивних покупок і продажів за вікно |
tape.max_print(ms) |
Найбільша угода за вікно |
tape.available |
Підключена чи стрічка |
Вікно стрічки і глибину book.imbalance задають числом у коді або налаштуванням input.int. Вікно відлічується від часу останньої угоди на майданчику, а не від годинника комп’ютера. Скрипту доступний лише хвіст стрічки — близько двох тисяч останніх угод, тому на активному ринку довге вікно покаже не весь інтервал.
Коли таке значення потрапляє в plot, редактор попереджає: «Дані є тільки в реальному часі — в історії ряд порожній». Це очікувано: ліворуч від останнього бару ряд порожній. Стратегії ці дані читати не можуть — див. Стратегії і тестер.
indicator("Перекос стакана", overlay = false)
levels = input.int(20, "Уровней с каждой стороны", minval = 1, maxval = 200)
imb = book.available ? book.imbalance(levels) : na
plot(imb, "Перекос", style = plot.style_area, color = imb >= 0 ? color.teal : color.red)
hline(0, "Ноль", color = color.gray)Скринер: screener.*
Метрики скринера для інструмента графіка — ті самі числа, що в його колонках. Історії в них немає: значення є тільки на останньому барі. Вікно задається рядком, і не в кожної метрики є кожне вікно.
| Функція | Що показує | Вікна |
|---|---|---|
screener.change(w) |
Зміна ціни | "1m" "5m" "15m" "1h" "24h" |
screener.vol(w) |
Оборот | "1m" "5m" "15m" "1h" "24h" |
screener.avg_vol(w) |
Середній оборот | "1m" "5m" "15m" "1h" |
screener.rvol(w) |
Відносний об’єм | "1h" "24h" |
screener.natr(w) |
NATR | "1m" "5m" |
screener.oi_delta(w) |
Зміна відкритого інтересу | "1m" "5m" "1h" "24h" |
screener.btc_corr(w) |
Кореляція з BTC | "1m" "5m" |
screener.available |
Чи покритий інструмент скринером | — |
Вікно, якого немає в таблиці, дає na. Метрика, яка не входить у вашу підписку на скринер, — теж na. Редактор помічає вивід цих значень тим самим попередженням, що й у стакана: в історії ряд порожній.
indicator("Скринер: RVOL и NATR", overlay = false)
plot(screener.rvol("1h"), "RVOL 1h", color = color.orange)
plot(screener.natr("5m"), "NATR 5m", color = color.teal)Покриття майданчиків
| Майданчик | Кластери і дельта | Відкритий інтерес і ставка фінансування |
|---|---|---|
| Binance, Bybit, OKX, Bitget, Gate.io, MEXC, KuCoin, BingX, AsterDEX | Спот і ф’ючерси | Ф’ючерси |
| Hyperliquid | Ф’ючерси; спот — ні | Ф’ючерси |
| Binance Alpha | Ні: майданчик не публікує сторону агресора | Ні |
| Upbit | Ні | Ні |
| Дані | Таймфрейми |
|---|---|
| Кластери | Від 30 секунд до 1 дня |
| Дельта | Від 30 секунд |
| Відкритий інтерес, ставка фінансування | Від 1 хвилини |
| Історія біржового стакана | Від 1 секунди, там же, де серверна теплова карта |
| Живий біржовий стакан, стрічка угод | Будь‑які, за умови відкритої панелі біржового стакана |
| Скринер | Будь‑які, для інструментів, які бачить скринер |
Покриття визначає сервер даних, і воно може змінюватися. Надійніше за все опиратися на прапорець .available і підпис у легенді.
Інший таймфрейм і інший інструмент
request.security рахує вираз на іншій серії — старшому таймфреймі або іншій монеті — і зіставляє результат з барами графіка.
request.security(symbol, timeframe, expression, gaps = false, lookahead = false, ignore_invalid_symbol = false)- symbol — у форматі «МАЙДАНЧИК:ТИКЕР», як у TradingView:
"BINANCE:BTCUSDT.P", де.P— безстроковий ф’ючерс. Інструмент графіка —sym.ticker. - timeframe — рядок виду
"5","60","4h","1D","1W". Таймфрейм графіка —tf.period. - expression — число або кілька чисел у квадратних дужках:
[high, low].
Без зазірнення вперед. За замовчуванням бар графіка бачить значення останній закритий бар старшого таймфрейма. Тому годинна EMA на п’ятихвилинках — це сходинка, яка зсувається лише на закритті години. Так результат на історії співпадає з тим, що ви б побачили наживо.
gaps = true— значення лише на першому барі графіка, де з’явився новий старший бар, даліna.ignore_invalid_symbol = true— невідомий символ даєna. Без цього скрипт зупиняється з помилкою «Символ … невідомий».
Всередині виразу доступні свічки іншої серії й розрахунки по них. Передати туди змінну графіка не можна — лише значення налаштувань input.*. Біржовий стакан, стрічка й скринер всередині запиту не компілюються, а кластери, дельта, відкритий інтерес і ставка фінансування іншої серії дають na. У скрипта може бути до 8 різних пар «інструмент + таймфрейм» і до 32 викликів request.security.
indicator("EMA старшего таймфрейма", overlay = true)
len = input.int(20, "Длина EMA", minval = 2, maxval = 500)
tfHigh = input.timeframe("60", "Старший таймфрейм")
emaHigh = request.security(sym.ticker, tfHigh, ta.ema(close, len))
plot(emaHigh, "EMA", color = color.orange, style = plot.style_stepline)indicator("Спред к другой бирже", overlay = false)
other = input.symbol("BYBIT:BTCUSDT.P", "Сравнить с")
px = request.security(other, tf.period, close, ignore_invalid_symbol = true)
plot(close - px, "Разница", color = color.orange)