Շուկայի տվյալները՝ footprint cluster-ներ, delta, open interest, order book
1Շուկայի տվյալները՝ footprint cluster-ներ, delta, open interest, order book
LootScript-ով սկրիպտը մոմերից բացի կարդում է՝ footprint cluster-ներ, delta, open interest, funding rate, սերվերի գրանցած order book-ի պատմությունը, կենդանի order book և time and sales, screener-ի մետրիքները, այլ timeframe և այլ գործիք։
Բացի մոմերից՝ LootScript-ով սկրիպտը կարդում է պատվերի հոսքի տվյալներ՝ footprint cluster-ներ, delta, open interest, funding rate, սերվերի գրանցած order book-ի պատմությունը, կենդանի order book և time and sales, screener-ի մետրիքները։ Մի միավոր միացնել հարկավոր չէ: երբ սկրիպտը դիմում է, օրինակ, cluster.poc, տերմինալը ինքնաբերաբար բաժանորդագրվում է տվյալ գործիքի և գրաֆիկի timeframe-ի clusters-ին — նույնիսկ եթե գրաֆիկը ցույց է տալիս սովորական մոմեր։ Երբ սկրիպտը հանվում է գրաֆիկից, բաժանորդագրությունը ազատվում է։
Այս էջում բացատրված է՝ ինչ կա յուրաքանչյուր namespace-ում, որտեղից են գալիս տվյալները, ո՞ր բորսաներում դրանք հասանելի են և ինչպես վերցնել արժեքը այլ timeframe-ից կամ այլ գործիքից։
Հիմնական կանոնը՝ տվյալ չկա — դա na է, ոչ թե 0
Այս էջի ցանկացած արժեք կարող է լինել na. Դա լինում է, երբ բորսան չի ծածկված տվյալների սերվերով, timeframe-ը չի աջակցվում, պատմությունը դեռ բեռնում է կամ բարն ավելի հին է, քան հասանելի պատմությունը։ Զրոն կնշանակեր՝ «տրադերներ չկան», ինչը ուրիշ հանգամանք է. զրոյով լրացված կուտակված գումարը կարող է թվալ հավաստի, բայց սխալ լինել։
Յուրաքանչյուր տարածքի (namespace) համար կա առկայության ֆլագ — 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)Ինչու տվյալներ չկան՝ ցույց է տալիս գրաֆիկի լեգենդը՝ սկրիպտի անունից մոտ՝ «բորսան չի ընդգրկվել», «timeframe-ը չի աջակցվում», «տվյալները բեռնում են…», «չկա բաց order book», «screener-ը մատչելի չէ»։
Ինչից են գալիս տվյալները
| Пространство | Что это | История на графике |
|---|---|---|
cluster.* |
Footprint cluster-ներ բարի վրա՝ ծավալը ըստ գնի մակարդակների | Ունի, գալիս է cluster սերվերից |
delta.* |
Delta՝ ագրեսիվ գնումների և վաճառքների տարբերությունը | Ունի |
oi.* |
Open interest | Ունի |
funding.* |
Funding rate և դրա հաշվարկները | Ունի |
depth.* |
Սերվերի գրանցած order book, քմածել՝ բարերով | Ունի, սահմանափակ խորությամբ |
book.* |
Կենդանի order book | Միայն վերջին բար |
tape.* |
Կենդանի time and sales (լենտա) | Միայն վերջին բար |
screener.* |
Screener-ի մետրիքները տվյալ գործիքի համար | Միայն վերջին բար |
Կլաստերներ: cluster.*
Բարի յուրաքանչյուր գինային մակարդակի ծավալը՝ բաժանված ագրեսիվ գնումների ու վաճառքների — նույն տվյալներն են, որոնք նկարում է footprint chart. Մարզերը (levels) թվագրված են ներքևից վեր՝ 0-ից մինչև cluster.levels - 1:
| Անուն | Ինչ է վերադարձնում |
|---|---|
cluster.available |
Ցույց է տալիս՝ արդյոք կա cluster այս բարի համար |
cluster.levels |
Բարի գինային մակարդակների քանակը |
cluster.price(i) |
i մակարդակի գինը |
cluster.bid(i) |
Ագրեսիվ գնումներ տվյալ մակարդակում (bid կողմից կատարված գործարքներ) |
cluster.ask(i) |
Ագրեսիվ վաճառքներ տվյալ մակարդակում |
cluster.total |
Բարի ամբողջ ծավալը |
cluster.delta |
Գնումներ մինուս վաճառքներ բոլոր մակարդակների վրա |
cluster.poc, cluster.poc_index |
Գինը և մակարդակի ինդեքսը, որտեղ ամենամեծ ծավալն է (POC) |
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) |
Value area-ի (արժեքի գոտու) ստորին և վերին սահմանները; pct — ծավալի մասնաբաժինը, 0.7 = 70 % |
cluster.grid_step |
Բարի գրաֆիկի գների ցանցի քայլը |
Ուշադրություն՝ cluster.bid(i) նշանակում է այն գնումները, որոնք «նվազեցնում են» ask-ի կողմը (агрессивно сняли аск), ոչ թե order book-ի մեջ գտնվող գնման հայտերը։
Կլաստերները հասանելի են timeframe-ներում՝ սկսած 30 վայրկյանից մինչև 1 օր։
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 — ագրեսիվ գնումների և վաճառքների տարբերությունը մեկ բարում. Ծավալները հաշվարկվում են մոնետաներով (բազային արժույթով):
| Անուն | Ինչ է վերադարձնում |
|---|---|
delta.value |
Բարի դելտա՝ գնումներ մինուս վաճառքներ |
delta.buy, delta.sell |
Դրանց մասերը առանձinsky |
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 սկսվում է զրոյից բեռնված պատմության առաջին բարի վրա, ուստի նրա մակարդակը կախված է բեռնման խորությունից։ Համեմատել պետք է փոփոխությունները, ոչ ամբողջական արժեքները։
Delta-ն հասանելի է timeframe-ներում, սկսած 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)Open interest: oi.*
| Անուն | Ինչ է վերադարձնում |
|---|---|
oi.open, oi.high, oi.low, oi.close |
Open interest բարի մեկավորներով, որոնք հրապարակում է բորսան |
oi.coins |
Open interest մոնետաներով |
oi.usd |
Open interest քվոտայի գումարով |
oi.change |
oi.close-ի փոփոխությունը նախորդ բարի նկատմամբ |
oi.available |
Ցույց է տալիս՝ արդյոք տվյալներ կան այս բարի համար |
Բորսաներում oi.open…oi.close միավորը կարող է տարբեր լինել, այդ պատճառով բորսաներ համեմատելիս օգտագործեք oi.coins կամ oi.usd. Open interest գալիս է րոպեական ցանցով՝ դրա համար second timeframes-ում բոլոր արժեքները կլինեն 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.*
| Անուն | Ինչ է վերադարձնում |
|---|---|
funding.rate |
Հաջորդ հաշշարկման կանխատեսված ставка-ն |
funding.interval_hours |
Ժամերի քանակը հաշվարկների միջև |
funding.settled |
true է բարի համար, երբ հաշշարկումը կատարվել է |
funding.settled_rate |
Քանի է իրականում списано այն բարի համար; եթե մի բարի մեջ եղել է մի քանի հաշվարկ՝ դրանք գումարվում են |
funding.cum |
Բեռնված պատմության ընթացքում հավաքված списанные ставки |
funding.available |
Ցույց է տալիս՝ արդյոք այս ինստրում ունի funding rate |
Ставка նշվում է որպես բաժին, ոչ տոկոս: օրինակ 0.0001 նշանակում է 0.01 %. Գրաֆիկը ցույց է տալիս տոկոսը, լեզուն ոչինչ չի վերածում։ Պայմանների ստուգման համար նախընտրելի է օգտագործել funding.settled_rate-ը, քանի որ funding.rate-ը կանխատեսում է և կարող է փոխվել մինչև հաշվարկը։ Սպոտում funding rate չկա, իսկ second timeframes-ներում արժեքները կլինեն 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)История order book: depth.*
Order book՝ այն տեսքով, ինչպես այն գրանցել է սերվերը — նույն տվյալները, ինչ ցույց է տալիս ջերմաքարտեզը, տարանջատված բարերով։ Պատկերացնում է այն գոտիները (բասկետները), որոնցում գները խմբավորված են՝ և յուրաքանչյուր բասկետի ծավալը բարի ընթացքում։ Վերջին բջիջի ծավալը հաշվարկվում է մոնետաներով։
| Անուն | Ինչ է վերադարձնում |
|---|---|
depth.available |
Ցույց է տալիս՝ արդյոք գրանցված order book կա այս բարի համար |
depth.levels |
Բարի ոչ դատարկ բասկետների քանակը |
depth.price(i) |
i բասկետի ստորին սահմանը՝ աճման կարգով |
depth.qty(i) |
Բարում բասկետում դիտվող առավելագույն ծավալը |
depth.side(i) |
+1 bid-եր, -1 ask-եր, 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) |
Սայրի մեջ ամենագեր բասկետի գինն ու ծավալը |
Նշումներ և սահմանափակումներ:
- Դրանք հասանելի են այնտեղ, որտեղ սերվերի ջերմաքարտեզը աշխատում է, և timeframe-ներում սկսած մի վայրկյանից (
second timeframes)։ - Սերվերը պահում է ուղիղ մոտավորապես ±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)Սերվերի գրանցած order book-ը մոմերի տակ նկարելու համար բավական է մեկ տող՝ heatmap.depth() յուրաքանչյուր սկրիպտում, երբ overlay = true. Գույները և շերտերի պարամետրերը կարելի է փոխել էջում Настройки и отрисовка.
indicator("Записанный стакан теплом", overlay = true)
heatmap.config(palette = heatmap.inferno, low = 25)
heatmap.depth()Կենդանի order book և time and sales: book.* և tape.*
Կենդանի order book- և time and sales-ը ոչ մի տեղ չեն գրանցվում, այդ պատճառով արժեքները հասանելի են միայն վերջին բարում, իսկ պատմության վրա միշտ na. Դրանց համար պետք է բաց վահանակ order book նույն ինստրում, հակառակ դեպքում book.available և tape.available կլինեն սխալական (false), և լեգենդում կհայտնվի «չկա բաց order book». Վերարտադրության (replay) режиме այս տվյալները հասանելի չեն։
| Անուն | Ինչ է վերադարձնում |
|---|---|
book.bid(i), book.ask(i) |
i մակարդակի գինը; 0 նշանակում է ամենալավ գինը |
book.bid_qty(i), book.ask_qty(i) |
Այս մակարդակում եղած ծավալը մոնետաներով |
book.spread |
Լավագույն ask - լավագույն bid |
book.mid |
Լավագույն գների միջինը |
book.imbalance(n) |
Առջևի n մակարդակների անհավասարակշռությունը՝ յուրաքանչյուր կողմի համար՝ -1…+1 |
book.available |
Ցույց է տալիս՝ արդյոք կա snapshot order book |
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 |
Ցույց է տալիս՝ արդյոք time and sales-ն միացված է |
Time and sales պատուհանը և book.imbalance-ի խորությունը задаются կոդում թիվով կամ input.int-ով: պատուհանը հաշվարկվում է վերջին բորսայի գործարքի ժամանակից, ոչ ձեր համակարգչի ժամից։ Սկրիպտը տեսնում է միայն time and sales-ի վերջը՝ մոտավորապես երկու հազար վերջին գործարքները, այնպես որ ակտիվ շուկայում երկար պատուհանը կարող է չցուցադրել ամբողջ ինտերվալը։
Երբ այս արժեքները naudojվում են 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.*
Գրաֆիկի ինստրումը համար screener-ի մետրիքները նույն արժեքներն են, ինչ նրա սյունակներում։ Պատմություն դրա համար չկա; արժեքը գոյություն ունի միայն վերջին բարում։ Պատուհանը (window) задаётся որպես տող (string), և ոչ բոլոր մետրիկաներում կան բոլոր պատուհանները։
| Ֆունկցիա | Ինչ է ցույց տալիս | Տարբեր պատուհաններ |
|---|---|---|
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) |
Հարաբերական ծավալ (RVOL) | "1h" "24h" |
screener.natr(w) |
NATR | "1m" "5m" |
screener.oi_delta(w) |
Open interest-ի փոփոխություն | "1m" "5m" "1h" "24h" |
screener.btc_corr(w) |
Կապունակություն BTC-ի հետ | "1m" "5m" |
screener.available |
Ցույց է տալիս՝ արդյոք ինստրումին տեխնիկապես մատչելի է screener-ը | — |
Տվյալ պատուհանների բացակայությունը վերադարձնում է na. Մետրիկա, որը դուրս է ձեր screener բաժանորդագրությունից, նույնպես վերադարձնում է na. Խմբագրիչը նույն նախազգուշացումը ցույց է տալիս, ինչպես order book-ի դեպքում՝ պատմության վրա շարքը դատարկ է։
indicator("Скринер: RVOL и NATR", overlay = false)
plot(screener.rvol("1h"), "RVOL 1h", color = color.orange)
plot(screener.natr("5m"), "NATR 5m", color = color.teal)Բորսաների ընդգրկում
| Բորսա | Կլաստերներ և delta | Open interest և funding rate |
|---|---|---|
| Binance, Bybit, OKX, Bitget, Gate.io, MEXC, KuCoin, BingX, AsterDEX | Սպոթ և futures | Futures |
| Hyperliquid | Futures; սպոթ — ոչ | Futures |
| Binance Alpha | Ոչ՝ բորսան չի հրապարակում ագրեսոսի կողմը | Ոչ |
| Upbit | Ոչ | Ոչ |
| Տրամադրված տվյալ | Timeframe-ներ |
|---|---|
| Կլաստերներ | 30 վայրկյանից մինչև 1 օր |
| Դելտա | 30 վայրկյանից և բարձր |
| Open interest, funding rate | 1 րոպեից և բարձր |
| Գրանցված order book-ի պատմություն | 1 վայրկյանից և թարմ կլինի այնտեղ, որտեղ սերվերի ջերմաքարտեզը աշխատում է |
| Կենդանի order book, time and sales | Ինչպես ցանկացած timeframe՝ երբ բաց է order book վահանակը |
| Screener | Ընդունվում է ցանկացած timeframe, այն ինստրումը, որը տեսանելի է screener-ին |
Ծածկույթը սահմանում է տվյալների սերվերը և կարող է փոփոխվել։ Ամենավստահելի մոտեցումն է հենվել .available ֆլագին և լեգենդի գրառմանը։
Իրենցից տարբեր timeframe և տարբեր ինստրում
request.security հաշվարկում է արտահայտությունը այլ series-ի վրա — ավագ timeframe կամ այլ մետաղադրամ — և համադրում է արդյունքը գրաֆիկի բարերի հետ.
request.security(symbol, timeframe, expression, gaps = false, lookahead = false, ignore_invalid_symbol = false)- symbol — ձևաչափով «ԲՈՐՍԱ:ԹԻՔԵՐ», ինչպես TradingView-ում: օրինակ՝
"BINANCE:BTCUSDT.P", որտեղ.Pնշանակել է perpetual futures. Ներդրումի սիմվոլը գրաֆիկի համար է՝sym.ticker. - timeframe — տեքստային ձևով՝
"5","60","4h","1D","1W". Գրաֆիկի timeframe-ը՝tf.period. - expression — թիվ կամ մի քանի թվեր փակագծերի մեջ՝ օրինակ
[high, low].
Առանց ապագա տեսնելու. Դեֆոլտով գրաֆիկի բարն տեսնում է ավագ timeframe-ի վերջին փակված բարի արժեքը: այդ պատճառով ժամային EMA-ն 5 րոպեանոցների վրա բարձրանում է միայն ժամը փակելիս. Այսպես պատմության վրա արդյունքը համընկնում է իրական ժամանակում տեսածի հետ։
gaps = true— արժեքը հայտնվում է միայն այն առաջին բարում գրաֆիկի վրա, որտեղ եկավ նոր ավագ բարը, հետո կլինիna։ignore_invalid_symbol = true— անհայտ սիմվոլը վերադարձնում էna. Ինքըհետո չեղած դեպքում սկրիպտը կկործանվի սխալով «Символ … неизвестен»։
Ընդարձակ արտահայտության մեջ հասանելի են մյուս սերիայի մոմերը և դրանց հաշվարկները։ Գրաֆիկի փոփոխականը փոխանցել հնարավոր չէ — միայն input.*-ի արժեքները։ Order book-ը, time and sales-ը և screener-ը ներսում չեն կոմպիլյացվում, իսկ այլ սերիայի cluster-ները, delta, open interest և funding rate-ը կվերադարձնեն na. Սկրիպտը կարող է ունենալ մինչև 8 տարբեր «ինստրում + timeframe» զույգեր և ընդամենը մինչև 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)Дальше
https://docs.lootx.trade/hy/loot/market-data