← К каталогу
Исходный код · ID 3822

Liquidity Trendline With Signals [Gilanns]

liquidity trendline with signals(1).pine

Похожие материалы по тегам

indicator harmonic lab for tradingview.pineTradingView · 2 общих теговsmc+ict+indicators+scalping master.pineTradingView · 2 общих теговtrading view script rsi by secret solution_6266878028173809325.pineTradingView · 2 общих теговsmc & ict & indicators + scalping master(1)_5976621784668052077.pineTradingView · 2 общих теговares_indicator.pineTradingView · 1 общих теговgold_trend_revers.mq5MQL5 / MetaTrader 5 · 1 общих тегов
Вы автор или правообладатель?

Сообщите нам, если считаете, что материал размещён без разрешения.

Краткий обзор

О программе

Основной продукт — индикатор 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 и перейдите к оплате.

Стоимость полного кода
6 165,90₽ ≈ $75.34