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

PRO V6

pro v6.pine

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

!!!-mt4 x-xardg-rsi.mq5MQL5 / MetaTrader 5 · 2 общих тегов!!! rsi ma simple+arrows 1.2 (mtf).mq5MQL5 / MetaTrader 5 · 2 общих теговea robofibo source v.11.2.mq4MQL4 / MetaTrader 4 · 2 общих теговsureforexhedingvonepointoneone.mq4MQL4 / MetaTrader 4 · 2 общих теговsureforexhedging 1.10 optimized.mq4MQL4 / MetaTrader 4 · 2 общих теговsureforexhedging 1.09 a (2).mq4MQL4 / MetaTrader 4 · 2 общих тегов
Вы автор или правообладатель?

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

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

О программе

PRO V6 — это индикатор для TradingView, написанный на Pine Script v5. Он отображается поверх графика и объединяет несколько независимых аналитических блоков: построение трендовых линий по свинговым максимумам и минимумам, сигнальную систему на основе волатильности, блок следования за трендом, оценку вероятностей роста и падения по трём горизонтам, а также две информационные панели с данными по нескольким таймфреймам. Индикатор не является торговым советником и не выполняет сделки — это инструмент визуального анализа.

Основу визуализации составляет функция draw(), которая по подтверждённым свинговым точкам строит и обновляет линии тренда для трёх настраиваемых длин (Long, Medium, Short). Линии отображаются разными стилями, а при пробое отмечаются специальными точками. Дополнительно индикатор может окрашивать бары и фон графика в зависимости от положения цены относительно построенных линий.

Сигнальный блок рассчитывает линию сигнала на основе ATR и заданной чувствительности, формируя сигналы пересечения цены с этой линией. Блок следования за трендом использует данные того же инструмента на текущем таймфрейме и позволяет включать отображение зон входа. Таблица вероятностей показывает долю бычьих и медвежьих баров за три периода (Short, Medium, Long), а панели выводят состояние тренда, значения EMA и индикатор давления по пяти выбранным таймфреймам.

Индикатор поддерживает оповещения TradingView: настроены условия смены тренда, начала восходящего, нисходящего и нейтрального тренда, а также события выравнивания нескольких таймфреймов. Все параметры задаются через пользовательские настройки, включая периоды, цвета, пороги RSI и элементы панелей. Индикатор не даёт гарантий прибыли и не содержит встроенного бэктеста.

Настройки программы

НастройкаОписание
res Период — Задаёт таймфрейм для расчёта трендовых линий.
i1 Длинная линия — Включает или выключает отображение длинной трендовой линии.
i2 Средняя линия — Включает или выключает отображение средней трендовой линии.
i3 Короткая линия — Включает или выключает отображение короткой трендовой линии.
l1 Длинная — Задаёт длину для длинной трендовой линии.
l2 Средняя — Задаёт длину для средней трендовой линии.
l3 Короткая — Задаёт длину для короткой трендовой линии.
cBull Цвет бычьей линии — Цвет бычьей трендовой линии.
cBear Цвет медвежьей линии — Цвет медвежьей трендовой линии.
cWickBull Цвет бычьей точки — Цвет точки бычьего пробоя.
cWickBear Цвет медвежьей точки — Цвет точки медвежьего пробоя.
term Срок — Выбирает срок тренда: Long, Medium или Short.
HHLL Определяет, какие метки максимумов и минимумов показывать: без меток, только HH/LL или HH/LL вместе с предыдущими H/L.
bg Цвет фона — Включает или выключает окрашивание фона графика.
cc Цвет бара — Включает или выключает окрашивание баров.
enable_signal_system Включить сигнальную систему — Включает или выключает сигнальную систему.
sensitivity Чувствительность сигнала — Задаёт чувствительность сигнальной системы.
volatility_period Период волатильности — Задаёт период волатильности.
enable_trend_follow Включить следование за трендом — Включает или выключает следование за трендом.
follow_type Тип следования — Выбирает тип следования за трендом: enhanced или standard.
trend_period Период тренда — Задаёт период для следования за трендом.
trend_multiplier Множитель тренда — Задаёт множитель для следования за трендом.
show_zones Показать зоны входа — Включает или выключает отображение зон входа.
enable_theilsen Включить оценку Тейла-Сена — Включает или выключает оценку Тейла-Сена.
ts_len Длина TS — Задаёт длину для оценки Тейла-Сена.
ts_src Источник TS — Выбирает источник данных для оценки Тейла-Сена.
ts_method Метод выбора пар — Выбирает метод выбора пар.
ts_numpairs Количество пар (если метод == Random) — Задаёт количество пар, если выбран случайный метод.
ts_showinterval Показать интервал предсказания — Включает или выключает отображение интервала предсказания.
ts_mult Множитель интервала предсказания — Задаёт множитель для интервала предсказания.
ts_showresult Показать наклон и пересечение — Включает или выключает отображение наклона и пересечения.
ts_colup Цвет восходящего — Цвет восходящего тренда.
ts_coldw Цвет нисходящего — Цвет нисходящего тренда.
ts_colbr Цвет пробоя канала — Цвет пробоя канала.
ts_lw Ширина линии — Задаёт ширину линии.
ts_extendln Продлить линию — Включает или выключает продление линии.
plotRibsw Показать ленту тренда — Включает или выключает отображение ленты тренда.
plotRibbonPos Позиция ленты — Выбирает положение ленты тренда.
xfixtf Мультитаймфрейм — Включает или выключает использование нескольких таймфреймов.
xtf Выбрать таймфрейм для ленты — Выбирает таймфрейм для ленты.
showSR Показать уровни поддержки/сопротивления — Включает или выключает отображение уровней поддержки и сопротивления.
srPeriod Период поддержки/сопротивления — Задаёт период для уровней поддержки и сопротивления.
showMacro Показать макро — Включает или выключает отображение макроуровней.
macroPeriod Период макро — Задаёт период для макроуровней.
srUpColor Цвет верхней границы поддержки/сопротивления — Цвет верхней границы уровня поддержки/сопротивления.
srDownColor Цвет нижней границы поддержки/сопротивления — Цвет нижней границы уровня поддержки/сопротивления.
macroUpColor Цвет верхней границы макро — Цвет верхней границы макроуровня.
macroDownColor Цвет нижней границы макро — Цвет нижней границы макроуровня.
lineWidth Ширина линий — Задаёт ширину линий.
showZones Показать зоны — Включает или выключает отображение зон.
CirrusCloud Облако Cirrus — Включает или выключает отображение облака Cirrus.
res5 Таймфрейм — Задаёт таймфрейм для альтернативных сигналов.
useRes Использовать альтернативные сигналы — Включает или выключает использование альтернативных сигналов.
intRes Множитель альтернативных сигналов — Задаёт множитель для альтернативных сигналов.
basisType Тип MA — Выбирает тип скользящей средней.
basisLen Период MA — Задаёт период скользящей средней.
offsetSigma Смещение для LSMA / Сигма для ALMA — Задаёт смещение для LSMA или сигму для ALMA.
offsetALMA Смещение для ALMA — Задаёт смещение для ALMA.
delayOffset Задержка открытия/закрытия MA — Задаёт задержку для скользящей средней открытия/закрытия.
tradeType Тип сделок — Определяет, какие сделки должны быть приняты.
rsi_period Период RSI — Задаёт период RSI.
rsi_overbought Уровень перекупленности RSI — Задаёт уровень перекупленности RSI.
rsi_oversold Уровень перепроданности RSI — Задаёт уровень перепроданности RSI.
ema_period Период EMA — Задаёт период экспоненциальной скользящей средней.
show_basic_signals Показать базовые сигналы — Включает или выключает отображение базовых сигналов.
show_strong_signals Показать сильные сигналы — Включает или выключает отображение сильных сигналов.
show_rsi_confluence Показать только RSI — Включает или выключает отображение только сигналов RSI.
h Сигналы для Heikin Ashi — Включает или выключает сигналы для свечей Heikin Ashi.
swing_length Длина свинга — Задаёт длину свинга для определения максимумов и минимумов.
history_of_demand_to_keep История для сохранения — Задаёт количество исторических зон спроса, которые нужно сохранять.
box_width Ширина бокса спроса/предложения — Задаёт ширину прямоугольников спроса и предложения.
channelBal Баланс канала — Включает или выключает отображение баланса канала.
enableSR Вкл/выкл уровни поддержки/сопротивления — Включает или выключает отображение уровней поддержки и сопротивления.
colorSup Цвет поддержки — Цвет линии поддержки.
colorRes Цвет сопротивления — Цвет линии сопротивления.
strengthSR Сила уровней поддержки/сопротивления — Задаёт силу уровней поддержки и сопротивления.
lineStyle Стиль линий — Выбирает стиль линий поддержки и сопротивления.
lineWidth5 Ширина линий поддержки/сопротивления — Задаёт ширину линий поддержки и сопротивления.
useZones Зоны вкл/выкл — Включает или выключает отображение зон.
useHLZones Зоны максимумов/минимумов вкл/выкл — Включает или выключает отображение зон максимумов и минимумов.
zoneWidth Ширина зоны % — Задаёт ширину зоны в процентах.
expandSR Расширение уровней поддержки/сопротивления — Включает или выключает расширение уровней поддержки и сопротивления.
rsiLengthInput Длина RSI — Задаёт длину RSI.
rsiSourceInput Источник — Выбирает источник данных для RSI.
highPivotLen Длина высоких пивотов — Задаёт длину для определения высоких пивотов.
lowPivotLen Длина низких пивотов — Задаёт длину для определения низких пивотов.
activationThresholdStr Порог активации — Задаёт порог активации для сигналов.
KDEKernel Ядро KDE — Выбирает тип ядра для оценки плотности распределения.
KDEBandwidth Ширина полосы KDE — Задаёт ширину полосы ядра KDE, влияющую на сглаживание распределения.
KDEStep Количество бинов — Задаёт количество интервалов (бинов) для оценки плотности.
bearishColor Цвет медвежьих — Цвет для медвежьих сигналов.
neutralColor Нейтральный цвет — Цвет для нейтральных сигналов.
bullishColor Цвет бычьих — Цвет для бычьих сигналов.
textColor Цвет текста — Цвет текста.
RSILabelsEnabled Метки RSI — Включает или выключает отображение меток RSI.
KDELabelsEnabled Метки KDE — Включает или выключает отображение меток KDE.
show_dashboard1 Показать панель 1 — Включает или выключает отображение панели 1.
show_header_d1 Показать заголовок — Включает или выключает отображение заголовка панели 1.
show_ema_value_d1 Показать значение EMA — Включает или выключает отображение значения EMA на панели 1.
show_pressure_gauge_d1 Показать индикатор давления — Включает или выключает отображение индикатора давления на панели 1.
Получить полный код

Поиск по коду файла

indicator('PRO V6', shorttitle='PRO V6', max_lines_count=500, max_labels_count=500, max_bars_back=5000, overlay=true)

sp='         '
res   = input.timeframe (    ''   , 'Period        '                                )
i1        = input.bool  (   true  , ''            , inline='1', group='Swing Length')
i2        = input.bool  (   true  , ''            , inline='2', group='Swing Length')
i3        = input.bool  (   false  , ''            , inline='3', group='Swing Length')
l1        = input.int   (60, 'Long     ', minval=1, inline='1', group='Swing Length')
l2        = input.int   (30, 'Medium'   , minval=1, inline='2', group='Swing Length')
l3        = input.int   (10, 'Short    ', minval=1, inline='3', group='Swing Length')
cBull     = input.color (#05c926, 'Trendline'+sp, inline='d', group='Style'       )
cBear     = input.color (#ff0000, ''            , inline='d', group='Style'
          , tooltip    =            'Bullish/Bearish Trendline'                   )
cWickBull = input.color (#085def, 'Wick Dot' +sp, inline='w', group='Style'   )
cWickBear = input.color (#ff5d00, ''            , inline='w', group='Style'
          , tooltip    =            'Bullish/Bearish Wick'                   )
term      = input.string('Long'   , 'Term'
          , options    =['Long'   , 'Medium', 'Short'              ]     )
HHLL      = input.string('None'   , 'HH/LL'  
          , options    =['None','Only HH/LL','HH/LL & previous H/L'])
bg        = input.bool  (  false  , 'Background Color'        )
cc        = input.bool  (  false  , 'Bar Color'      )

type bin 
    line    lin 
    float   slope
    bool    active
    chart.point cp

lbi = last_bar_index
n   = bar_index
INV = color(na)

draw(toggle, res, left, right, pos) =>

    ps = term == 'Long' ? 1 : term == 'Medium' ? 2 : 3

    var int trend    = 0
    var chart.point prevPh = chart.point.from_index(na, na)
    var chart.point prevPl = chart.point.from_index(na, na)

    var bn = bin.new(line(na), 0, false)

    ph_ = ta.pivothigh(left, right), [tH, ph]  = request.security(syminfo.tickerid, res, [time[2], ph_])
    pl_ = ta.pivotlow (left, right), [tL, pl]  = request.security(syminfo.tickerid, res, [time[2], pl_])

    cH = ta.change(fixnan(ph))    
    cL = ta.change(fixnan(pl))

    chH = cH != 0 and cL == 0
    chL = cL != 0 and cH == 0

    if toggle

        if bn.active 
            if bn.lin.get_x2() - bn.lin.get_x1() > 5000 
                bn.active := false 
                bn.lin.delete() 
            else 
                bn.lin.set_xy2(n, bn.lin.get_y2() + bn.slope)

        if chH 
            v = 0.
            idx = 0
            for i = 0 to 5000 
                Ti = time[i]
                if high[i] > v 
                    v := high[i]
                    idx := i
                if Ti < tH 
                    break
            x = n - idx
            c = close[idx]

            if trend < 1 

                if v > prevPh.price and x - prevPh.index > 5 and n - prevPl.index < 5000
                    if pos == ps and HHLL != 'None'
                        label.new(x, v, color=color(na), text='HH\n', size=size.tiny, textcolor=chart.fg_color)
                        if HHLL == 'HH/LL & previous H/L'
                            label.new(prevPh.index, prevPh.price, color=color(na), size=size.tiny, text='●', textcolor=chart.fg_color)

                    trend := 1
                    bn := bin.new(line.new(prevPl.index, prevPl.price, n, prevPl.price, color=cBull
                     , style= pos == 1 ? line.style_solid : pos == 2 ? line.style_dashed : line.style_dotted, width=pos == 1 ? 2 : 2)
                     , 0, true, chart.point.from_index(prevPl.index, prevPl.price))
                else 

                    if bn.active
                        slope = (v - bn.cp.price) / (x - bn.cp.index)

                        if v < bn.lin.get_y1() + slope and (v > bn.lin.get_y2() + slope or bn.slope == 0)
                            priceLin = bn.lin.get_price(n-idx) 
                            if c < priceLin

                                if bn.slope != 0
                                    label.new(n-idx, priceLin, style=label.style_label_center, text='●', color=color(na), textcolor=cWickBear)

                                bn.lin.set_xy2(n, v + slope*idx)

                                if bn.slope == 0

                                    stop = false 
                                    while not stop
                                        arr = array.new<float>()

                                        for i = 0 to n - bn.lin.get_x1()
                                            arr.push(close[i] - bn.lin.get_price(n-i))
                                        highest_point = arr.max()

                                        if highest_point > 0
                                            ix = arr.indexof(highest_point)  
                                            x1 = n-ix, y1 = high[ix]

                                            bn.cp.index := x1 
                                            bn.cp.price := y1
                                            slope  := (v - y1) / (x - x1)
                                            bn.lin.set_xy2(n, v + slope*idx)                                         
                                            bn.lin.set_xy1(x1, y1)
                                            bn.slope := slope
                                        else 
                                            bn.lin.set_xy2(n, v + slope*idx)                                         
                                            bn.slope := slope
                                            stop := true
                                else 
                                    bn.slope := slope
                            else 

                                bn.active := false
            prevPh.index := x
            prevPh.price := v

        else 
            if trend < 1 
                if close > bn.lin.get_y2() 
                    bn.active := false

        if chL 
            v = 10e6
            idx = 0
            for i = 0 to 5000 
                Ti = time[i]
                if low[i] < v 
                    v := low[i]
                    idx := i
                if Ti < tL
                    break
            x = n - idx
            c = close[idx]

            if trend >-1 

                if v < prevPl.price and x - prevPl.index > 5 and n - prevPh.index < 5000
                    if pos == ps and HHLL != 'None'
                        label.new(x, v, color=color(na), text='\nLL', size=size.tiny, textcolor=chart.fg_color, style=label.style_label_up)
                        if HHLL == 'HH/LL & previous H/L'
                            label.new(prevPl.index, prevPl.price, color=color(na), size=size.tiny, text='●', textcolor=chart.fg_color, style=label.style_label_up)

                    trend :=-1
                    bn := bin.new(line.new(prevPh.index, prevPh.price, n, prevPh.price, color=cBear
                     , style= pos == 1 ? line.style_solid : pos == 2 ? line.style_dashed : line.style_dotted, width=pos == 1 ? 2 : 2)
                     , 0, true, chart.point.from_index(prevPh.index, prevPh.price))
                else 

                    if bn.active
                        slope = (v - bn.cp.price) / (x - bn.cp.index)

                        if v > bn.lin.get_y1() + slope and (v < bn.lin.get_y2() + slope or bn.slope == 0)
                            priceLin = bn.lin.get_price(n-idx)

                            if c > priceLin 

                                if bn.slope != 0
                                    label.new(n-idx, priceLin, style=label.style_label_center, text='●', color=color(na), textcolor=cWickBull)

                                bn.lin.set_xy2(n, v + slope*idx)

                                if bn.slope == 0

                                    stop = false 
                                    while not stop                                        
                                        arr = array.new<float>()

                                        for i = 0 to n - bn.lin.get_x1()
                                            arr.push(bn.lin.get_price(n-i)-close[i])
                                        deepest_point = arr.max()

                                        if deepest_point > 0
                                            ix = arr.indexof(deepest_point)  
                                            x1 = n-ix, y1 = low[ix]
                                            bn.cp.index := x1 
                                            bn.cp.price := y1
                                            slope  := (v - y1) / (x - x1)
                                            bn.lin.set_xy2(n, v + slope*idx)                                         
                                            bn.lin.set_xy1(x1, y1)
                                            bn.slope := slope
                                        else
                                            bn.lin.set_xy2(n, v + slope*idx)                                         
                                            bn.slope := slope
                                            stop := true
                                else 
                                    bn.slope := slope
                            else 

                                bn.active := false
            prevPl.index := x
            prevPl.price := v
        else 
            if trend >-1 
                if close < bn.lin.get_y2() 
                    bn.active := false

    [trend, bn.lin.get_y2()]

[trend1, value1] = draw(i1, res, l1, 1, 1)
[trend2, value2] = draw(i2, res, l2, 1, 2)
[trend3, value3] = draw(i3, res, l3, 1, 3)

col = color(na)
if cc 
    col := switch close > value1
        true => 
            switch close > value2
                true => 
                    if close > value3
                        color.new(cBull, 20)
                    else
                        color.new(cBull, 43)
                => 
                    if close > value3
                        color.new(cBull, 66)
                    else
                        color.new(cBull, 89)
        => 
            switch close < value2
                true => 
                    if close < value3
                        color.new(cBear, 20)
                    else
                        color.new(cBear, 43)
                => 
                    if close < value3
                        color.new(cBear, 66)
                    else
                        color.new(cBear, 89)

plot(value1, display=display.none)
plot(value2, display=display.none)
plot(value3, display=display.none)
plot(trend1, display=display.none)
barcolor(cc ? col : na)

isValid = bg and (term == 'Long' ? i1 : term == 'Medium' ? i2 : i3)
bgcolor(isValid ? color.new(close > (term == 'Long' ? value1 : term == 'Medium' ? value2 : value3) ? cBull : cBear, 97) : na)

enable_signal_system = input.bool(true, title="━━━━━ Enable Signal System ━━━━━")
sensitivity = input.float(5, title='Signal Sensitivity', step=.5)
volatility_period = input(10, title='Volatility Period')

src = close
xATR = ta.atr(volatility_period)
nLoss = sensitivity * xATR

xSignalLine = 0.0
iff_1 = src > nz(xSignalLine[1], 0) ? src - nLoss : src + nLoss
iff_2 = src < nz(xSignalLine[1], 0) and src[1] < nz(xSignalLine[1], 0) ? math.min(nz(xSignalLine[1]), src + nLoss) : iff_1
xSignalLine := src > nz(xSignalLine[1], 0) and src[1] > nz(xSignalLine[1], 0) ? math.max(nz(xSignalLine[1]), src - nLoss) : iff_2

pos = 0
iff_3 = src[1] > nz(xSignalLine[1], 0) and src < nz(xSignalLine[1], 0) ? -1 : nz(pos[1], 0)
pos := src[1] < nz(xSignalLine[1], 0) and src > nz(xSignalLine[1], 0) ? 1 : iff_3

long_signal = enable_signal_system ? ta.crossover(src, xSignalLine) : false
short_signal = enable_signal_system ? ta.crossunder(src, xSignalLine) : false
barcolor_signal = src > xSignalLine

enable_trend_follow = input.bool(true, title="━━━━━ Enable Trend Following ━━━━━")
follow_type = input.string('enhanced', 'Follow Type', options=['enhanced', 'standard'])
trend_period = input(28, 'Trend Period')
trend_multiplier = input(5, 'Trend Multiplier')
show_zones = input(true, 'Show Entry Zones?')

norm_o = request.security(ticker.new(syminfo.prefix, syminfo.ticker), timeframe.period, open)
norm_h = request.security(ticker.new(syminfo.prefix, syminfo.ticker), timeframe.period, high)
norm_l = request.security(ticker.new(syminfo.prefix, syminfo.ticker), timeframe.period, low)
norm_c = request.security(ticker.new(syminfo.prefix, syminfo.ticker), timeframe.period, close)

Enhanced_ma(_src, _malength) =>
    _enhanced = 0.0
    _enhanced := nz(_enhanced[1]) + (_src - nz(_enhanced[1])) / _malength
    _enhanced

HiLo = math.min(norm_h - norm_l, 1.5 * nz(ta.sma(norm_h - norm_l, trend_period)))
HRef = norm_l <= norm_h[1] ? norm_h - norm_c[1] : norm_h - norm_c[1] - 0.5 * (norm_l - norm_h[1])
LRef = norm_h >= norm_l[1] ? norm_c[1] - norm_l : norm_c[1] - norm_l - 0.5 * (norm_l[1] - norm_h)

trueRange = follow_type == 'enhanced' ? math.max(HiLo, HRef, LRef) : math.max(norm_h - norm_l, math.abs(norm_h - norm_c[1]), math.abs(norm_l - norm_c[1]))

loss = trend_multiplier * Enhanced_ma(trueRange, trend_period)

Up = norm_c - loss
Dn = norm_c + loss

TrendUp = Up
TrendDown = Dn
Trend = 1

TrendUp := norm_c[1] > TrendUp[1] ? math.max(Up, TrendUp[1]) : Up
TrendDown := norm_c[1] < TrendDown[1] ? math.min(Dn, TrendDown[1]) : Dn

Trend := norm_c > TrendDown[1] ? 1 : norm_c < TrendUp[1] ? -1 : nz(Trend[1], 1)
trail = Trend == 1 ? TrendUp : TrendDown

ex = 0.0
ex := ta.crossover(Trend, 0) ? norm_h : ta.crossunder(Trend, 0) ? norm_l : Trend == 1 ? math.max(ex[1], norm_h) : Trend == -1 ? math.min(ex[1], norm_l) : ex[1]

state = Trend == 1 ? 'up' : 'down'

zone1Level = 61.8
zone2Level = 78.6
zone3Level = 88.6

z1 = ex + (trail - ex) * zone1Level / 100
z2 = ex + (trail - ex) * zone2Level / 100
z3 = ex + (trail - ex) * zone3Level / 100
l100 = trail + 0

z1_long = enable_trend_follow and state[1] == 'up' and ta.crossunder(norm_c, z1[1])
z2_long = enable_trend_follow and state[1] == 'up' and ta.crossunder(norm_c, z2[1])
z3_long = enable_trend_follow and state[1] == 'up' and ta.crossunder(norm_c, z3[1])
z1_short = enable_trend_follow and state[1] == 'down' and ta.crossover(norm_c, z1[1])
z2_short = enable_trend_follow and state[1] == 'down' and ta.crossover(norm_c, z2[1])
z3_short = enable_trend_follow and state[1] == 'down' and ta.crossover(norm_c, z3[1])

enable_theilsen = input.bool(false, title="━━━━━ Enable Theil-Sen Estimator ━━━━━")

ts_len = input.int(title='TS Length', defval=100, minval=3, maxval=400)
ts_src = input(title='TS Source', defval=close)
ts_method = input.string(title='Pair Selection Method', defval='All', options=['All', 'Random'])
ts_numpairs = input.int(title='Number of Pairs (if Method == Random)', defval=500, minval=3)
ts_showinterval = input(title='Show Prediction Interval', defval=true)
ts_mult = input.float(title='Prediction Interval Multiplier', defval=2, minval=0.1)
ts_showresult = input(title='Show Slope and Intercept', defval=false)
ts_colup = input(title='Color Up', defval=color.green)
ts_coldw = input(title='Color Down', defval=color.red)
ts_colbr = input(title='Channel Break Color', defval=color.orange)
ts_lw = input(title='Line Width', defval=2)
ts_extendln = input(title='Extend Line', defval=true)

allslopes(_n, _y) =>

    _S = array.new_float(0)
    if _n > 2
        for i = 0 to _n - 2 by 1
            for j = i + 1 to _n - 1 by 1
                array.push(_S, (_y[i] - _y[j]) / (j - i))
    _S

rndslopes(_S, _numpoints) =>

    _Srnd = array.new_float(0)
    int _ntmp = array.size(_S)
    int _n = _ntmp > _numpoints ? _numpoints : _ntmp
    int _i = 0
    int _s1 = 0
    int _s2 = 0
    int _s3 = 0
    float _rnd = na
    if _n > 2
        for k = 0 to _n - 1 by 1

            _s1 := k * int(ohlc4[1])
            _s1 := k * int(ohlc4[1] + ohlc4[2])
            _s3 := k * int(ohlc4[3])

            _s1 := 171 * (_s1 % 30269)
            _s2 := 172 * (_s2 % 30269)
            _s3 := 170 * (_s3 % 30269)
            _rnd := (float(_s1) / 30269.0 + float(_s2) / 30307.0 + float(_s3) / 30323.0) % 1
            _i := int(_rnd * _ntmp)

            array.push(_Srnd, array.get(_S, _i))

            array.remove(_S, _i)
            _ntmp -= 1
            _ntmp
    _Srnd

intercepts(_src, _n, _mslope) =>

    _I = array.new_float(0)
    if _n > 2
        for i = 0 to _n - 1 by 1
            array.push(_I, _src[_n - 1 - i] - _mslope * i)
    _I

truncate(_value, _decimals) =>

    _factor = math.pow(10, _decimals)
    int(_value * _factor) / _factor

rmsd(_src, _x, _a, _b, _n) =>
    float _rmsd = 0.0
    for i = 0 to _n - 1 by 1
        _rmsd += math.pow(_src[i] - _a - _b * (_x - i), 2) / _n
        _rmsd
    math.sqrt(_rmsd)

ts_current_len = enable_theilsen ? ts_len : 0

if not barstate.islast
    ts_current_len := 0
    ts_current_len

S = allslopes(ts_current_len, ts_src)
if ts_method == 'Random'
    S := rndslopes(S, ts_numpairs)
    S
mslope = array.median(S)
I = intercepts(ts_src, ts_current_len, mslope)
minter = array.median(I)

ts_x = bar_index
ts_x1 = ts_x - ts_current_len
ts_x2 = ts_x
ts_y1 = minter
ts_y2 = minter + mslope * (ts_current_len - 1)

float rmse = 0.0
if ts_current_len > 0
    for j = 0 to ts_current_len - 1 by 1
        rmse += math.pow(ts_src[j] - (minter + mslope * (ts_current_len - j)), 2) / ts_current_len
        rmse
dev = ts_mult * math.sqrt(rmse)

isbroken = ts_src > ts_y2 + dev or ts_src < ts_y2 - dev

plotshape(long_signal, title='Long Entry', text='⭐\nBuy', style=shape.labelup, location=location.belowbar, color=#00ff00, textcolor=color.new(color.white, 0), size=size.auto, offset=0, editable=false)
plotshape(short_signal, title='Short Entry', text='⭐\nSell', style=shape.labeldown, location=location.abovebar, color=#ff0000, textcolor=color.new(color.white, 0), size=size.auto, offset=0, editable=false)

plot(enable_trend_follow ? trail : na, 'Dynamic Line', style=plot.style_line, color=Trend == 1 ? #4caf4f00 : Trend == -1 ? #ff525200 : na)
plot(enable_trend_follow ? ex : na, 'Key Points', style=plot.style_circles, color=Trend == 1 ? #00e67700 : Trend == -1 ? #df40fb00 : na)

Zone1 = plot(enable_trend_follow and show_zones ? z1 : na, 'Zone 1', style=plot.style_line, color=color.new(#787b86, 100))
Zone2 = plot(enable_trend_follow and show_zones ? z2 : na, 'Zone 2', style=plot.style_line, color=color.new(#787b86, 100))
Zone3 = plot(enable_trend_follow and show_zones ? z3 : na, 'Zone 3', style=plot.style_line, color=color.new(#787b86, 100))
L100 = plot(enable_trend_follow and show_zones ? l100 : na, 'Base Line', style=plot.style_line, color=color.new(#787b86, 100))

fill(Zone1, Zone2, color=enable_trend_follow and show_zones ? (state == 'up' ? color.rgb(24, 40, 82, 30) : state == 'down' ? color.rgb(58, 3, 46, 55) : na) : na, transp=90)
fill(Zone2, Zone3, color=enable_trend_follow and show_zones ? (state == 'up' ? color.rgb(24, 40, 82, 30) : state == 'down' ? color.rgb(58, 3, 46, 55) : na) : na, transp=90)
fill(Zone3, L100, color=enable_trend_follow and show_zones ? (state == 'up' ? color.rgb(24, 40, 82, 30) : state == 'down' ? color.rgb(58, 3, 46, 55) : na) : na, transp=90)

var line ts_line = na
var line ts_upper_line = na
var line ts_lower_line = na
var label ts_label = na

if enable_theilsen and barstate.islast and ts_current_len > 0

    if not na(ts_line)
        line.delete(ts_line)
    if not na(ts_upper_line)
        line.delete(ts_upper_line)
    if not na(ts_lower_line)
        line.delete(ts_lower_line)
    if not na(ts_label)
        label.delete(ts_label)

    ts_line := line.new(ts_x1, ts_y1, ts_x2, ts_y2, xloc.bar_index, extend=ts_extendln ? extend.right : extend.none, color=isbroken ? ts_colbr : mslope > 0 ? ts_colup : ts_coldw, width=ts_lw)

    if ts_showinterval
        ts_upper_line := line.new(ts_x1, ts_y1 + dev, ts_x2, ts_y2 + dev, xloc.bar_index, extend=ts_extendln ? extend.right : extend.none, color=isbroken ? ts_colbr : mslope > 0 ? ts_colup : ts_coldw, width=1, style=line.style_dashed)
        ts_lower_line := line.new(ts_x1, ts_y1 - dev, ts_x2, ts_y2 - dev, xloc.bar_index, extend=ts_extendln ? extend.right : extend.none, color=isbroken ? ts_colbr : mslope > 0 ? ts_colup : ts_coldw, width=1, style=line.style_dashed)

    if ts_showresult
        ts_label := label.new(bar_index - (ts_current_len - 1), mslope > 0 ? ts_y1 - dev : ts_y1 + dev, style=mslope > 0 ? label.style_label_up : label.style_label_down, text='Slope ' + str.tostring(truncate(mslope, 2)) + ', Intercept ' + str.tostring(truncate(minter, 2)), color=mslope > 0 ? ts_colup : ts_coldw)

final_barcolor = color.gray
if enable_signal_system
    signal_barcolor = barcolor_signal ? #15ff00 : #ff0000
    final_barcolor := signal_barcolor

barcolor(final_barcolor)

alertcondition(long_signal, title='Pro Signal Up', message='Pro Signal Up Entry')
alertcondition(short_signal, title='Pro Signal Down', message='Pro Signal Down Entry')

alertcondition(z1_long, title='Zone 1 Cross Down', message='Price crossed below Zone 1 in uptrend')
alertcondition(z2_long, title='Zone 2 Cross Down', message='Price crossed below Zone 2 in uptrend')
alertcondition(z3_long, title='Zone 3 Cross Down', message='Price crossed below Zone 3 in uptrend')
alertcondition(z1_short, title='Zone 1 Cross Up', message='Price crossed above Zone 1 in downtrend')
alertcondition(z2_short, title='Zone 2 Cross Up', message='Price crossed above Zone 2 in downtrend')
alertcondition(z3_short, title='Zone 3 Cross Up', message='Price crossed above Zone 3 in downtrend')

alertcondition(fixnan(z1) != fixnan(z1[1]), title='Dynamic Change', message='Dynamic Line Change')

alertcondition(enable_theilsen and isbroken and not isbroken[1], title='Theil-Sen Channel Break', message='Price is Breaking the Theil-Sen Channel')

plotRibsw = input(title='Show Trend Ribbon', defval=true , inline = "RIBBON" , group = "Chart Features")
plotRibbonPos = input.string(title='Ribbon Position', options=['Top', 'Bottom'], defval='Bottom', group = "Chart Features")
xfixtf = input(title='MTF', defval=false , inline = "RIBBON", group = "Chart Features")
xtf = input.timeframe(title='Select MTF Ribbon', defval='D', group = "Chart Features")

xsrc = close
xprd1 = 12
xsrc2 = close
xprd2 = 26
xsmooth = 1

xPrice = ta.ema(xsrc, xsmooth)
FastMA = xfixtf ? ta.ema(request.security(syminfo.tickerid, xtf, ta.ema(xsrc, xprd1)), xsmooth) : ta.ema(xPrice, xprd1)
xPrice2 = ta.ema(xsrc2, xsmooth)
SlowMA = xfixtf ? ta.ema(request.security(syminfo.tickerid, xtf, ta.ema(xsrc2, xprd2)), xsmooth) : ta.ema(xPrice2, xprd2)
BullTribbon = FastMA > SlowMA
Tribbon = FastMA < SlowMA

Green = BullTribbon and xPrice > FastMA
Red = Tribbon and xPrice < FastMA

buycond = Green and Green[1] == 0
sellcond = Red and Red[1] == 0

bullTribbonish = ta.barssince(buycond) < ta.barssince(sellcond)
Tribbonish = ta.barssince(sellcond) < ta.barssince(buycond)

bColor_BullTribbonTribbon = bullTribbonish ? #00FF00 : Tribbonish ? #ff0000 : na

plotshape(plotRibsw ? plotRibbonPos == 'Top' ? close : na : na, style=shape.square, title='Buy/Sell Ribbon', location=location.top, color=bColor_BullTribbonTribbon , editable = false)
plotshape(plotRibsw ? plotRibbonPos == 'Bottom' ? close : na : na, style=shape.square, title='Buy/Sell Ribbon', location=location.bottom, color=bColor_BullTribbonTribbon , editable = false)

showSR = input.bool(true, 'Show S/R')
srPeriod = input.int(50, 'S/R Period', minval = 10)
showMacro = input.bool(true, 'Show Macro')
macroPeriod = input.int(200, 'Macro Period', minval = 10)

srUpColor = input.color(#860015, 'S/R Upper')
srDownColor = input.color(#13761e, 'S/R Lower')
macroUpColor = input.color(#d10055, 'Macro Upper')
macroDownColor = input.color(#30b2be, 'Macro Lower')

lineWidth = input.int(2, "Line Width", 1)
showZones = input(true, "Show Zones")

var srHighs = array.new_float()
var srLows = array.new_float()
var macroHighs = array.new_float()
var macroLows = array.new_float()
var posVolSR = array.new_float()
var negVolSR = array.new_float()
var posVolMacro = array.new_float()
var negVolMacro = array.new_float()

var float deltaVolSR = na
var float deltaVolMacro = na

var line srUpperLine = na
var line srLowerLine = na
var line macroUpperLine = na
var line macroLowerLine = na
var line midLine = na

atrValue = ta.atr(200) * 0.3

if barstate.islast and showMacro
    array.clear(macroHighs)
    array.clear(macroLows)  
    array.clear(posVolMacro)
    array.clear(negVolMacro)

    for i = 0 to macroPeriod - 1
        array.push(macroHighs, high[i])
        array.push(macroLows, low[i])
        if close[i] > open[i]
            array.push(posVolMacro, volume[i])
        else
            array.push(posVolMacro, 0)
        if close[i] < open[i]  
            array.push(negVolMacro, volume[i])
        else
            array.push(negVolMacro, 0)

    posSum = array.sum(posVolMacro)
    negSum = array.sum(negVolMacro)
    deltaVolMacro := posSum > 0 ? (negSum / posSum + 1) * 100 : 100

if barstate.islast and showSR
    array.clear(srHighs)
    array.clear(srLows)
    array.clear(posVolSR)
    array.clear(negVolSR)

    for i = 0 to srPeriod - 1
        array.push(srHighs, high[i])
        array.push(srLows, low[i])
        if close[i] > open[i]
            array.push(posVolSR, volume[i])
        else
            array.push(posVolSR, 0)
        if close[i] < open[i]
            array.push(negVolSR, volume[i])
        else
            array.push(negVolSR, 0)

    posSum = array.sum(posVolSR)
    negSum = array.sum(negVolSR)
    deltaVolSR := posSum > 0 ? (negSum / posSum + 1) * 100 : 100

line.delete(srUpperLine[1])
line.delete(srLowerLine[1])
line.delete(macroUpperLine[1])
line.delete(macroLowerLine[1])
line.delete(midLine[1])

if showSR and barstate.islast
    srHigh = array.max(srHighs)
    srLow = array.min(srLows)
    midLevel = (srHigh + srLow) / 2

    srUpperLine := line.new(bar_index - srPeriod, srHigh, bar_index + 50, srHigh, color = srUpColor, width = lineWidth)
    srLowerLine := line.new(bar_index - srPeriod, srLow, bar_index + 50, srLow, color = srDownColor, width = lineWidth)
    midLine := line.new(bar_index - srPeriod, midLevel, bar_index + 50, midLevel, color = color.gray, style = line.style_dashed)

    if showZones
        upperZone1 = line.new(bar_index - srPeriod, srHigh + atrValue, bar_index + 50, srHigh + atrValue, color = na)
        upperZone2 = line.new(bar_index - srPeriod, srHigh - atrValue, bar_index + 50, srHigh - atrValue, color = na)
        lowerZone1 = line.new(bar_index - srPeriod, srLow + atrValue, bar_index + 50, srLow + atrValue, color = na)
        lowerZone2 = line.new(bar_index - srPeriod, srLow - atrValue, bar_index + 50, srLow - atrValue, color = na)
        linefill.new(upperZone1, upperZone2, color.new(srUpColor, 85))
        linefill.new(lowerZone1, lowerZone2, color.new(srDownColor, 85))

if showMacro and barstate.islast
    macroHigh = array.max(macroHighs)
    macroLow = array.min(macroLows)

    macroUpperLine := line.new(bar_index - macroPeriod, macroHigh, bar_index + 70, macroHigh, color = macroUpColor, width = lineWidth + 1)
    macroLowerLine := line.new(bar_index - macroPeriod, macroLow, bar_index + 70, macroLow, color = macroDownColor, width = lineWidth + 1)

    if showZones
        macroUpperZone1 = line.new(bar_index - macroPeriod, macroHigh + atrValue * 1.5, bar_index + 70, macroHigh + atrValue * 1.5, color = na)
        macroUpperZone2 = line.new(bar_index - macroPeriod, macroHigh - atrValue * 1.5, bar_index + 70, macroHigh - atrValue * 1.5, color = na)
        macroLowerZone1 = line.new(bar_index - macroPeriod, macroLow + atrValue * 1.5, bar_index + 70, macroLow + atrValue * 1.5, color = na)
        macroLowerZone2 = line.new(bar_index - macroPeriod, macroLow - atrValue * 1.5, bar_index + 70, macroLow - atrValue * 1.5, color = na)
        linefill.new(macroUpperZone1, macroUpperZone2, color.new(macroUpColor, 65))
        linefill.new(macroLowerZone1, macroLowerZone2, color.new(macroDownColor, 65))

var label srPremiumLabel = na
var label srDiscountLabel = na
var label srDeltaLabel = na
var label macroPremiumLabel = na
var label macroDiscountLabel = na

label.delete(srPremiumLabel[1])
label.delete(srDiscountLabel[1])
label.delete(srDeltaLabel[1])
label.delete(macroPremiumLabel[1])
label.delete(macroDiscountLabel[1])

if showSR and barstate.islast
    srHigh = array.max(srHighs)
    srLow = array.min(srLows)
    midLevel = (srHigh + srLow) / 2

    srPremiumLabel := label.new(bar_index + 55, srHigh, "PREMIUM: " + str.tostring(array.sum(negVolSR), format.volume), color = srUpColor, textcolor = color.white, style = label.style_label_left, size = size.small)
    srDiscountLabel := label.new(bar_index + 55, srLow, "DISCOUNT: " + str.tostring(array.sum(posVolSR), format.volume), color = srDownColor, textcolor = color.white, style = label.style_label_left, size = size.small)
    srDeltaLabel := label.new(bar_index + 55, midLevel, "Delta Volume\n" + str.tostring(deltaVolSR, format.percent), color = deltaVolSR > 0 ? srDownColor : srUpColor, textcolor = color.white, style = label.style_label_left, size = size.normal)

if showMacro and barstate.islast
    macroHigh = array.max(macroHighs)
    macroLow = array.min(macroLows)

    macroPremiumLabel := label.new(bar_index + 75, macroHigh, str.tostring(array.sum(negVolMacro), format.volume), color = macroUpColor, textcolor = color.white, style = label.style_label_right, size = size.small)
    macroDiscountLabel := label.new(bar_index + 75, macroLow, str.tostring(array.sum(posVolMacro), format.volume), color = macroDownColor, textcolor = color.white, style = label.style_label_right, size = size.small)

CirrusCloud = input(true, 'Cirrus Cloud', group='TREND FEATURES')

x1 = 22
x2 = 9
x3 = 15
x4 = 5

smoothrngX1(x, t, m) =>
    wper  = t * 2 - 1
    avrng = ta.ema(math.abs(x - x[1]), t)
    ta.ema(avrng, wper) * m

smrngx1x  = smoothrngX1(close, x1, x2)
smrngx1x2 = smoothrngX1(close, x3, x4)

rngfiltx1x1(x, r) =>
    var float filt = x
    filt := x > nz(filt[1]) ? (x - r < nz(filt[1]) ? nz(filt[1]) : x - r)
          : (x + r > nz(filt[1]) ? nz(filt[1]) : x + r)
    filt

filtx1  = rngfiltx1x1(close, smrngx1x)
filtx12 = rngfiltx1x1(close, smrngx1x2)

cloudColor = filtx1 > filtx12 ? color.rgb(254, 0, 0, 86) : color.rgb(21, 255, 0, 86)
lineColor  = color.rgb(0, 187, 212, 100)

plot1 = plot(CirrusCloud ? filtx1 : na, color=lineColor, linewidth=1, title='Trend Tracer 1')
plot2 = plot(CirrusCloud ? filtx12 : na, color=lineColor, linewidth=1, title='Trend Tracer 2')
fill(plot1, plot2, color=cloudColor)

G_SCRIPT01   = '■ ' + 'SAIYAN OCC'

res5                       = input.timeframe('15',  'TIMEFRAME', group ="NON REPAINT")
useRes                    = input(true,            'Use Alternate Signals')
intRes                    = input(10,               'Multiplier for Alernate Signals')
basisType                 = input.string('ALMA',   'MA Type: ', options=['TEMA', 'HullMA', 'ALMA'])
basisLen                  = input.int(50,           'MA Period', minval=1)
offsetSigma               = input.int(5,           'Offset for LSMA / Sigma for ALMA', minval=0)
offsetALMA                = input.float(2,      'Offset for ALMA', minval=0, step=0.01)
delayOffset               = input.int(0,           'Delay Open/Close MA', minval=0, step=1,
                  tooltip = 'Forces Non-Repainting')
tradeType                 = input.string('BOTH',   'What trades should be taken : ',
                  options = ['LONG', 'SHORT', 'BOTH', 'NONE'])

rsi_period               = input.int(28, 'RSI Period', minval=1, group="RSI Settings")
rsi_overbought           = input.int(65, 'RSI Overbought Level', minval=50, maxval=90, group="RSI Settings")
rsi_oversold             = input.int(35, 'RSI Oversold Level', minval=10, maxval=50, group="RSI Settings")
ema_period               = input.int(144, 'EMA Period', minval=1, group="RSI Settings")

show_basic_signals       = input.bool(true, 'Show Basic Signals', group="Display")
show_strong_signals      = input.bool(true, 'Show Strong Signals', group="Display")
show_rsi_confluence      = input.bool(false, 'Show RSI Confluence Only', group="Display")

h                         = input(false,           'Signals for Heikin Ashi Candles')

swing_length              = input.int(10,          'Swing High/Low Length', group = 'Settings', minval = 1, maxval = 50)
history_of_demand_to_keep = input.int(20,          'History To Keep', minval = 5, maxval = 50)
box_width                 = input.float(2.5,       'Supply/Demand Box Width', group = 'Settings', minval = 1, maxval = 10, step = 0.5)

f_array_add_pop(array, new_value_to_add) =>
    array.unshift(array, new_value_to_add)
    array.pop(array)

f_sh_sl_labels(array, swing_type) =>
    var string label_text = na
    if swing_type == 1
        if array.get(array, 0) >= array.get(array, 1)
            label_text := 'HH'
        else
            label_text := 'LH'
    else if swing_type == -1
        if array.get(array, 0) >= array.get(array, 1)
            label_text := 'HL'
        else
            label_text := 'LL'

f_check_overlapping(new_poi, box_array, atrValue) =>
    atr_threshold = atrValue * 2
    okay_to_draw = true
    for i = 0 to array.size(box_array) - 1
        top = box.get_top(array.get(box_array, i))
        bottom = box.get_bottom(array.get(box_array, i))
        poi = (top + bottom) / 2
        upper_boundary = poi + atr_threshold
        lower_boundary = poi - atr_threshold
        if new_poi >= lower_boundary and new_poi <= upper_boundary
            okay_to_draw := false
            break
        else 
            okay_to_draw := true
    okay_to_draw

f_supply_demand(value_array, bn_array, box_array, label_array, box_type, atrValue) =>
    atr_buffer = atrValue * (box_width / 10)
    box_left   = array.get(bn_array, 0)
    box_right  = bar_index
    var float box_top = 0.00
    var float box_bottom = 0.00
    var float poi = 0.00
    if box_type == 1
        box_top := array.get(value_array, 0)
        box_bottom := box_top - atr_buffer
        poi := (box_top + box_bottom) / 2
    else if box_type == -1
        box_bottom := array.get(value_array, 0)
        box_top := box_bottom + atr_buffer
        poi := (box_top + box_bottom) / 2
    okay_to_draw = f_check_overlapping(poi, box_array, atrValue)

f_sd_to_bos(box_array, bos_array, label_array, zone_type) =>
    if zone_type == 1
        for i = 0 to array.size(box_array) - 1
            level_to_break = box.get_top(array.get(box_array,i))
            if close >= level_to_break
                box.delete(array.get(box_array, i))
                box.delete(array.get(label_array, i))
    if zone_type == -1
        for i = 0 to array.size(box_array) - 1
            level_to_break = box.get_bottom(array.get(box_array,i))
            if close <= level_to_break
                box.delete(array.get(box_array, i))
                box.delete(array.get(label_array, i))

f_extend_box_endpoint(box_array) =>
    for i = 0 to array.size(box_array) - 1
        box.set_right(array.get(box_array, i), bar_index + 100)

stratRes = timeframe.ismonthly  ? str.tostring(timeframe.multiplier * intRes, '###M') :
           timeframe.isweekly   ? str.tostring(timeframe.multiplier * intRes, '###W') :
           timeframe.isdaily    ? str.tostring(timeframe.multiplier * intRes, '###D') :
           timeframe.isintraday ? str.tostring(timeframe.multiplier * intRes, '####') :
           '60'
src5      = h ? request.security(ticker.heikinashi(syminfo.tickerid),
           timeframe.period, close, lookahead = barmerge.lookahead_off) : close

atrValue5 = ta.atr(50)

swing_high = ta.pivothigh(high, swing_length, swing_length)
swing_low  = ta.pivotlow(low,   swing_length, swing_length)

var swing_high_values  = array.new_float(5,0.00)
var swing_low_values   = array.new_float(5,0.00)
var swing_high_bns     = array.new_int(5,0)
var swing_low_bns      = array.new_int(5,0)

var current_supply_box = array.new_box(history_of_demand_to_keep, na)
var current_demand_box = array.new_box(history_of_demand_to_keep, na)

var current_supply_poi = array.new_box(history_of_demand_to_keep, na)
var current_demand_poi = array.new_box(history_of_demand_to_keep, na)

var supply_bos         = array.new_box(5, na)
var demand_bos         = array.new_box(5, na)

if not na(swing_high)

    f_array_add_pop(swing_high_values, swing_high)
    f_array_add_pop(swing_high_bns, bar_index[swing_length])
    f_sh_sl_labels(swing_high_values, 1)
    f_supply_demand(swing_high_values, swing_high_bns, current_supply_box, current_supply_poi, 1, atrValue)

else if not na(swing_low)

    f_array_add_pop(swing_low_values, swing_low)
    f_array_add_pop(swing_low_bns, bar_index[swing_length])
    f_sh_sl_labels(swing_low_values, -1)
    f_supply_demand(swing_low_values, swing_low_bns, current_demand_box, current_demand_poi, -1, atrValue)

f_sd_to_bos(current_supply_box, supply_bos, current_supply_poi, 1)
f_sd_to_bos(current_demand_box, demand_bos, current_demand_poi, -1)

f_extend_box_endpoint(current_supply_box)
f_extend_box_endpoint(current_demand_box)

channelBal     = input.bool(false, "Channel Balance", group = "CHART")

rp_security(_symbol, _res, _src) =>
    request.security(_symbol, _res, _src[barstate.isrealtime ? 1 : 0])

htfHigh = rp_security(syminfo.tickerid, res, high)
htfLow  = rp_security(syminfo.tickerid, res, low)

enableSR   = input(false          , "SR On/Off", group="SR")
colorSup   = input(#00000000        , "Support Color", group="SR")
colorRes   = input(#00000000        , "Resistance Color", group="SR")
strengthSR = input.int(2          , "S/R Strength", 1, group="SR")
lineStyle  = input.string("Dotted", "Line Style", ["Solid", "Dotted", "Dashed"], group="SR")
lineWidth5  = input.int(2          , "S/R Line Width", 1, group="SR")
useZones   = input(true           , "Zones On/Off", group="SR")
useHLZones = input(true           , "High Low Zones On/Off", group="SR")
zoneWidth  = input.int(2          , "Zone Width %", 0,
   tooltip = "it's calculated using % of the distance between highest/lowest in last 300 bars", group="SR")
expandSR   = input(true           , "Expand SR")

reso(exp, use, res) =>
    security_1 = request.security(syminfo.tickerid, res, exp, gaps = barmerge.gaps_off, lookahead = barmerge.lookahead_on)
    use ? security_1 : exp

variant(type, src, len, offSig, offALMA) =>
    v1    = ta.sma(src, len)  // Simple
    v2    = ta.ema(src, len)  // Exponential
    v3    = 2 * v2 - ta.ema(v2, len)  // Double Exponential
    v4    = 3 * (v2 - ta.ema(v2, len)) + ta.ema(ta.ema(v2, len), len)  // Triple Exponential
    v5    = ta.wma(src, len)  // Weighted
    v6    = ta.vwma(src, len)  // Volume Weighted
    v7    = 0.0
    sma_1 = ta.sma(src, len)  // Smoothed
    v7   := na(v7[1]) ? sma_1 : (v7[1] * (len - 1) + src) / len
    v8    = ta.wma(2 * ta.wma(src, len / 2) - ta.wma(src, len), math.round(math.sqrt(len)))  // Hull
    v9    = ta.linreg(src, len, offSig)  // Least Squares
    v10   = ta.alma(src, len, offALMA, offSig)  // Arnaud Legoux
    v11   = ta.sma(v1, len)  // Triangular (extreme smooth)

    a1    = math.exp(-1.414 * 3.14159 / len)
    b1    = 2 * a1 * math.cos(1.414 * 3.14159 / len)
    c2    = b1
    c3    = -a1 * a1
    c1    = 1 - c2 - c3
    v12   = 0.0
    v12  := c1 * (src + nz(src[1])) / 2 + c2 * nz(v12[1]) + c3 * nz(v12[2])
    type == 'EMA' ? v2 : type == 'DEMA' ? v3 : type == 'TEMA' ? v4 : type == 'WMA' ? v5 : type == 'VWMA' ? v6 : type == 'SMMA' ? v7 : type == 'HullMA' ? v8 : type == 'LSMA' ? v9 : type == 'ALMA' ? v10 : type == 'TMA' ? v11 : type == 'SSMA' ? v12 : v1

closeSeries = variant(basisType, close[delayOffset], basisLen, offsetSigma, offsetALMA)
openSeries  = variant(basisType, open[delayOffset],  basisLen, offsetSigma, offsetALMA)

closeSeriesAlt = reso(closeSeries, useRes, stratRes)
openSeriesAlt  = reso(openSeries, useRes, stratRes)

leTrigger    = ta.crossover (closeSeriesAlt, openSeriesAlt)
seTrigger    = ta.crossunder(closeSeriesAlt, openSeriesAlt)

rsi       = ta.rsi(close, rsi_period)
rsi_ema   = ta.ema(rsi, 10)
ema       = ta.ema(close, ema_period)

rsiOb     = rsi > rsi_overbought and rsi > rsi_ema
rsiOs     = rsi < rsi_oversold and rsi < rsi_ema

price_above_ema = close > ema
price_below_ema = close < ema

rsi_bullish = rsiOs or (rsi < 50 and price_above_ema)
rsi_bearish = rsiOb or (rsi > 50 and price_below_ema)

strong_buy = leTrigger and rsi_bullish
strong_sell = seTrigger and rsi_bearish

show_le = show_basic_signals and (show_rsi_confluence ? strong_buy : leTrigger)
show_se = show_basic_signals and (show_rsi_confluence ? strong_sell : seTrigger)

plotshape(show_le, title='Long Signal', text='△', textcolor=color.white, 
          color=#008000, style=shape.labelup, size=size.tiny, location=location.belowbar)
plotshape(show_se, title='Short Signal', text='▽', textcolor=color.white, 
          color=#ff0034, style=shape.labeldown, size=size.tiny, location=location.abovebar)

plotshape(show_strong_signals and strong_buy, title='Strong Buy', text='STRONG', textcolor=color.white, 
          color=color.lime, style=shape.labelup, size=size.tiny, location=location.belowbar)
plotshape(show_strong_signals and strong_sell, title='Strong Sell', text='STRONG', textcolor=color.white, 
          color=color.maroon, style=shape.labeldown, size=size.tiny, location=location.abovebar)

plot(rsi, title="RSI", display=display.data_window, color=color.blue)
plot(rsi_ema, title="RSI EMA", display=display.data_window, color=color.orange)

alertcondition(leTrigger, title="Long Entry Alert", message="Long Signal")
alertcondition(seTrigger, title="Short Entry Alert", message="Short Signal") 
alertcondition(strong_buy, title="Strong Buy Alert", message="Strong Buy Signal")
alertcondition(strong_sell, title="Strong Sell Alert", message="Strong Sell Signal")

const bool DEBUG = false
const int maxDistanceToLastBar = 5000
const int labelCooldown = 8
const int KDELimit = 300

rsiLengthInput = input.int(14, minval = 1, title="RSI Length", group="RSI Settings")
rsiSourceInput = input.source(close, "Source", group="RSI Settings")

highPivotLen = input.int(21,  "High Pivot Length", minval = 1, group = "Pivots", display = display.none)
lowPivotLen = input.int(21, "Low Pivot Length", minval = 1, group = "Pivots", display = display.none)
realPivotLabels = DEBUG ? input.bool(false, "[DBG] Real Pivot Labels", group = "Pivots") : false
kdePivotLabels = DEBUG ? input.bool(false, "[DBG] KDE Pivot Labels", group = "Pivots") : false

activationThresholdStr = input.string("Medium", "Activation Threshold", options = ["High", "Medium", "Low"], group = "KDE", tooltip = "Determines the amount of arrows shown. Higher options will result in more arrows being rendered.")
string KDEKernel = input.string("Gaussian", "Kernel", options=['Uniform', 'Gaussian', 'Sigmoid'], group = "KDE", tooltip = "The kernel function for KDE calculation. Gaussian is a commonly used kernel and is based on normal distribution.")
float KDEBandwidth = input.float(2.71828, "Bandwidth", group = "KDE", tooltip = "This setting sets the smoothness of the KDE function output.")
int KDEStep = input.int(100, "Nº Bins", minval = 1, group = "KDE", tooltip = "The number of elements the KDE Probability array will have. Higher settings will result in greater precision.")
activationThreshold = DEBUG ? input.float(0.25, "[DBG] Activation Threshold", group = "KDE") : 0.25
if not DEBUG
    activationThreshold := (activationThresholdStr == "High" ? 0.4 : activationThresholdStr == "Medium" ? 0.25 : 0.15)
probMode = DEBUG ? input.string("Sum", '[DBG] Probability Mode', options = ["Sum", "Nearest"], group = "KDE") : "Sum"
minPadding = DEBUG ? input.bool(false, '[DBG] KDE Min Padding', group = "KDE") : false

bearishColor = input.color(#ff0000, "High Pivots", group = "Style", inline = "col", display = display.none)
neutralColor = input.color(color.gray, "Neutral", group = "Style", inline = "col", display = display.none)
bullishColor = input.color(#00FF00, "Low Pivots", group = "Style", inline = "col", display = display.none)
textColor = input.color(color.white, 'Text', group = 'Style', inline = "col", display = display.none)
RSILabelsEnabled = input.bool(true, "RSI Labels", group = "Style")
KDELabelsEnabled = input.bool(true, "KDE Labels", group = "Style")

rsi_kernel_optimized = ta.rsi(rsiSourceInput, rsiLengthInput)

gaussian (float distance, float bandwidth = 1.0) => 1.0 / math.sqrt(2.0 * math.pi) * math.pow(math.e, -0.5 * math.pow(distance / bandwidth, 2.0))
uniform (float distance, float bandwidth = 1.0) => (math.abs(distance) > bandwidth) ? 0.0 : 0.5
sigmoid (float distance, float bandwidth = 1.0) => 2.0 / math.pi * (1.0 / (math.pow(math.e, (distance / bandwidth)) + math.pow(math.e, -(distance / bandwidth))))

kde (array<float> arr, string kernel, float bandwidth, int steps) =>
    arrSize = arr.size()
    arrRange = arr.range()
    arrMin = arr.min() - (minPadding ? (arrRange / 2.0) : 0)
    stepCount = arrRange / steps

    densityRange = array.new<float>(steps * 2)
    for i = 0 to (steps * 2) - 1
        densityRange.set(i, arrMin + i * stepCount)

    xArr = array.new<float>()
    yArr = array.new<float>()
    for i = 0 to densityRange.size() - 1
        float temp = 0
        for j = 0 to arr.size() - 1
            switch KDEKernel
                "Gaussian" => temp += gaussian(densityRange.get(i) - arr.get(j), 1.0 / bandwidth)
                "Uniform" => temp += uniform(densityRange.get(i) - arr.get(j), 1.0 / bandwidth)
                "Sigmoid" => temp += sigmoid(densityRange.get(i) - arr.get(j), 1.0 / bandwidth)

        xArr.push(densityRange.get(i))
        yArr.push(1.0 / arrSize * temp)
    [xArr, yArr]

prefixSum (array<float> arr, int l, int r) =>
    arr.get(r) - (l == 0 ? 0 : arr.get(l - 1))

float MidKDEHigh = na
float MidKDELow = na

var array<float> KDEHighX = na
var array<float> KDEHighY = na
var array<float> KDEHighYSum = array.new<float>()

var array<float> KDELowX = na
var array<float> KDELowY = na
var array<float> KDELowYSum = array.new<float>()

highPivot = ta.pivothigh(highPivotLen, highPivotLen)
lowPivot = ta.pivotlow(lowPivotLen, lowPivotLen)

var highPivotRSIs = array.new<float>()
var lowPivotRSIs = array.new<float>()

if not na(highPivot)
    if highPivotRSIs.size() > KDELimit
        highPivotRSIs.remove(0)
    highPivotRSIs.push(rsi_kernel_optimized[highPivotLen])

    [KDEHi

Показано первые 50% кода (символов: 73573)

Открыть по тарифу

Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.

Разовая покупка файла

На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.

Чтобы оформить заказ, введите email и перейдите к оплате.

Стоимость полного кода
7 357,30₽ ≈ $89.92