PRO V6
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «pro v6.pine» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.