Liquidity Trendline With Signals [Gilanns]
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «liquidity trendline with signals(1).pine» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Основной продукт — индикатор TradingView «Liquidity Trendline With Signals [Gilanns]», написанный на Pine Script v5. Он строит линии трендов на основе пивотов высоких и низких цен, используя настраиваемый период отступа, и отображает их на графике с заливкой между параллельными линиями. При пробитии уровней появляются графические маркеры «Breaking Up» и «Breaking Down».
Настройки программы
| Настройка | Описание |
|---|---|
| len | Период пивотов — Период откатов для пивотов |
| cup | Цвет восходящей линии — Цвет для восходящей линии |
| cdn | Цвет нисходящей линии — Цвет для нисходящей линии |
| space | Расстояние отступа — Расстояние отступа для линий |
| shs | Сигналы пробития — Отображать сигналы пробития |
| showBSP | Book Short Profit — Включает отображение Book Short Profit |
| showNWB | Отображение Нади-Уотсона — Включает отображение Нади-Уотсона |
| length | Размер окна NW — Размер окна для Нади-Уотсона |
| nwh | Ширина полосы NW — Ширина полосы для Нади-Уотсона |
| nwmult | Множитель отклонения — Множитель для полос отклонения |
| src | Источник NW — Источник данных для Нади-Уотсона |
| up_col | Цвет восходящего тренда — Цвет восходящего тренда |
| dn_col | Цвет нисходящего тренда — Цвет нисходящего тренда |
| PrimaryTrendline | Основная линия тренда — Включает отображение основной линии тренда |
| SecondaryTrendline | Вторичная линия тренда — Включает отображение вторичной линии тренда |
| htfpivotLength | Длина пивота HTF — Длина пивота для верхнего таймфрейма |
| ltfpivotLength | Длина пивота LTF — Длина пивота для нижнего таймфрейма |
| htfonlyLastLine | Только последняя линия HTF — Отображать только последнюю линию основного тренда |
| ltfonlyLastLine | Только последняя линия LTF — Отображать только последнюю линию вторичного тренда |
| rsi_osc | Отображение RSI — Включает отображение оверлея RSI |
| RSIi_source | Источник RSI — Источник данных для RSI |
| RSIi_length | Длина RSI — Длина периода для расчёта RSI |
| oscPlacement | Расположение RSI — Расположение осциллятора RSI |
| lookbackLength | Длина откатов осциллятора — Длина откатов для отображения осциллятора |
| ADX_osc | Отображение ADX — Включает отображение оверлея ADX |
| ADXi_source | Источник ADX — Источник данных для ADX |
| ADXi_length | Длина ADX — Длина периода для расчёта ADX |
| adxSmoothing | Сглаживание ADX — Сглаживание ADX |
| ADXoscPlacement | Расположение ADX — Расположение отображения |
| ADXlookbackLength | Длина откатов ADX — Длина откатов для отображения индикатора |
| ROpoints | Осциллятор ядерной регрессии — Включает отображение осциллятора ядерной регрессии |
| source | Источник осциллятора — Источник данных для осциллятора |
| bandwidth | Ширина ядра — Длина окна для ядерной регрессии |
| bbwidth | Ширина сигнала — Ширина сглаживания сигнала |
| sdLook | Период стандартного отклонения — Период откатов для стандартного отклонения |
| sdMult | Множитель стандартного отклонения — Множитель стандартного отклонения для границ OB/OS |
| ColMode | Цветовая палитра — Выбор цветовой палитры |
| man | Пользовательская палитра — Включить пользовательскую палитру |
| manUpC | Цвет восходящего (ручной) — Цвет восходящего при ручной палитре |
| manDnC | Цвет нисходящего (ручной) — Цвет нисходящего при ручной палитре |
| bbsig | Сигналы тренда — Отображение сигналов тренда |
| BCol | Раскраска свечей — Включает раскраску свечей |
| devS | Заливка полос отклонения — Включает заливку отклоняющихся полос |
| OBOS | Заливка OB/OS — Включает заливку перекупленности/перепроданности |
| showCB | Коробка консолидации — Отображать коробку консолидации |
| showDSP | Панель направленной силы — Отображать панель направленной силы |
| showFIBLevels | Уровни Фибоначчи — Отображать уровни Фибоначчи |
| input_lookback | Диапазон откатов — Диапазон откатов |
| input_extend | Продление — Направление продления линий |
| input_width | Толщина линий — Толщина линий |
| input_labels | Подписи уровней — Отображение подписей уровней |
| input_offset | Смещение подписей — Смещение подписей вправо |
| input_prices | Цены уровней — Отображение цен уровней |
| input_bullColor | Цвет Bull — Цвет бычьего тренда |
| input_bearColor | Цвет Bear — Цвет медвежьего тренда |
| input_trendline | Линия тренда — Использовать линию тренда |
| input_use236 | Уровень 23.6% — Включить уровень Фибоначчи 23.6% |
| input_236 | Уровень 23.6% — Уровень Фибоначчи 23.6% |
| input_use382 | Уровень 38.2% — Включить уровень Фибоначчи 38.2% |
| input_382 | Уровень 38.2% — Уровень Фибоначчи 38.2% |
| input_use5 | Уровень 50% — Включить уровень Фибоначчи 50% |
| input_5 | Уровень 50% — Уровень Фибоначчи 50% |
| input_use618 | Уровень 61.8% — Включить уровень Фибоначчи 61.8% |
| input_618 | Уровень 61.8% — Уровень Фибоначчи 61.8% |
| input_use786 | Уровень 78.6% — Включить уровень Фибоначчи 78.6% |
| input_786 | Уровень 78.6% — Уровень Фибоначчи 78.6% |
| smaLength | Длина SMA — Длина периода SMA |
| emaLength | Длина EMA — Длина периода EMA |
| slMultiplier | Множитель ATR для SL — Множитель ATR для стоп-лосса |
| tpMultiplier | Множитель ATR для TP — Множитель ATR для тейк-профита |
| slColor | Цвет стоп-лосса — Цвет линии стоп-лосса |
| tpColor | Цвет тейк-профита — Цвет линии тейк-профита |
| entryColor | Цвет линии входа — Цвет линии входа |
| step | Шаги паттернов — Количество шагов для паттернов |
| left | Начальные бары слева — Начальное количество баров слева |
| lPlus | Инкремент L — Инкремент для параметра L |
| perc | Процент R от L — Процент от L для правой стороны |
| minAC | Мин. AB→C — Минимальное соотношение AB к C |
| maxAC | Макс. AB→C — Максимальное соотношение AB к C |
| minBD | Мин. BC→D — Минимальное соотношение BC к D |
| maxBD | Макс. BC→D — Максимальное соотношение BC к D |
| bull | Бычьи паттерны — Шаг бычьих паттернов |
| bear | Медвежьи паттерны — Шаг медвежьих паттернов |
| c_labelBull | Цвет метки Bull — Цвет бычьей метки |
| c_lbTxtBull | Цвет текста Bull — Цвет текста бычьей метки |
| c_linesBull | Цвет линий Bull — Цвет линий бычьих паттернов |
| c_labelBear | Цвет метки Bear — Цвет медвежьей метки |
| c_lbTxtBear | Цвет текста Bear — Цвет текста медвежьей метки |
| c_linesBear | Цвет линий Bear — Цвет линий медвежьих паттернов |
| lookback | Количество баров проверки — Количество баров для проверки |
| htf_tf | Верхний таймфрейм — Верхний таймфрейм |
| up_color | Цвет восходящего тренда — Цвет восходящего тренда |
| down_color | Цвет нисходящего тренда — Цвет нисходящего тренда |
| show_ma | Скользящая средняя — Отображать скользящую среднюю |
| enable_smoothing | Сглаживание СС — Включает сглаживание скользящей средней |
Поиск по коду файла
indicator("Liquidity Trendline With Signals [Gilanns]" ,"GOTrade" , overlay = true , max_lines_count = 500 )
len = input.int (5 , "Period " , tooltip = "Lookback period", inline = "a", group = "SETTINGS")
cup = input.color(#0044ff, "" , "" , inline = "a", group = "SETTINGS")
cdn = input.color(#ff2b00, "" , "" , inline = "a", group = "SETTINGS")
space = input.float(2 , "Padding" , tooltip = "Padding distance", inline = "b", group = "SETTINGS", step = 0.1)
shs = input.bool (true , "Show Breakouts", inline = "z", group = "SETTINGS")
ph = ta.pivothigh(high, len, len)
pl = ta.pivotlow (low , len, len)
type store
float src
int n
type bar
float o = open
float h = high
float l = low
float c = close
int n = bar_index
float v = volume
type draw
line[] upln
line[] dnln
var store[] upbin = array.new<store>()
var store[] dnbin = array.new<store>()
var draw d = draw.new(array.new<line>(), array.new<line>())
bar b = bar.new()
atr = ta.atr(200)
method slope(line ln) =>
x = ln.get_x2() - ln.get_x1()
y = ln.get_y2() - ln.get_y1()
y / x
vol() =>
math.min(atr * 0.1, close * (0.1/100))
var bool broken = false
color active = na
bool plup = false
bool pldn = false
if ph
bool remove = false
var bool valid = false
upbin.unshift(store.new(b.h[len], b.n[len]))
if upbin.size() > 1
current = upbin.get(0)
before = upbin.get(1)
if current.src < before.src
if broken
valid := true
else
valid := false
if upbin.size() > 3
pastold = upbin.get(3)
pastcur = upbin.get(2)
now = upbin.get(1)
late = upbin.get(0)
if now.src < pastcur.src and now.src < pastold.src and late.src < pastcur.src and late.src < pastold.src
valid := true
else
valid := false
else
valid := false
if valid
d.upln.unshift(line.new(x1 = before.n, x2 = current.n, y1 = before.src , y2 = current.src , color = cdn))
d.upln.unshift(line.new(x1 = before.n, x2 = current.n, y1 = before.src - vol() * space, y2 = current.src - vol() * space, color = cdn))
ln = d.upln.get(1)
for i = 0 to (b.n - before.n)
slope = ln.slope()
ln.set_x2(b.n[i])
ln.set_y2(ln.get_y2() - slope)
if low[i] > ln.get_y2()
remove := true
break
if remove
d.upln.get(0).delete()
d.upln.get(1).delete()
d.upln .clear()
upbin .clear()
broken := true
else
d.upln.get(0).delete()
d.upln.get(1).delete()
d.upln .clear ()
d.upln.unshift(line.new(x1 = before.n, x2 = current.n, y1 = before.src , y2 = current.src , color = cdn))
d.upln.unshift(line.new(x1 = before.n, x2 = current.n, y1 = before.src - vol() * space, y2 = current.src - vol() * space, color = cdn))
linefill.new(d.upln.get(0), d.upln.get(1), color = color.new(cdn, 40))
upbin.clear()
broken := false
if d.upln.size() > 1
btm = d.upln.get(0)
top = d.upln.get(1)
if b.l > top.get_y2()
d.upln.clear()
broken := true
upbin.clear()
plup := true
if d.upln.size() > 1
slup = top.slope()
sldn = btm.slope()
top.set_x2(b.n)
top.set_y2(top.get_y2() + slup)
btm.set_x2(b.n)
btm.set_y2(btm.get_y2() + sldn)
if pl
bool remove = false
var bool valid = false
dnbin.unshift(store.new(b.l[len], b.n[len]))
if dnbin.size() > 1
current = dnbin.get(0)
before = dnbin.get(1)
if current.src > before.src
if broken
valid := true
else
valid := false
if dnbin.size() > 3
pastold = dnbin.get(3)
pastcur = dnbin.get(2)
now = dnbin.get(1)
late = dnbin.get(0)
if now.src > pastcur.src and now.src > pastold.src and late.src > pastcur.src and late.src > pastold.src
valid := true
else
valid := false
else
valid := false
if valid
d.dnln.unshift(line.new(x1 = before.n, x2 = current.n, y1 = before.src , y2 = current.src , color = cup))
d.dnln.unshift(line.new(x1 = before.n, x2 = current.n, y1 = before.src + vol() * space, y2 = current.src + vol() * space, color = cup))
ln = d.dnln.get(1)
for i = 0 to (b.n - before.n)
slope = ln.slope()
ln.set_x2(b.n[i])
ln.set_y2(ln.get_y2() - slope)
if high[i] < ln.get_y2()
remove := true
break
if remove
d.dnln.get(0).delete()
d.dnln.get(1).delete()
d.dnln .clear ()
dnbin .clear ()
broken := true
else
d.dnln.get(0).delete()
d.dnln.get(1).delete()
d.dnln .clear ()
d.dnln.unshift(line.new(x1 = before.n, x2 = current.n, y1 = before.src, y2 = current.src, color = cup))
d.dnln.unshift(line.new(x1 = before.n, x2 = current.n, y1 = before.src + vol() * space, y2 = current.src + vol() * space, color = cup))
linefill.new(d.dnln.get(0), d.dnln.get(1), color = color.new(cup, 40))
dnbin.clear()
broken := false
if d.dnln.size() > 1
btm = d.dnln.get(0)
top = d.dnln.get(1)
if b.h < btm.get_y2()
d.dnln.clear()
broken := true
dnbin.clear()
pldn := true
if d.dnln.size() > 1
slup = top.slope()
sldn = btm.slope()
top.set_x2(b.n)
top.set_y2(top.get_y2() + slup)
btm.set_x2(b.n)
btm.set_y2(btm.get_y2() + sldn)
plotshape(pldn and shs ? b.h[1] : na, "Breaking Down", shape.triangledown, location = location.abovebar, color = cdn , offset = -1, size = size.small)
plotshape(plup and shs ? b.l[1] : na, "Breaking Up" , shape.triangleup , location = location.belowbar, color = cup, offset = -1, size = size.small)
startyear = 2020 //input(defval = 2020, title = "Start Year")
startmonth = 1 //input(defval = 1, title = "Start Month")
startday = 1 //input(defval = 1, title = "Start day")
starttime = timestamp(startyear, startmonth, startday, 0, 0, 0)
f_tfInMinutes() =>
_tfInMinutes = (
timeframe.period == '1' ? '3' :
timeframe.period == '3' ? '5' :
timeframe.period == '5' ? '15' :
timeframe.period == '15' ? '30' :
timeframe.period == '30' ? '60' :
timeframe.period == '60' ? '240' : 'D')
my_time = f_tfInMinutes()
autoHTF(str) => str == '1S' ? '1' :
str == '1' ? '5' :
str == '2' ? '5' :
str == '3' ? '15' :
str == '5' ? '15' :
str == '10' ? '15' :
str == '15' ? '60' :
str == '30' ? '60' :
str == '45' ? '120' :
str == '60' ? '120' :
str == '120' ? '240' :
str == '180' ? '240' :
str == '240' ? 'D' :
str == 'D' ? 'W' :
'5W'
gethtf(res, src) =>
gethtfvalue = 0.0
gethtfvalue := request.security(syminfo.tickerid, res, src, gaps=barmerge.gaps_off,lookahead=barmerge.lookahead_on)
period = my_time //input.timeframe(title='Primary TL Period', defval='15', group = GROUP_PIVOT)
period1 = '' //input.timeframe(title='Secondary TL Period', defval='5', group = GROUP_PIVOT)
var dest = 0
var dest_value = 0.0
var origin = 0
var org_value = 0.0
var count = 0
var dest2 = 0
var dest2_value = 0.0
var origin2 = 0
var org2_value = 0.0
var count2 = 0
Multicalc(customperiod) =>
m = 1
s = 1
if customperiod == '1D' or customperiod == 'D'
m := 24
m
if customperiod == '1W' or customperiod == 'W'
m := 24 * 7
m
if customperiod == '1M' or customperiod == 'M'
if month == 1 or month == 3 or month == 5 or month == 7 or month == 8 or month == 10 or month == 12
m := 24 * 7 * 31
m
if month == 2
m := 24 * 7 * 28
m
else
m := 24 * 7 * 30
m
else
if customperiod == '1'
s := 1
m := s / 60
m
if customperiod == '3'
s := 3
m := s / 60
m
if customperiod == '5'
s := 5
m := s / 60
m
if customperiod == '15'
s := 15
m := s / 60
m
if customperiod == '30'
s := 30
m := s / 60
m
if customperiod == '60' or customperiod == ''
s := 60
m := s / 60
m
if customperiod == '120'
s := 120
m := s / 60
m
if customperiod == '180'
s := 180
m := s / 60
m
if customperiod == '240'
s := 240
m := s / 60
m
m
n = 2
x = 0, x1 = 0
if period == ''
x := Multicalc(timeframe.period)
x
else
x := Multicalc(period)
x
z = Multicalc(timeframe.period)
if period1 == ''
x1 := Multicalc(timeframe.period)
x1
else
x1 := Multicalc(period1)
x1
z1 = Multicalc(timeframe.period)
x := math.floor(x / z)
x1 := math.floor(x1 / z1)
i_dateFilter = false //input(false, '═════ Date Range Filtering ═════')
i_fromYear = 2020 //input.int(2020, 'From Year', minval=1900)
i_fromMonth = 1 //input.int(1, 'From Month', minval=1, maxval=12)
i_fromDay = 1 //input.int(1, 'From Day', minval=1, maxval=31)
i_toYear = 2999 //input.int(2999, 'To Year', minval=1900)
i_toMonth = 1 //input.int(1, 'To Month', minval=1, maxval=12)
i_toDay = 1 //input.int(1, 'To Day', minval=1, maxval=31)
fromDate = timestamp(i_fromYear, i_fromMonth, i_fromDay, 00, 00)
toDate = timestamp(i_toYear, i_toMonth, i_toDay, 23, 59)
f_tradeDateIsAllowed() =>
not i_dateFilter or time >= fromDate and time <= toDate
showBSP = input(false, title="Book Short Profit", group = "Book Short Profit")
TD = 0
TD := close > close[4] ? nz(TD[1])+1 : 0
TDUp = TD - ta.valuewhen(TD < TD[1], TD, 1 )
plotshape(showBSP ? TDUp==7?true:na : na,style=shape.triangledown, color=color.red, text="7",textcolor=color.red, location=location.abovebar)
plotshape(showBSP ? TDUp==8?true:na : na,style=shape.triangledown, color=color.red, text="8",textcolor=color.red, location=location.abovebar)
plotshape(showBSP ? TDUp==9?true:na : na,style=shape.triangledown, color=color.red, text="❌",textcolor=color.red, location=location.abovebar)
TS = 0
TS := close < close[4] ? nz(TS[1])+1 : 0
TDDn = TS - ta.valuewhen(TS < TS[1], TS, 1 )
plotshape(showBSP ? TDDn==7?true:na : na,style=shape.triangleup, color=color.green, text="7",textcolor=color.green, location=location.belowbar)
plotshape(showBSP ? TDDn==8?true:na : na,style=shape.triangleup, color=color.green, text="8",textcolor=color.green, location=location.belowbar)
plotshape(showBSP ? TDDn==9?true:na : na,style=shape.triangleup, color=color.green,text="✅",textcolor=color.green, location=location.belowbar)
showNWB = input(false, title="Nadaraya-Watson Envelope", group = "Nadaraya-Watson Envelope")
length = input.float(500,'Window Size',maxval=500,minval=0)
nwh = input.float(45.,'Bandwidth')
nwmult = input.float(3.)
src = input.source(hl2,'Source')
up_col = input.color(#39ff14,'Colors',inline='col')
dn_col = input.color(#ff1100,'',inline='col')
nwn = bar_index
var k = 2
var nwupper = array.new_line(0)
var nwlower = array.new_line(0)
lset(l,x1,y1,x2,y2,col)=>
line.set_xy1(l,x1,y1)
line.set_xy2(l,x2,y2)
line.set_color(l,col)
line.set_width(l,2)
if barstate.isfirst
for i = 0 to length/k-1
array.push(nwupper,line.new(na,na,na,na))
array.push(nwlower,line.new(na,na,na,na))
line nwup = na
line nwdn = na
cross_up = 0.
cross_dn = 0.
if barstate.islast and showNWB
y = array.new_float(0)
sum_e = 0.
for i = 0 to length-1
sum = 0.
sumw = 0.
for j = 0 to length-1
w = math.exp(-(math.pow(i-j,2)/(nwh*nwh*2)))
sum += src[j]*w
sumw += w
y2 = sum/sumw
sum_e += math.abs(src[i] - y2)
array.push(y,y2)
mae = sum_e/length*nwmult
for i = 1 to length-1
y2 = array.get(y,i)
y1 = array.get(y,i-1)
nwup := array.get(nwupper,i/k)
nwdn := array.get(nwlower,i/k)
lset(nwup,nwn-i+1,y1 + mae,nwn-i,y2 + mae,up_col)
lset(nwdn,nwn-i+1,y1 - mae,nwn-i,y2 - mae,dn_col)
if src[i] > y1 + mae and src[i+1] < y1 + mae
label.new(nwn-i,src[i],'▼',color=#00000000,style=label.style_label_down,textcolor=dn_col,textalign=text.align_center)
if src[i] < y1 - mae and src[i+1] > y1 - mae
label.new(nwn-i,src[i],'▲',color=#00000000,style=label.style_label_up,textcolor=up_col,textalign=text.align_center)
cross_up := array.get(y,0) + mae
cross_dn := array.get(y,0) - mae
var string GROUP_PIVOT = "████ Pivot Trendline ████"
PrimaryTrendline = input.bool (false, "Primary TrendLine", group = GROUP_PIVOT)
SecondaryTrendline = input.bool (false, "Secondary TrendLine", group = GROUP_PIVOT)
htfpivotLength = input(21, group = GROUP_PIVOT)
ltfpivotLength = input(21, group = GROUP_PIVOT)
htfleftBars = htfpivotLength * x
htfrightBars = htfpivotLength * x
ltfleftBars = ltfpivotLength //* x1
ltfrightBars = ltfpivotLength //* x1
htfonlyLastLine = input(false, "Show Primary Last TrendLine")
ltfonlyLastLine = input(false, "Show Secondary Last TrendLine")
htfswh = ta.pivothigh(htfleftBars, htfrightBars)
htfswh_cond = not na(htfswh)
htfhprice = 0.0
htfhprice := htfswh_cond ? htfswh : htfhprice[1]
htfhindex = 0
htfhindex := htfswh_cond ? bar_index - htfrightBars : htfhindex[1]
htfswl = ta.pivotlow(htfleftBars, htfrightBars)
htfswl_cond = not na(htfswl)
htflprice = 0.0
htflprice := htfswl_cond ? htfswl : htflprice[1]
htflindex = 0
htflindex := htfswl_cond ? bar_index - htfrightBars : htflindex[1]
ltfswh = ta.pivothigh(ltfleftBars, ltfrightBars)[2]
ltfswh_cond = not na(ltfswh)
ltfhprice = 0.0
ltfhprice := ltfswh_cond ? ltfswh : ltfhprice[1]
ltfhindex = 0
ltfhindex := ltfswh_cond ? bar_index - ltfrightBars : ltfhindex[1]
ltfswl = ta.pivotlow(ltfleftBars, ltfrightBars)[2]
ltfswl_cond = not na(ltfswl)
ltflprice = 0.0
ltflprice := ltfswl_cond ? ltfswl : ltflprice[1]
ltflindex = 0
ltflindex := ltfswl_cond ? bar_index - ltfrightBars : ltflindex[1]
var htflineHigh = PrimaryTrendline ? line.new(0,0,0,0, xloc.bar_time, extend=extend.right) : na
var ltflineHigh = SecondaryTrendline ? line.new(0,0,0,0, xloc.bar_time, extend=extend.right) : na
if htfhindex != htfhindex[1] and PrimaryTrendline
if not htfonlyLastLine
line.delete(htflineHigh)
line.set_color(htflineHigh, color.new(color.red, 50))
line.set_extend(htflineHigh, extend.none)
htflineHigh := line.new(htfhindex[1], htfhprice[1], htfhindex, htfhprice, extend=extend.right, color=color.new(color.red,25), width=4)
if ltfhindex != ltfhindex[1] and SecondaryTrendline
if not ltfonlyLastLine
line.delete(ltflineHigh)
line.set_color(ltflineHigh, color.new(color.red, 50))
line.set_extend(ltflineHigh, extend.none)
ltflineHigh := line.new(ltfhindex[1], ltfhprice[1], ltfhindex, ltfhprice, extend=extend.right, color=color.new(color.white,25), width=2)
var htflineLow = PrimaryTrendline ? line.new(0,0,0,0, xloc.bar_time, extend=extend.right) : na
var ltflineLow = SecondaryTrendline ? line.new(0,0,0,0, xloc.bar_time, extend=extend.right) : na
if htflindex != htflindex[1] and PrimaryTrendline
if not htfonlyLastLine
line.delete(htflineLow)
line.set_color(htflineLow, color.new(color.green, 50))
line.set_extend(htflineLow, extend.none)
htflineLow := line.new(htflindex[1], htflprice[1], htflindex, htflprice, extend=extend.right,color=color.new(color.green,25), width=4)
if ltflindex != ltflindex[1] and SecondaryTrendline
if not ltfonlyLastLine
line.delete(ltflineLow)
line.set_color(ltflineLow, color.new(color.green, 50))
line.set_extend(ltflineLow, extend.none)
ltflineLow := line.new(ltflindex[1], ltflprice[1], ltflindex, ltflprice, extend=extend.right,color=color.new(color.white,25), width=2)
f_getPrice(_osc, _thresh, _cross) =>
avgHigh = math.avg(high, close)
avgLow = math.avg(low , close)
var return_1 = 0.
if _cross == 'over' or _cross == 'both'
if ta.crossover(_osc, _thresh)
return_1 := avgHigh
return_1
if _cross == 'under' or _cross == 'both'
if ta.crossunder(_osc, _thresh)
return_1 := avgLow
return_1
return_1
normalize(_src, _min, _max) =>
var _historicMin = 10e10
var _historicMax = -10e10
_historicMin := math.min(nz(_src, _historicMin), _historicMin)
_historicMax := math.max(nz(_src, _historicMax), _historicMax)
_min + (_max - _min) * (_src - _historicMin) / math.max(_historicMax - _historicMin, 10e-10)
group_rsi_osc = '████ RSI Oscillator Overlay Display Settings ████'
rsi_osc = input.bool(false, 'Enable RSI Overlay Display' , group = group_rsi_osc)
RSIi_source = input.string('Price (close)', 'Source', options=['Price (close)', 'On Balance Volume (OBV)'], inline='RSI', group='RSI Settings')
RSIi_length = input.int(14, ' Length' , minval=1 , inline='RSI' , group='RSI Settings')
RSIi_obThreshold = 70 //input.int(70, 'Overbought', minval=50, maxval=100, inline='Thresh1', group='Threshold Settings')
RSIi_bullZone = 60 //input.int(60, 'Bull Zone' , minval=50, maxval=65 , inline='Thresh1', group='Threshold Settings')
RSIi_bearZone = 40 //input.int(40, 'Bear Zone' , minval=35, maxval=50 , inline='Thresh2', group='Threshold Settings')
RSIi_osThreshold = 30 // input.int(30, ' Oversold' , minval=1 , maxval=50 , inline='Thresh2', group='Threshold Settings')
oscillator = ta.rsi(RSIi_source == 'Price (close)' ? close : ta.obv, RSIi_length)
crossover_overbought = f_getPrice(oscillator, RSIi_obThreshold, 'over' )
crossunder_overbought = f_getPrice(oscillator, RSIi_obThreshold, 'under')
bullZone = f_getPrice(oscillator, RSIi_bullZone , 'both' )
bearZone = f_getPrice(oscillator, RSIi_bearZone , 'both' )
crossover_oversold = f_getPrice(oscillator, RSIi_osThreshold, 'over' )
crossunder_oversold = f_getPrice(oscillator, RSIi_osThreshold, 'under')
oscPlacement = input.string('Bottom', 'Placment', options = ['Top', 'Bottom'], inline='VOL' , group = group_rsi_osc)
oscHight = 11 - input.int(10, ' Hight' , minval = 3, maxval = 10 , inline='VOL' , group = group_rsi_osc)
lookbackLength = input.int(90, 'Overlay Indicator Display Length', minval = 10, maxval = 495, group = group_rsi_osc) // max lines allowed is 500, where 5 of them to be used for zone definitions
var a_lines = array.new_line()
var a_fill = array.new_linefill()
priceHighest = ta.highest(high, lookbackLength)
priceLowest = ta.lowest (low , lookbackLength)
if barstate.islast and rsi_osc and time >= starttime
if array.size(a_lines) > 0
for i = 1 to array.size(a_lines)
line.delete(array.shift(a_lines))
if array.size(a_fill) > 0
for i = 1 to array.size(a_fill)
linefill.delete(array.shift(a_fill))
priceChangeRate = (priceHighest - priceLowest) / priceHighest / oscHight / 100
obLevel = (oscPlacement == 'Top' ? priceHighest : priceLowest) * (1 + (oscPlacement == 'Top' ? RSIi_obThreshold : -1 * (100 - RSIi_obThreshold)) * priceChangeRate)
bullLevel = (oscPlacement == 'Top' ? priceHighest : priceLowest) * (1 + (oscPlacement == 'Top' ? RSIi_bullZone : -1 * (100 - RSIi_bullZone)) * priceChangeRate)
midLevel = (oscPlacement == 'Top' ? priceHighest : priceLowest) * (1 + (oscPlacement == 'Top' ? 50 : -1 * (100 - 50)) * priceChangeRate)
bearLevel = (oscPlacement == 'Top' ? priceHighest : priceLowest) * (1 + (oscPlacement == 'Top' ? RSIi_bearZone : -1 * (100 - RSIi_bearZone)) * priceChangeRate)
osLevel = (oscPlacement == 'Top' ? priceHighest : priceLowest) * (1 + (oscPlacement == 'Top' ? RSIi_osThreshold : -1 * (100 - RSIi_osThreshold)) * priceChangeRate)
array.push(a_lines, line.new(bar_index[lookbackLength], obLevel , bar_index, obLevel , xloc.bar_index, extend.none, color.green, line.style_dotted, 2))
array.push(a_lines, line.new(bar_index[lookbackLength], bullLevel, bar_index, bullLevel, xloc.bar_index, extend.none, color.green, line.style_dotted, 1))
array.push(a_fill, linefill.new(array.get(a_lines, 0), array.get(a_lines, 1), color.new(color.green, 90)))
array.push(a_lines, line.new(bar_index[lookbackLength], bearLevel, bar_index, bearLevel, xloc.bar_index, extend.none, color.red , line.style_dotted, 1))
array.push(a_lines, line.new(bar_index[lookbackLength], osLevel , bar_index, osLevel , xloc.bar_index, extend.none, color.red , line.style_dotted, 2))
array.push(a_fill, linefill.new(array.get(a_lines, 2), array.get(a_lines, 3), color.new(color.red, 90)))
array.push(a_lines, line.new(bar_index[lookbackLength], midLevel , bar_index, midLevel , xloc.bar_index, extend.none, color.gray , line.style_dotted, 1))
for barIndex = 0 to lookbackLength - 1
array.push(a_lines, line.new(bar_index[barIndex] , (oscPlacement == 'Top' ? priceHighest : priceLowest) * (1 + (oscPlacement == 'Top' ? oscillator[barIndex] : -1 * (100 - oscillator[barIndex] ) ) * priceChangeRate ),
bar_index[barIndex + 1], (oscPlacement == 'Top' ? priceHighest : priceLowest) * (1 + (oscPlacement == 'Top' ? oscillator[barIndex + 1] : -1 * (100 - oscillator[barIndex + 1]) ) * priceChangeRate ), xloc.bar_index, extend.none, #7e57c2, line.style_solid, 2))
group_ADX_osc = '████ ADX Oscillator Overlay Display Settings ████'
ADX_osc = input.bool(false, 'Enable ADX Overlay Display' , group = group_ADX_osc)
ADXi_source = input.string('Price (close)', 'Source', options=['Price (close)', 'On Balance Volume (OBV)'], inline='ADX', group='ADX Settings')
ADXi_length = input.int(14, ' Length' , minval=1 , inline='ADX' , group='ADX Settings')
adxSmoothing = input.int(14, title="ADX Smoothing", minval=1, maxval=50 , group='ADX Settings')
ADXi_obThreshold = 70 //input.int(70, 'Overbought', minval=50, maxval=100, inline='Thresh1', group='Threshold Settings')
ADXi_bullZone = 60 //input.int(60, 'Bull Zone' , minval=50, maxval=65 , inline='Thresh1', group='Threshold Settings')
ADXi_bearZone = 40 //input.int(40, 'Bear Zone' , minval=35, maxval=50 , inline='Thresh2', group='Threshold Settings')
ADXi_osThreshold = 30 //input.int(30, ' Oversold' , minval=1 , maxval=50 , inline='Thresh2', group='Threshold Settings')
[diplus, diminus, adxValue] = ta.dmi(ADXi_length, adxSmoothing)
dmiBull = diplus >= diminus and adxValue >= 40
dmiBear = diplus < diminus and adxValue >= 40
dmiWeak = adxValue < 40 and adxValue > 20
dxValue = normalize(adxValue, 0, 100)
oladxValue = adxValue * 1.7
ADXcrossover_overbought = f_getPrice(oladxValue, ADXi_obThreshold, 'over' )
ADXcrossunder_overbought = f_getPrice(oladxValue, ADXi_obThreshold, 'under')
ADXbullZone = f_getPrice(oladxValue, ADXi_bullZone , 'both' )
ADXbearZone = f_getPrice(oladxValue, ADXi_bearZone , 'both' )
ADXcrossover_oversold = f_getPrice(oladxValue, ADXi_osThreshold, 'over' )
ADXcrossunder_oversold = f_getPrice(oladxValue, ADXi_osThreshold, 'under')
ADXoscPlacement = input.string('Top', 'Placment', options = ['Top', 'Bottom'], inline='VOL' , group = group_ADX_osc)
ADXoscHight = 11 - input.int(10, ' Hight' , minval = 3, maxval = 10 , inline='VOL' , group = group_ADX_osc)
ADXlookbackLength = input.int(90, 'Overlay Indicator Display Length', minval = 10, maxval = 495, group = group_ADX_osc) // max lines allowed is 500, where 5 of them to be used for zone definitions
var ADXa_lines = array.new_line()
var ADXa_fill = array.new_linefill()
ADXpriceHighest = ta.highest(high, ADXlookbackLength)
ADXpriceLowest = ta.lowest (low , ADXlookbackLength)
if barstate.islast and ADX_osc and time >= starttime
if array.size(ADXa_lines) > 0
for i = 1 to array.size(ADXa_lines)
line.delete(array.shift(ADXa_lines))
if array.size(ADXa_fill) > 0
for i = 1 to array.size(ADXa_fill)
linefill.delete(array.shift(ADXa_fill))
ADXpriceChangeRate = (ADXpriceHighest - ADXpriceLowest) / ADXpriceHighest / ADXoscHight / 100
ADXobLevel = (ADXoscPlacement == 'Top' ? ADXpriceHighest : ADXpriceLowest) * (1 + (ADXoscPlacement == 'Top' ? ADXi_obThreshold : -1 * (100 - ADXi_obThreshold)) * ADXpriceChangeRate)
ADXbullLevel = (ADXoscPlacement == 'Top' ? ADXpriceHighest : ADXpriceLowest) * (1 + (ADXoscPlacement == 'Top' ? ADXi_bullZone : -1 * (100 - ADXi_bullZone)) * ADXpriceChangeRate)
ADXmidLevel = (ADXoscPlacement == 'Top' ? ADXpriceHighest : ADXpriceLowest) * (1 + (ADXoscPlacement == 'Top' ? 50 : -1 * (100 - 50)) * ADXpriceChangeRate)
ADXbearLevel = (ADXoscPlacement == 'Top' ? ADXpriceHighest : ADXpriceLowest) * (1 + (ADXoscPlacement == 'Top' ? ADXi_bearZone : -1 * (100 - ADXi_bearZone)) * ADXpriceChangeRate)
ADXosLevel = (ADXoscPlacement == 'Top' ? ADXpriceHighest : ADXpriceLowest) * (1 + (ADXoscPlacement == 'Top' ? ADXi_osThreshold : -1 * (100 - ADXi_osThreshold)) * ADXpriceChangeRate)
array.push(ADXa_lines, line.new(bar_index[ADXlookbackLength], ADXobLevel , bar_index, ADXobLevel , xloc.bar_index, extend.none, color.green, line.style_dotted, 2))
array.push(ADXa_lines, line.new(bar_index[ADXlookbackLength], ADXbullLevel, bar_index, ADXbullLevel, xloc.bar_index, extend.none, color.green, line.style_dotted, 1))
array.push(ADXa_fill, linefill.new(array.get(ADXa_lines, 0), array.get(ADXa_lines, 1), color.new(color.green, 90)))
array.push(ADXa_lines, line.new(bar_index[ADXlookbackLength], ADXbearLevel, bar_index, ADXbearLevel, xloc.bar_index, extend.none, color.red , line.style_dotted, 1))
array.push(ADXa_lines, line.new(bar_index[ADXlookbackLength], ADXosLevel , bar_index, ADXosLevel , xloc.bar_index, extend.none, color.red , line.style_dotted, 2))
array.push(ADXa_fill, linefill.new(array.get(ADXa_lines, 2), array.get(ADXa_lines, 3), color.new(color.red, 90)))
array.push(ADXa_lines, line.new(bar_index[ADXlookbackLength], ADXmidLevel , bar_index, ADXmidLevel , xloc.bar_index, extend.none, color.gray , line.style_dotted, 1))
for barIndex = 0 to ADXlookbackLength - 1
array.push(ADXa_lines, line.new(bar_index[barIndex] , (ADXoscPlacement == 'Top' ? ADXpriceHighest : ADXpriceLowest) * (1 + (ADXoscPlacement == 'Top' ? oladxValue[barIndex] : -1 * (100 - oladxValue[barIndex] ) ) * ADXpriceChangeRate ),
bar_index[barIndex + 1], (ADXoscPlacement == 'Top' ? ADXpriceHighest : ADXpriceLowest) * (1 + (ADXoscPlacement == 'Top' ? oladxValue[barIndex + 1] : -1 * (100 - oladxValue[barIndex + 1]) ) * ADXpriceChangeRate ), xloc.bar_index, extend.none, #7e57c2, line.style_solid, 2))
RO_group = "████ Kernel Regression Oscillator ████"
ROpoints = input.bool (true, "Kernel Regression Oscillator", group=RO_group, inline='Switch1')
var string KRS = "KRO OVERLAY - Settings", var string KRU = "KRO OVERLAY - UI"
source = input.source(close, "Source", group = KRS)
bandwidth = input.int (45, "Bandwidth", 1, group = KRS, tooltip = "Length of the Kernel Regression calculation")
bbwidth = input.float (2, "Width", step = 0.2, group = KRS, tooltip = "Smoothes the Signal")
sdLook = input.int (200, "Standard Deviation Lookback", group = KRS, tooltip = "Length of the SD bands lookback period")
sdMult = input.float (3, "Standard Deviation Extreme for OB/OS Border", step = 0.5, group = KRS, tooltip = "Defines the outer border of the SD bands. \nThe inner border begins at 50% of the SD Multiplier")
ColMode = input.string("Modern", "Color Palette Choice", ["Classic", "Modern", "Robust", "Accented", "Monochrome"], group = KRU, inline = "drop")
man = input.bool (true, "Custom Palette", group = KRU, inline = "drop")
manUpC = input.color (color.new(#00ff00,50), "Custom Up", group = KRU, inline = "man")
manDnC = input.color (color.new(#ff0000,50), "Custom Down", group = KRU, inline = "man")
bbsig = input.bool (false, "Show Trend Signals", group = KRU)
BCol = input.bool (true, "Enable Bar Coloring", group = KRU)
devS = input.bool (true, "Enable Deviation Band Shading", group = KRU)
OBOS = input.bool (true, "Enable Overbought/Oversold Shading", group = KRU)
var color UpC = na
var color DnC = na
var color BgC = na
if ColMode == "Classic"
UpC := color.lime
DnC := color.maroon
BgC := color.green
if ColMode == "Modern"
UpC := #5ffae0
DnC := #c22ed0
BgC := #9ef6fb
if ColMode == "Robust"
UpC := #ffbb00
DnC := #770737
BgC := #a23061
if ColMode == "Accented"
UpC := #9618f7
DnC := #ff0078
BgC := #801155
if ColMode == "Monochrome"
UpC := #dee2e6
DnC := #495057
BgC := #212529
[UpCol, DnCol] = switch man
false => [UpC, DnC]
true => [manUpC, manDnC]
kernel(source, bandwidth, kernel_type) =>
switch kernel_type
"Epanechnikov" => math.abs(source) <= 1 ? 0.75 * (1 - math.pow(source, 2)) : 0.0
"Logistic" => 1/math.exp(source + 2 + math.exp(-source))
"Wave" => math.abs(source) <= 0.5 ? (1 - math.abs(source)) * math.cos(math.pi * source) : 0.
kernelRegression(src, bandwidth, kernel_type) =>
sumWeightedY = 0.
sumKernels = 0.
for i = 0 to bandwidth - 1
base = i*i/math.pow(bandwidth, 2)
kernel = kernel(base, 1, kernel_type)
sumWeightedY += kernel * src[i]
sumKernels += kernel
(src - sumWeightedY/sumKernels)/src
waveCalculation(source, bandwidth, bbwidth) =>
sum = 0.0
sumw = 0.0
for i = 0 to bandwidth
val = (i * i) / (bandwidth * bandwidth) / bbwidth
weight = if val <= 0.5
(1 - val) * math.cos(math.pi * val)
else
0.0
sum := sum + source[i] * weight
sumw := sumw + weight
kernel_regression = sum / sumw
kernel_regression
Wave = waveCalculation(source, bandwidth, bbwidth)
Ep = kernelRegression(source, bandwidth, 'Epanechnikov' )
Lo = kernelRegression(source, bandwidth, 'Logistic' )
Wa = kernelRegression(source, bandwidth, 'Wave' )
AV = math.avg(Ep, Lo, Wa) + close
bbMid = ta.sma (AV, sdLook)
arrUp = Wave > Wave[1] and not (Wave[1] > Wave[2])
arrDn = Wave < Wave[1] and not (Wave[1] < Wave[2])
stdv_bands(_src, _length, _mult) =>
float basis = ta.sma (_src, _length)
float dev = ta.stdev(_src, _length) * _mult
[basis, basis + dev, basis - dev]
[_, u1, l1] = stdv_bands(AV, sdLook, sdMult/2)
[_, u2, l2] = stdv_bands(AV, sdLook, sdMult)
HL2 = plot(ROpoints ? hl2 : na, color = color(na))
wave = plot(ROpoints ? Wave : na, "???????????????????????? ????????????????", BCol ? color(na) : Wave > Wave[1] ? UpCol : DnCol, 3)
fill(wave, HL2, Wave, hl2, BCol ? color.new(Wave > Wave[1] ? UpCol : DnCol, 50) : na, color.new(chart.bg_color, 75))
plotshape(true, style=shape.square, location=location.bottom, size=size.tiny, color=Wave > Wave[1] ? color.rgb(0, 255, 0, 20) : Wave < Wave[1] ? color.rgb(255, 0, 0, 20) : color.rgb(0, 0, 0, 90))
haClose = (open + high + low + close) / 4
haOpen = float(na)
haOpen := na(haOpen[1]) ? (open + close) / 2 : (nz(haOpen[1]) + nz(haClose[1])) / 2
haHigh = math.max(high, math.max(haOpen, haClose))
haLow = math.min(low, math.min(haOpen, haClose))
pptimeframe = my_time //input.timeframe(defval = '240', title = "Time Frame", group = "Setup")
leftBars = 2 //input.int(defval = 2, title = "Left Bars", minval = 1, group = "Setup")
rightBars = 2 //input.int(defval = 2, title = "Right Bars", minval = 1, group = "Setup")
pivotsBack = 1 //input.int(defval = 1, title = "Pivots Back (High/Low)", minval = 1, group = "Setup")
extendBoxLeft = 6 //input.int(defval = 6, title = "Extend Box", minval = 3, maxval = 100, group = "Setup")
showCB = input.bool(defval = false, title = "Show Consolidation Box", group = "Setup")
showMid = showCB //input.bool(defval = true, title = "Show Box Mid", group = "Setup")
showPivots = false //input.bool(defval = false, title = "Show Pivots", group = "Setup")
showTfLabel = showCB //input.bool(defval = true, title = "Show Labels", group = "Setup")
boxlinestyle = "Solid" //input.string(defval = "Solid", title = "Border Style/Width", options = ["Solid", "Dotted", "Dashed"], inline = "boxbs", group = "Consolidation Box")
boxlinewidth = 1 //input.int(defval = 1, title = "", minval = 1, maxval = 10, inline = "boxbs", group = "Consolidation Box")
boxmidlinestyle = "Dashed" //input.string(defval = "Dashed", title = "Mid Style/Width", options = ["Solid", "Dotted", "Dashed"], inline = "boxmidbs", group = "Consolidation Box")
boxmidlinewidth = 1 //input.int(defval = 1, title = "", minval = 1, maxval = 10, inline = "boxmidbs", group = "Consolidation Box")
boxtheme = 'Three' //input.string(defval = "One", title = "Colors", options = ["One", "Three", "Five"], inline = "self", group = "Consolidation Box")
boxbreakupcol = color.lime //input.color(defval = color.lime, title = "Break Up Color/Fill", inline = "bcup", group = "Consolidation Box")
boxfillbreakupcol = color.new(color.lime, 95) //input.color(defval = color.new(color.lime, 95), title = "", inline = "bcup", group = "Consolidation Box")
boxmidupcol = color.teal //input.color(defval = color.teal, title = "Mid Up Color/Fill", inline = "bcmup", group = "Consolidation Box")
boxfillmidupcol = color.new(color.teal, 95) //input.color(defval = color.new(color.teal, 95), title = "", inline = "bcmup", group = "Consolidation Box")
boxcol = color.silver //input.color(defval = color.silver, title = "Neutral Color/Fill", inline = "bcn", group = "Consolidation Box")
boxfillcol = color.new(color.silver, 95) //input.color(defval = color.new(color.silver, 95), title = "", inline = "bcn", group = "Consolidation Box")
boxmiddncol = color.maroon //input.color(defval = color.maroon, title = "Mid Down Color/Fill", inline = "bcmdn", group = "Consolidation Box")
boxfillmiddncol = color.new(color.maroon, 95) //input.color(defval = color.new(color.maroon, 95), title = "", inline = "bcmdn", group = "Consolidation Box")
boxbreakdncol = color.red //input.color(defval = color.red, title = "Break Down Color/Fill", inline = "bcdn", group = "Consolidation Box")
boxfillbreakdncol = color.new(color.red, 95) //input.color(defval = color.new(color.red, 95), title = "", inline = "bcdn", group = "Consolidation Box")
phlinecol = color.blue //input.color(defval = color.blue, title = "Pivot High/Low Line Colors", inline = "lc", group = "Pivot Points")
pllinecol = color.red //input.color(defval = color.red, title = "", inline = "lc", group = "Pivot Points")
phbgcol = color.new(#131722, 20) //input.color(defval = color.new(#131722, 20), title = "Pivot High BG/Text Colors", inline = "ph", group = "Pivot Points")
phtextcol = color.blue //input.color(defval = color.blue, title = "", inline = "ph", group = "Pivot Points")
plbgcol = color.new(#131722, 20) //input.color(defval = color.new(#131722, 20), title = "Pivot Low BG/Text Colors", inline = "pl", group = "Pivot Points")
pltextcol = color.red //input.color(defval = color.red, title = "", inline = "pl", group = "Pivot Points")
textSizeLabel = "Normal" //input.string("Normal", title = "Label Size", options = ["Normal", "Small", "Tiny"], group = "Labels")
type PPData
int ppStart
float ppVal
f_resInMinutes() =>
_resInMinutes = timeframe.multiplier * (
timeframe.isseconds ? 1. / 60 :
timeframe.isminutes ? 1. :
timeframe.isdaily ? 60. * 24 :
timeframe.isweekly ? 60. * 24 * 7 :
timeframe.ismonthly ? 60. * 24 * 30.4375 : na)
f_timeFrom(_from, _qty, _units, _in = time) =>
int _timeFrom = na
_unit = str.replace_all(_units, "s", "")
_t = switch _from
"bar" => time
"close" => time_close
"now" => timenow
"base" => _in
if _units == "chart"
_timeFrom := int(_t + (f_resInMinutes() * 60 * 1000 * _qty))
else
_year = year(_t) + (_unit == "year" ? int(_qty) : 0)
_month = month(_t) + (_unit == "month" ? int(_qty) : 0)
_day = dayofmonth(_t) + (_unit == "day" ? int(_qty) : 0)
_hour = hour(_t) + (_unit == "hour" ? int(_qty) : 0)
_minute = minute(_t) + (_unit == "minute" ? int(_qty) : 0)
_second = second(_t) + (_unit == "econd" ? int(_qty) : 0)
_timeFrom := timestamp(_year, _month, _day, _hour, _minute, _second)
f_timeFrameStr(_tf) =>
tfstr = switch _tf
"1" => "1m"
"2" => "2m"
"3" => "3m"
"4" => "4m"
"5" => "5m"
"6" => "6m"
"7" => "7m"
"8" => "8m"
"9" => "9m"
"10" => "10m"
"11" => "11m"
"12" => "12m"
"13" => "13m"
"14" => "14m"
"15" => "15m"
"16" => "16m"
"17" => "17m"
"18" => "18m"
"19" => "19m"
"20" => "20m"
"21" => "21m"
"22" => "22m"
"23" => "23m"
"24" => "24m"
"25" => "25m"
"26" => "26m"
"27" => "27m"
"28" => "28m"
"29" => "29m"
"30" => "30m"
"31" => "31m"
"32" => "32m"
"33" => "33m"
"34" => "34m"
"35" => "35m"
"36" => "36m"
"37" => "37m"
"38" => "38m"
"39" => "39m"
"40" => "40m"
"41" => "41m"
"42" => "42m"
"43" => "43m"
"44" => "44m"
"45" => "45m"
"46" => "46m"
"47" => "47m"
"48" => "48m"
"49" => "49m"
"50" => "50m"
Показано первые 50% кода (символов: 61659)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.