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

RiViL Lin&Hull & Heel&Toe

indicator_rivil_lin&hull_&_heel&toe_for_tradingview_5969999791206177898.pine
Вы автор или правообладатель?

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

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

О программе

Индикатор «RiViL Lin&Hull & Heel&Toe» — это наложенный индикатор для TradingView (Pine Script v5), объединяющий три аналитических модуля. Первый модуль (RiViL Lin&Hull) строит регрессионный канал с настраиваемой длиной и отклонением, отображает метки направления тренда и опционально показывает уровни Фибоначчи внутри канала. Он также включает Hull-скользящую среднюю с визуальными сигналами пересечения ценой. Второй модуль (Heel&Toe) рассчитывает точки разворота (pivot points) шестью методами (Traditional, Fibonacci, Woodie, Classic, DeMark, Camarilla) на разных таймфреймах, отрисовывая уровни поддержки и сопротивления в виде линий и подписей. Третий компонент отображает уровни, основанные на локальных максимумах/минимумах, и полосы на основе EMA с метками AL/SAT. Индикатор поддерживает настраиваемые цвета, толщину линий, переключатели видимости и условия оповещений TradingView для пробоя канала, смены тренда и пересечений Hull MA.

Модуль Heel&Toe получает данные нужного таймфрейма через request.security и позволяет выбрать базу расчёта (дневные или интрадей значения). Пользователь может задать количество отображаемых исторических разворотов и расположение подписей. Все линии и метки обновляются при смене соответствующего периода. Индикатор не является автоматическим советником — он не совершает симуляцию сделок и не работает в тестере стратегий.

Встроенный дашборд отображает ссылку на Telegram-канал разработчика. Общая функциональность сосредоточена на визуальном анализе: отображении трендов, уровней, каналов и сигналов пересечения на графике цены.

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

НастройкаОписание
src Источник — Источник данных для расчёта канала RiViL Lin&Hull.
len Длина — Длина периода для расчёта канала RiViL Lin&Hull.
devlen Отклонение — Множитель отклонения для расчёта ширины канала.
extendit Продление линий — Включает или отключает продление линий канала вправо.
showfibo Показать уровни Фибоначчи — Включает или отключает отображение уровней Фибоначчи внутри канала.
showbroken Показать пробитый канал — Отображает пробитые линии канала пунктирным стилем.
brokencol Цвет пробитого канала — Цвет отображения пробитого канала.
upcol Цвет восходящего тренда — Цвет отображения восходящего тренда.
dncol Цвет нисходящего тренда — Цвет отображения нисходящего тренда.
widt Толщина линий — Толщина линий канала.
length Длина Hull MA — Период для расчёта Hull-скользящей средней.
price Источник Hull MA — Источник данных для расчёта Hull-скользящей средней.
showCrossovers Показать пересечения — Отображает графические маркеры пересечения цены и Hull-скользящей средней.
kind Тип расчёта — Метод расчёта точек разворота: Traditional, Fibonacci, Woodie, Classic, DeMark или Camarilla.
pivot_time_frame Таймфрейм точек разворота — Таймфрейм для расчёта точек разворота: Auto, Daily, Weekly, Monthly и другие.
look_back Количество точек разворота назад — Количество исторических точек разворота, отображаемых на графике.
is_daily_based Использовать дневные значения — Использовать дневные значения при расчёте точек разворота на интрадей-графиках.
show_labels Показать подписи — Включает или отключает отображение подписей уровней точек разворота.
position_labels Расположение подписей — Расположение подписей уровней: Left или Right.
p_show Показать P — Включает или отключает отображение центральной точки разворота (P).
p_color Цвет P — Цвет линий и подписей центральной точки разворота (P).
s1r1_show Показать S1/R1 — Включает или отключает отображение уровней S1/R1.
s1r1_color Цвет S1/R1 — Цвет линий и подписей уровней S1/R1.
s2r2_show Показать S2/R2 — Включает или отключает отображение уровней S2/R2.
s2r2_color Цвет S2/R2 — Цвет линий и подписей уровней S2/R2.
s3r3_show Показать S3/R3 — Включает или отключает отображение уровней S3/R3.
s3r3_color Цвет S3/R3 — Цвет линий и подписей уровней S3/R3.
s4r4_show Показать S4/R4 — Включает или отключает отображение уровней S4/R4.
s4r4_color Цвет S4/R4 — Цвет линий и подписей уровней S4/R4.
s5r5_show Показать S5/R5 — Включает или отключает отображение уровней S5/R5.
s5r5_color Цвет S5/R5 — Цвет линий и подписей уровней S5/R5.
lengthh Длина EMA — Период для расчёта EMA верхней и нижней полос.
Получить полный код

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

indicator(title = 'RiViL Lin&Hull & Heel&Toe', shorttitle = 'RiViL Lin&Hull & Heel&Toe', overlay=true, max_bars_back=1000, max_lines_count=300)

src = input(defval=close, title='Source', group='RiViL Lin&Hull (RLH)')
len = input.int(defval=100, title='Length', minval=10, group='RiViL Lin&Hull (RLH)')
devlen = input.float(defval=2., title='Deviation', minval=0.1, step=0.1, group='RiViL Lin&Hull (RLH)')
extendit = input(defval=true, title='Extend Lines', group='RiViL Lin&Hull (RLH)')
showfibo = input(defval=false, title='Show Fibonacci Levels', group='RiViL Lin&Hull (RLH)')
showbroken = input.bool(defval=true, title='Show Broken Channel', inline='brk', group='RiViL Lin&Hull (RLH)')
brokencol = input.color(defval=color.blue, title='', inline='brk', group='RiViL Lin&Hull (RLH)')
upcol = input.color(defval=color.lime, title='Up/Down Trend Colors', inline='trcols', group='RiViL Lin&Hull (RLH)')
dncol = input.color(defval=color.red, title='', inline='trcols', group='RiViL Lin&Hull (RLH)')
widt = input(defval=2, title='Line Width', group='RiViL Lin&Hull (RLH)')

var fibo_ratios = array.new_float(0)
var colors = array.new_color(2)
if barstate.isfirst
    array.unshift(colors, upcol)
    array.unshift(colors, dncol)
    array.push(fibo_ratios, 0.236)
    array.push(fibo_ratios, 0.382)
    array.push(fibo_ratios, 0.618)
    array.push(fibo_ratios, 0.786)

get_channel(src, len) =>
    mid = math.sum(src, len) / len
    slope = ta.linreg(src, len, 0) - ta.linreg(src, len, 1)
    intercept = mid - slope * math.floor(len / 2) + (1 - len % 2) / 2 * slope
    endy = intercept + slope * (len - 1)
    dev = 0.0
    for x = 0 to len - 1 by 1
        dev += math.pow(src[x] - (slope * (len - x) + intercept), 2)
        dev
    dev := math.sqrt(dev / len)
    [intercept, endy, dev, slope]

[y1_, y2_, dev, slope] = get_channel(src, len)

outofchannel = slope > 0 and close < y2_ - dev * devlen ? 0 : slope < 0 and close > y2_ + dev * devlen ? 2 : -1

var reglines = array.new_line(3)
var fibolines = array.new_line(4)
for x = 0 to 2 by 1
    if not showbroken or outofchannel != x or nz(outofchannel[1], -1) != -1
        line.delete(array.get(reglines, x))
    else
        line.set_color(array.get(reglines, x), color=brokencol)
        line.set_width(array.get(reglines, x), width=2)
        line.set_style(array.get(reglines, x), style=line.style_dotted)
        line.set_extend(array.get(reglines, x), extend=extend.none)

    array.set(reglines, x, line.new(x1=bar_index - (len - 1), y1=y1_ + dev * devlen * (x - 1), x2=bar_index, y2=y2_ + dev * devlen * (x - 1), color=array.get(colors, math.round(math.max(math.sign(slope), 0))), style=x % 2 == 1 ? line.style_solid : line.style_dashed, width=widt, extend=extendit ? extend.right : extend.none))
if showfibo
    for x = 0 to 3 by 1
        line.delete(array.get(fibolines, x))
        array.set(fibolines, x, line.new(x1=bar_index - (len - 1), y1=y1_ - dev * devlen + dev * devlen * 2 * array.get(fibo_ratios, x), x2=bar_index, y2=y2_ - dev * devlen + dev * devlen * 2 * array.get(fibo_ratios, x), color=array.get(colors, math.round(math.max(math.sign(slope), 0))), style=line.style_dotted, width=widt, extend=extendit ? extend.right : extend.none))

var label sidelab = label.new(x=bar_index - (len - 1), y=y1_, text='S', size=size.large)
txt = slope > 0 ? slope > slope[1] ? '⇑' : '⇗' : slope < 0 ? slope < slope[1] ? '⇓' : '⇘' : '⇒'
stl = slope > 0 ? slope > slope[1] ? label.style_label_up : label.style_label_upper_right : slope < 0 ? slope < slope[1] ? label.style_label_down : label.style_label_lower_right : label.style_label_right
label.set_style(sidelab, stl)
label.set_text(sidelab, txt)
label.set_x(sidelab, bar_index - (len - 1))
label.set_y(sidelab, slope > 0 ? y1_ - dev * devlen : slope < 0 ? y1_ + dev * devlen : y1_)
label.set_color(sidelab, slope > 0 ? upcol : slope < 0 ? dncol : color.blue)

alertcondition(outofchannel, title='Channel Broken', message='Channel Broken')

trendisup = math.sign(slope) != math.sign(slope[1]) and slope > 0
trendisdown = math.sign(slope) != math.sign(slope[1]) and slope < 0
alertcondition(trendisup, title='Up trend', message='Up trend')
alertcondition(trendisdown, title='Down trend', message='Down trend')

length = input.int(16, minval=1)
price = input(ohlc4, title='Source')
showCrossovers = input(true, title='Show crossovers')
hull = ta.wma(2 * ta.wma(price, length / 2) - ta.wma(price, length), math.round(math.sqrt(length)))
plot(hull, title='Hull', color=ta.change(hull) < 0 ? #ff0000 : #00ff0a, linewidth=2, transp=0)

plotshape(showCrossovers and ta.crossover(price, hull), color=color.new(#00ff0a, 0), style=shape.circle, location=location.belowbar)
plotshape(showCrossovers and ta.crossunder(price, hull), color=color.new(#ff0000, 0), style=shape.circle, location=location.abovebar)

alertcondition(ta.crossover(price, hull) or ta.crossunder(price, hull), title='Hull MA cross', message='Hull cross - {{exchange}}:{{ticker}}, Price = {{price}}, Hull = {{hull}}, Volume = {{volume}}, Time =  {{timenow}}')
alertcondition(ta.crossunder(price, hull), title='Hull MA sell', message='Hull sell')
alertcondition(ta.crossover(price, hull), title='Hull MA buy', message='Hull buy')

AUTO = "Auto"
DAILY = "Daily"
WEEKLY = "Weekly"
MONTHLY = "Monthly"
QUARTERLY = "Quarterly"
YEARLY = "Yearly"
BIYEARLY = "Biyearly"
TRIYEARLY = "Triyearly"
QUINQUENNIALLY = "Quinquennially"
DECENNIALLY = "Decennially"

TRADITIONAL = "Traditional"
FIBONACCI = "Fibonacci"
WOODIE = "Woodie"
CLASSIC = "Classic"
DEMARK = "DM"
CAMARILLA = "Camarilla"

kind = input.string(title="Type", defval="Traditional", options=[TRADITIONAL, FIBONACCI, WOODIE, CLASSIC, DEMARK, CAMARILLA], group='Heel&Toe')
pivot_time_frame = input.string(title="Pivots Timeframe", defval=AUTO, options=[AUTO, DAILY, WEEKLY, MONTHLY, QUARTERLY, YEARLY, BIYEARLY, TRIYEARLY, QUINQUENNIALLY, DECENNIALLY], group='Heel&Toe')
look_back = input.int(title="Number of Pivots Back", defval=15, minval=1, maxval=5000, group='Heel&Toe')
is_daily_based = input.bool(title="Use Daily-based Values", defval=true, tooltip="When this option is unchecked, Pivot Points will use intraday data while calculating on intraday charts. If Extended Hours are displayed on the chart, they will be taken into account during the pivot level calculation. If intraday OHLC values are different from daily-based values (normal for stocks), the pivot levels will also differ.", group='Heel&Toe')
show_labels = input.bool(title="Show Labels", defval=true, inline="labels", group='Heel&Toe')
position_labels = input.string("Left", "", options=["Left", "Right"], inline="labels", group='Heel&Toe')

var DEF_COLOR = color.blue
var arr_time = array.new_int()
var p = array.new_float()
p_show = input.bool(true, "P‏  ‏  ‏  ‏  ‏  ‏  ‏  ‏", inline="P")
p_color = input.color(DEF_COLOR, "", inline="P")
var r1 = array.new_float()
var s1 = array.new_float()
s1r1_show = input.bool(true, "S1/R1", inline="S1/R1")
s1r1_color = input.color(DEF_COLOR, "", inline="S1/R1")
var r2 = array.new_float()
var s2 = array.new_float()
s2r2_show = input.bool(true, "S2/R2", inline="S2/R2")
s2r2_color = input.color(DEF_COLOR, "", inline="S2/R2")
var r3 = array.new_float()
var s3 = array.new_float()
s3r3_show = input.bool(true, "S3/R3", inline="S3/R3")
s3r3_color = input.color(DEF_COLOR, "", inline="S3/R3")
var r4 = array.new_float()
var s4 = array.new_float()
s4r4_show = input.bool(true, "S4/R4", inline="S4/R4")
s4r4_color = input.color(DEF_COLOR, "", inline="S4/R4")
var r5 = array.new_float()
var s5 = array.new_float()
s5r5_show = input.bool(true, "S5/R5", inline="S5/R5")
s5r5_color = input.color(DEF_COLOR, "", inline="S5/R5")
pivotX_open = float(na)
pivotX_open := nz(pivotX_open[1], open)
pivotX_high = float(na)
pivotX_high := nz(pivotX_high[1], high)
pivotX_low = float(na)
pivotX_low := nz(pivotX_low[1], low)
pivotX_prev_open = float(na)
pivotX_prev_open := nz(pivotX_prev_open[1])
pivotX_prev_high = float(na)
pivotX_prev_high := nz(pivotX_prev_high[1])
pivotX_prev_low = float(na)
pivotX_prev_low := nz(pivotX_prev_low[1])
pivotX_prev_close = float(na)
pivotX_prev_close := nz(pivotX_prev_close[1])

get_pivot_resolution() =>
    resolution = "M"
    if pivot_time_frame == AUTO
        if timeframe.isintraday
            resolution := timeframe.multiplier <= 15 ? "D" : "W"
        else if timeframe.isweekly or timeframe.ismonthly
            resolution := "12M"
    else if pivot_time_frame == DAILY
        resolution := "D"
    else if pivot_time_frame == WEEKLY
        resolution := "W"
    else if pivot_time_frame == MONTHLY
        resolution := "M"
    else if pivot_time_frame == QUARTERLY
        resolution := "3M"
    else if pivot_time_frame == YEARLY or pivot_time_frame == BIYEARLY or pivot_time_frame == TRIYEARLY or pivot_time_frame == QUINQUENNIALLY or pivot_time_frame == DECENNIALLY
        resolution := "12M"
    resolution

var lines = array.new_line()
var labels = array.new_label()

draw_line(i, pivot, col) =>
    if array.size(arr_time) > 1
        array.push(lines, line.new(array.get(arr_time, i), array.get(pivot, i), array.get(arr_time, i + 1), array.get(pivot, i), color=col, xloc=xloc.bar_time))

draw_label(i, y, txt, txt_color) =>
    if show_labels
        offset = '‏  ‏  ‏  ‏  ‏'
        labels_align_str_left= position_labels == "Left" ? txt + offset : offset + txt
        x = position_labels == "Left" ? array.get(arr_time, i) : array.get(arr_time, i + 1)
        array.push(labels, label.new(x = x, y=y, text=labels_align_str_left, textcolor=txt_color, style=label.style_label_center, color=#00000000, xloc=xloc.bar_time))

traditional() =>
    pivotX_Median = (pivotX_prev_high + pivotX_prev_low + pivotX_prev_close) / 3
    array.push(p, pivotX_Median)
    array.push(r1, pivotX_Median * 2 - pivotX_prev_low)
    array.push(s1, pivotX_Median * 2 - pivotX_prev_high)
    array.push(r2, pivotX_Median + 1 * (pivotX_prev_high - pivotX_prev_low))
    array.push(s2, pivotX_Median - 1 * (pivotX_prev_high - pivotX_prev_low))
    array.push(r3, pivotX_Median * 2 + (pivotX_prev_high - 2 * pivotX_prev_low))
    array.push(s3, pivotX_Median * 2 - (2 * pivotX_prev_high - pivotX_prev_low))
    array.push(r4, pivotX_Median * 3 + (pivotX_prev_high - 3 * pivotX_prev_low))
    array.push(s4, pivotX_Median * 3 - (3 * pivotX_prev_high - pivotX_prev_low))
    array.push(r5, pivotX_Median * 4 + (pivotX_prev_high - 4 * pivotX_prev_low))
    array.push(s5, pivotX_Median * 4 - (4 * pivotX_prev_high - pivotX_prev_low))

fibonacci() =>
    pivotX_Median = (pivotX_prev_high + pivotX_prev_low + pivotX_prev_close) / 3
    pivot_range = pivotX_prev_high - pivotX_prev_low
    array.push(p, pivotX_Median)
    array.push(r1, pivotX_Median + 0.382 * pivot_range)
    array.push(s1, pivotX_Median - 0.382 * pivot_range)
    array.push(r2, pivotX_Median + 0.618 * pivot_range)
    array.push(s2, pivotX_Median - 0.618 * pivot_range)
    array.push(r3, pivotX_Median + 1 * pivot_range)
    array.push(s3, pivotX_

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

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

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

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

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

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

Стоимость полного кода
1 796,50₽ ≈ $21.96