Սկրիպտների օրինակներ
1Սկրիպտների օրինակներ
Ութ պատրաստի սկրիպտ LootScript‑ով՝ շարժական միջիններ, RSI, VWAP՝ գոտիներով, կումուլյատիվ delta՝ տարբերակներով, open interest, funding rate, footprint cluster-ների անհավասարակշռություններ և ստրատեգիա թեստերի համար.
Ութ պատրաստի սկրիպտ LootScript‑ով՝ սկսած շարժական միջիններից և RSI‑ից մինչև կումուլյատիվ delta, open interest, funding rate և footprint cluster-ներ։ Ամեն օրինակ՝ աշխատող Ինդիկատոր, որը կարելի է անմիջապես Ավելացնել գրաֆիկին և կարգավորել։ Բոլոր օրինակները հավաքվում են ընթացիկ վարկածի կոմպիլյատորով առանց սխալների և զգուշացումների.
Ինչպես գործարկել օրինակը
- Սեղմեք ƒ գրաֆիկի վահանակի վրա, Ինդիկատորներ պատուհանում — Խմբագրիչ….
- Խմբագրիչում սեղմեք Նոր (Ctrl+N), փոխարինեք տեմպլեյթը օրինակով և սեղմեք Պահպանել.
- Սեղմեք Ավելացնել գրաֆիկին (Ctrl+Enter).
input.*‑ից պարամետրերը կհայտնվեն Ինդիկատորի կարգավորումների պատուհանում.
1. Երեք շարժական միջիններ՝ տիպի ընտրությամբ
Բыстрая, միջին և медленная նույն տեսակի՝ ընտրությամբ։ Ֆոնը ընդգծվում է, երբ երեքը դասավորված են ըստ թրենդի։
indicator("Три скользящие", shortTitle = "MA×3", overlay = true)
maType = input.string("EMA", "Тип средней", options = ["EMA", "SMA", "WMA", "HMA"])
src = input.source(close, "Источник")
len1 = input.int(20, "Быстрая", minval = 1)
len2 = input.int(50, "Средняя", minval = 1)
len3 = input.int(200, "Медленная", minval = 1)
func ma(s, len) => switch maType {
"SMA" => ta.sma(s, len)
"WMA" => ta.wma(s, len)
"HMA" => ta.hma(s, len)
=> ta.ema(s, len)
}
m1 = ma(src, len1)
m2 = ma(src, len2)
m3 = ma(src, len3)
plot(m1, "Быстрая", color = m1 >= m1[1] ? color.teal : color.red, linewidth = 2)
plot(m2, "Средняя", color = color.orange)
plot(m3, "Медленная", color = color.gray, linewidth = 2)
bgcolor(m1 > m2 and m2 > m3 ? color.new(color.teal, 20) : m1 < m2 and m2 < m3 ? color.new(color.red, 20) : na)Ինչպես աշխատում է
input.string‑ըoptions‑ով վերափոխվում է dropdown ցանկի՝ կարգավորումների մեջ.- Ֆունկցիան
maընտրում է համապատասխան միջինըswitch‑ով.ta.*‑ի վիճակը անկախ է յուրաքանչյուր կանչից, ուստի երեք կանչերն արտադրում են երեք անկախ միջիններ. - Արագ գծի գույնը հաշվարկվում է համեմատությամբ նախորդ բարի (
m1[1]) հետ: աճում է՝ color.teal, նվազում է՝ color.red. - Պանելն կարող է նկարել մինչև երեք
plotգիծ յուրաքանչյուր ինդիկատորի համար, այդ պատճառով չի պահանջվում այլ գործողություն երեք միջինների համար.
2. RSI՝ գոտիներով և ծանուցումներով
RSI՝ երկու մակարդակի միջև լցոնմամբ. գիծը և ֆոնը ներկվում են, երբ RSI‑ը գտնվում է overbought կամ oversold գոտում։
indicator("RSI с зонами", shortTitle = "RSI", overlay = false)
len = input.int(14, "Период", minval = 2)
src = input.source(close, "Источник")
ob = input.float(70, "Перекупленность", minval = 50, maxval = 100)
os = input.float(30, "Перепроданность", minval = 0, maxval = 50)
r = ta.rsi(src, len)
hOb = hline(ob, "Перекупленность", color = color.red)
hOs = hline(os, "Перепроданность", color = color.teal)
fill(hOb, hOs, color = color.new(color.purple, 20))
plot(r, "RSI", color = r > ob ? color.red : r < os ? color.teal : color.purple, linewidth = 2)
bgcolor(r > ob ? color.new(color.red, 35) : r < os ? color.new(color.teal, 35) : na)
alertcondition(ta.crossunder(r, ob), "RSI вышел из перекупленности", "RSI опустился ниже верхнего уровня")
alertcondition(ta.crossover(r, os), "RSI вышел из перепроданности", "RSI поднялся выше нижнего уровня")Ինչպես աշխատում է
hlineվերադարձնում է մակարդակի հենակետը, իսկfill‑ը կատարում է լցոնում երկու հենակետի միջև.- Մակարդակները
input.floatկարգավորումներ են, ուստի գծերն ու լցոնումը շարժվում են դրանց հետ. alertcondition‑ը հայտարարում է երկու ծանուցում. դրանք ինքնաբերաբար չեն զանգում — ինչպես դրանք միացնելը նկարագրված է էջում Ծանուցումներ սկրիպտներից.- Ալֆան
color.new‑ում՝ 0-ից (թափանցիկ) մինչև 255 (ամբողջապես պինդ).
3. VWAP дня с полосами отклонения
Օրվա սկիզբից (00:00 UTC) հաշվարկված VWAP և ±σ լայնությամբ գոտի:
indicator("VWAP дня с полосами", shortTitle = "VWAP", overlay = true)
src = input.source(hlc3, "Цена")
mult = input.float(1.0, "Ширина полосы, σ", minval = 0.1, step = 0.1)
anchor = session.isfirstbar
vw = ta.vwap(src, anchor)
// Сумма объёма и сумма объёма на квадрат цены с начала дня — для разброса вокруг VWAP.
var float sumV = 0.0
var float sumV2 = 0.0
if anchor {
sumV := 0.0
sumV2 := 0.0
}
if not na(volume) and not na(src) {
sumV := sumV + volume
sumV2 := sumV2 + volume * src * src
}
sigma = sumV > 0 and not na(vw) ? math.sqrt(math.max(sumV2 / sumV - vw * vw, 0)) : na
pUp = plot(vw + mult * sigma, "Верх", color = color.new(color.blue, 150))
plot(vw, "VWAP", color = color.blue, linewidth = 2)
pDn = plot(vw - mult * sigma, "Низ", color = color.new(color.blue, 150))
fill(pUp, pDn, color = color.new(color.blue, 25))Ինչպես աշխատում է
ta.vwapսկսում է հաշվել նորից այն բարի վրա, որտեղanchor‑ը ճիշտ է. կրիպտոյումsession.isfirstbar‑ը առաջին բարն է 00:00 UTC‑ից հետո.varփոփոխականները պահվում են բարերի միջով. նույնanchor‑ը դրանք զրոյացնում է, ուստի գոտին հաշվարկվում է նույն ժամանակահատվածի համար, ինչ VWAP‑ը.- Sigma‑ն հաշվարկվում է որպես քառակուսի միջինի արմատը նվազեցված VWAP‑ի քառակուսով.
math.max(…, 0)պաշտպանում է ՛սկսաշրջանկացումից առաջացած փոքր բացասական արժեքներից. - Սենսը կա ինտրադեյ միավորների վրա. Եթե ուզում եք VWAP‑ը երկար ժամանակահատվածից (օրինակ՝ վերջին funding‑ից), տվեք
anchor = funding.settled.
4. Օրեկան կումուլյատիվ delta՝ տարբերակներով
Կումուլյատիվ delta, որը զրոյացվում է ամեն օր, և նշումներ այն բարերի վրա, որտեղ գինը թարմացրել է տեղական экстремումը, իսկ delta‑ն չէ:
indicator("Дневная кумдельта с расхождениями", shortTitle = "CVD", overlay = false)
len = input.int(20, "Окно поиска максимумов", minval = 3)
var float cvd = 0.0
if session.isfirstbar {
cvd := 0.0
}
if delta.available {
cvd := cvd + delta.value
}
cvdLine = delta.available ? cvd : na
// Цена обновила максимум окна, а кумдельта — нет: покупатели не подтверждают рост.
bearish = high >= ta.highest(high, len) and cvdLine < ta.highest(cvdLine, len)
bullish = low <= ta.lowest(low, len) and cvdLine > ta.lowest(cvdLine, len)
plot(cvdLine, "Кумдельта", color = cvdLine >= 0 ? color.teal : color.red, linewidth = 2)
hline(0, "Ноль", color = color.gray)
plotshape(bearish, "Медвежье расхождение", style = shape.triangledown, location = location.top, color = color.red, size = size.tiny)
plotshape(bullish, "Бычье расхождение", style = shape.triangleup, location = location.bottom, color = color.teal, size = size.tiny)Ինչպես աշխատում է
delta.value— ագրեսիվ գնողների և վաճառողների տարբերությունն է մեկ բարի համար. Եթե տվյալները չկան,delta.availableհավասար չէ true, և գիծը ընդհատվում է, ոչ թե նկարում զրո.- Նկարչող
varփոփոխականը զրոյացվում է օրվա սկզբում. Եթե ուզում եք կումուլյատիվ delta ամբողջ պատմության համար առանց զրոյացման՝ օգտագործեք պատրաստի շարքըdelta.cum. - Տարբերակ (divergence): գինը հասնում է պատուհանի максимумին, բայց կումուլյատիվ delta‑ն չի հաստատում այն. Մինիմումների համար՝ հակառակը.
location.topևlocation.bottomտեղադրում են նշանները ենթապենի եզրին, ոչ թե գնի վրա.
5. Open interest‑ի պոռթկումները
Open interest‑ի փոփոխությունը տոկոսով մի բարի մեջ և նշում այնտեղ, որտեղ այն դուրս է գալիս սովորական բաշխման շրջանակից.
indicator("Изменение открытого интереса", shortTitle = "ΔOI %", overlay = false)
len = input.int(50, "Окно для всплесков", minval = 5)
k = input.float(3.0, "Порог всплеска, σ", minval = 0.5, step = 0.5)
pct = oi.available and oi.close[1] > 0 ? 100 * (oi.close - oi.close[1]) / oi.close[1] : na
sd = ta.stdev(pct, len)
spike = not na(sd) and math.abs(pct) > k * sd
plot(pct, "ΔOI, %", style = plot.style_columns, color = pct >= 0 ? color.teal : color.red)
hline(0, "Ноль", color = color.gray)
plotshape(spike, "Всплеск", style = shape.circle, location = location.top, color = color.orange, size = size.tiny)Ինչպես աշխատում է
oi.close— open interest‑ը բարի փակման պահին,oi.close[1]— նախորդ բարի.oi.availableստուգումը կանխում է հաշվարկը բաց տվյալների վրա.- Պոռթկումը (spike) — այն բարերը, որոնց փոփոխության մոդուլն անցնում է
kստանդարտ շեղումներըlenպատուհանում. - Open interest‑ը թարմացվում է հիմնականում րոպեական հաճախականությամբ. Եթե timeframe‑ը փոքր է մեկ րոպե, հարևան բարերը կարող են կրկնել նույն արժեքը, ու փոփոխությունը լինում է զրո — դա տվյալ է, ոչ սխալ.
6. Funding rate
Perpetual ֆյուչերսի funding rate‑ը ցուցադրվում է տոկոսներով մեկ period‑ի համար կամ վերածված տարեկան, նշումներ վճարման պահին և բարձր մակարդակի ընդգծում։
indicator("Ставка финансирования", shortTitle = "Funding", overlay = false)
mode = input.string("За период", "Показывать", options = ["За период", "Годовых"])
thr = input.float(0.05, "Порог, %", minval = 0.0, step = 0.01)
perPeriod = funding.rate * 100
periodsPerYear = funding.interval_hours > 0 ? 24.0 / funding.interval_hours * 365 : na
value = mode == "Годовых" ? perPeriod * periodsPerYear : perPeriod
level = mode == "Годовых" ? thr * periodsPerYear : thr
plot(value, "Ставка, %", style = plot.style_columns, color = value >= 0 ? color.teal : color.red)
hline(0, "Ноль", color = color.gray)
plotshape(funding.settled, "Выплата", style = shape.circle, location = location.bottom, color = color.gray, size = size.tiny)
bgcolor(math.abs(value) > level ? color.new(color.orange, 30) : na)Ինչպես աշխատում է
funding.rate՝ թիվ է՝ ոչ տոկոս: 0.0001 համարժեք է 0.01%. Այդ պատճառով արժեքը բազմապատկվում է 100‑ով.- Տարեկան դարձնելու համար բազմապատկվում է տարինում վճարումների քանակով.
24.0թիվը մատնանշված է դիտավորյալ՝ ամբողջ թվերի բաժանումը լռելյայն կարող է խզել մնացորդը. funding.settledtrue է այն բարի վրա, որի վրա եղավ վճարումը — այնտեղ դնում են մի կետ.- Պорогը հայտարարվում է per‑period, և տարվա համար այն նույն միապատկով վերափոխվում է.
7. Footprint cluster‑ների անհավասարակշռություններ
Գնի վրա նշումներ՝ այնտեղ, որտեղ cluster‑ում կա «ստեպ» տեսքով անհավասարակշռություն կամ պարզապես շատ imbalance‑ներ, նաև POC՝ յուրաքանչյուր բարի համար։
indicator("Дисбалансы кластеров", shortTitle = "Imbalance", overlay = true)
minSteps = input.int(3, "Уровней подряд", minval = 2)
minCount = input.int(5, "Дисбалансов в баре", minval = 1)
levels = cluster.available ? cluster.levels : 0
buys = 0
sells = 0
for i in 0 .. levels {
side = cluster.imbalance(i)
if side == 1 {
buys := buys + 1
} else if side == -1 {
sells := sells + 1
}
}
plot(cluster.poc, "POC", style = plot.style_circles, color = color.orange)
plotshape(cluster.stacked_buy_steps >= minSteps, "Лесенка покупок", style = shape.triangleup, location = location.belowbar, color = color.teal, size = size.small)
plotshape(cluster.stacked_sell_steps >= minSteps, "Лесенка продаж", style = shape.triangledown, location = location.abovebar, color = color.red, size = size.small)
plotshape(buys >= minCount, "Много дисбалансов покупок", style = shape.circle, location = location.belowbar, color = color.new(color.teal, 120), size = size.tiny)
plotshape(sells >= minCount, "Много дисбалансов продаж", style = shape.circle, location = location.abovebar, color = color.new(color.red, 120), size = size.tiny)Ինչպես աշխատում է
cluster.imbalance(i)վերադարձնում է +1, −1 կամ 0 նշագավառի համարi. Imbalance‑ի շեմը վերցված է գրաֆիկի cluster կարգավորումներից, ուստի սկրիպտը տեսնում է նույն բանն, ինչ դուք.cluster.stacked_buy_stepsցույց է տալիս՝ քանի մակարդակ անընդմեջ ունեն գնային անհավասարակշռություններ. Ցիկլըfor i in 0 .. levelsհաշվարկում է բոլոր դիսբալանսները բարի համար, ոչ միայն անընդմեջները.- Սկրիպտը ինքննաբար սաբսկրիբ է cluster‑երին և աշխատում է սովորական մոմ (մոմեր/բարեր) գրաֆիկում. Եթե բորսան չունի տվյալներ կամ timeframe‑ը փոքր է 30 վայրկյանը կամ մեծ է մեկ օրվանից, cluster‑եր չեն լինի — այդ դեպքում
levels= 0 և նշումներ չեն կնկատվեն.
8. Ստրատեգիա: EMA‑երի խաչը՝ stop-loss ATR‑ով
Long մուտք EMA‑երի խաչով, stop-loss և take‑profit՝ ATR‑ի միավորներով, ելք՝ հակառակ խաչով.
strategy("EMA-кросс со стопом по ATR", overlay = true, initialCapital = 10000,
defaultQtyType = strategy.qty.percent_of_equity, defaultQtyValue = 10,
slippageTicks = 2)
fastLen = input.int(12, "Быстрая EMA", minval = 1)
slowLen = input.int(26, "Медленная EMA", minval = 2)
atrLen = input.int(14, "Период ATR", minval = 1)
stopK = input.float(1.5, "Стоп, в ATR", minval = 0.1, step = 0.1)
takeK = input.float(3.0, "Цель, в ATR", minval = 0.1, step = 0.1)
fast = ta.ema(close, fastLen)
slow = ta.ema(close, slowLen)
atr = ta.atr(atrLen)
// ATR запоминается в момент сигнала, чтобы стоп и цель не ползли вслед за волатильностью.
var float riskAtr = na
if ta.crossover(fast, slow) and strategy.position_size == 0 {
riskAtr := atr
strategy.entry("Long", strategy.long)
}
if ta.crossunder(fast, slow) {
strategy.close("Long", comment = "Обратный кросс")
}
if strategy.position_size > 0 {
entry = strategy.position_avg_price
strategy.exit("Стоп/цель", from_entry = "Long", stop = entry - stopK * riskAtr, limit = entry + takeK * riskAtr)
}
plot(fast, "Быстрая", color = color.teal)
plot(slow, "Медленная", color = color.orange)Ինչպես աշխատում է
- Պարամետրերը
strategy(…)մեջ՝ լիտերալներ են՝ սկզբնական կապիտալ 10000, դիրքի չափը՝ 10% կապիտալի, slippage = 2 tick. Կոմիսիան (կոմիսիա) չնշված է, ուստի թեստերը օգտագործում են լռելյայնային թարմացումը՝ 0.02% limit և 0.05% market/stop. Կոմիսիան կարելի է սահմանելcommissionValue‑ով. - Մարկետ ինտրին կատարվում է հաջորդ բարի open‑ի վրա, ոչ թե սիգնալ բարի close‑ի վրա՝ որպեսզի թեստերը չնայեն ապագային.
strategy.exit‑ը տեղադրում է stop‑ը և take‑profit‑ը մուտքի միջին գնի նկատմամբ. Եթե մեկ բարի ընթացքում երկուսն էլ հասանելի են, թեստերը լռելյայն ընդունում են, որ նախը աշխատել է stop‑ը.- Արդյունքները՝ գործարքները և կապիտալի կորուստները (drawdowns) հայտնվում են Ստրատեգիայի թեստեր… պատուհանում Խմբագրիչում. Լրացուցիչ տեղեկություններ՝ էջում Ստրատեգիաներ և թեստեր.
Հաջորդը
https://docs.lootx.trade/hy/loot/examples