Viru Trend Dynamics
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «indicator viru trend dynamics for tradingview.pine» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
«Viru Trend Dynamics» — индикатор для TradingView, написанный на Pine Script v6 и отображаемый поверх графика. Он рассчитывает трендовую базовую линию по методу ALMA и формирует каналы отклонений на основе стандартного отклонения, визуализируя текущий тренд цветной линией и заливкой между верхней и нижней границами.
Индикатор определяет бычьи и медвежьи сигналы по сочетанию наклона трендовой базовой линии (в единицах ATR) и положения цены за пределами канала. При подтверждении сигнала на графике появляются маркеры входа, а также горизонтальные линии входа, стоп-лосса и тейк-профита. После выхода из позиции индикатор ожидает следующего подтверждённого свеча перед повторным входом.
Поддерживаются скользящие стоп-лоссы двух методов — на основе ATR и ALMA, с возможностью задания активационного уровня в R. Доступна фильтрация входов по торговой сессии и часовому поясу, настраиваемое соотношение риск/прибыль, цветовое оформление элементов и информационная панель мониторинга. Индикатор отслеживает виртуальные позиции и поддерживает условия оповещений для различных событий.
Настройки программы
| Настройка | Описание |
|---|---|
| src | Источник данных для расчётов индикатора. По умолчанию используется цена закрытия свечи. |
| trendLength | Длина (количество свечей) для расчёта трендовой базовой линии по методу ALMA. |
| trendOffset | Параметр смещения для расчёта ALMA, определяющий вес ближайших свечей. Значение от 0 до 1. |
| trendSigma | Параметр сигма для расчёта ALMA, влияющий на ширину гауссова ядра сглаживания. Минимальное значение 0.1. |
| devLength | Период расчёта стандартного отклонения, используемого для построения канала отклонений от трендовой базовой линии. |
| bandMultiplier | Множитель стандартного отклонения для формирования верхней и нижней границ подтверждающего канала. Определяет ширину трендовой ленты. |
| slopeLength | Период (в свечах) для расчёта наклона трендовой базовой линии, используемого при формировании сигналов. |
| minimumSlope | Минимальный наклон трендовой базовой линии (в ATR) для формирования бычьего или медвежьего сигнала. |
| atrLength | Период расчёта индикатора ATR (Average True Range), используемого для определения волатильности и расстояния стоп-лосса. |
| stopLookback | Количество свечей назад для поиска предыдущего структурного максимума и минимума при определении начального уровня стоп-лосса. |
| minimumATR | Минимальное расстояние стоп-лосса, выраженное в кратности ATR. Ограничивает нижнюю границу расчёта расстояния защиты. |
| maximumATR | Максимальное расстояние стоп-лосса, выраженное в кратности ATR. Ограничивает верхнюю границу расчёта расстояния защиты. |
| targetChoice | Соотношение риска и прибыли (Risk:Reward) для фиксированного тейк-профита. Доступны варианты от 1:1 до 1:6, а также режим «Trail only» (только скользящий стоп без фиксированной цели). |
| enableTrail | Логический переключатель для включения или отключения скользящего стоп-лосса. При отключении используется только фиксированный стоп и тейк-профит. |
| trailingMethod | Метод расчёта скользящего стоп-лосса. Доступны варианты «ATR» (на основе экстремума и ATR) и «ALMA» (на основе трендовой базовой линии с буфером). |
| activationR | Множитель R для активации скользящего стопа. Скользящий стоп начинает работать после того, как пост-выходной экстремум достигает указанного благоприятного уровня в R от входа. |
| trailMultiplier | Множитель расстояния ATR для расчёта уровня скользящего стопа в ATR-режиме. Используется для определения отступа от экстремума. |
| almaBufferATR | Буфер ATR для ALMA-метода скользящего стопа. Используется для смещения расчётной точки стопа от трендовой базовой линии в сторону от рынка. При нулевом значении буфер не применяется. |
| directionChoice | Направление торговли: возможны варианты «Both» (оба направления), «Long only» (только лонг), «Short only» (только шорт). |
| useSession | Логический переключатель для ограничения входов в позиции указанной торговой сессией. Работает только на внутридневных графиках. |
| entrySession | Временной диапазон торговой сессии для ограничения входов в позиции. Используется в формате HHMM-HHMM. |
| timezone | Часовой пояс, в котором интерпретируется временной диапазон торговой сессии для фильтрации входов. |
| showBands | Логический переключатель для отображения или скрытия трендовой ленты (верхней и нижней границ канала) на графике. |
| showLevels | Логический переключатель для отображения или скрытия горизонтальных линий входа, стоп-лосса и тейк-профита на графике. |
| showExitMarkers | Логический переключатель для отображения или скрытия графических маркеров выхода из позиции на графике. |
| showDashboard | Логический переключатель для отображения или скрытия информационной панели мониторинга в углу графика. |
| bullColor | Цвет отображения бычьих элементов индикатора на графике. |
| bearColor | Цвет отображения медвежьих элементов индикатора на графике. |
| targetColor | Цвет маркера выхода по тейк-профиту на графике. |
| stopColor | Цвет маркера начального (нескользящего) стоп-лосса на графике. |
| trailColor | Цвет маркера скользящего выхода на графике. |
Поиск по коду файла
indicator("Viru Trend Dynamics", overlay=true,
max_lines_count=500, max_labels_count=500)
string g1 = "1 • Trend Settings"
src = input.source(close, "Source", group=g1)
trendLength = input.int(34, "Trend Length", minval=5, group=g1)
trendOffset = input.float(0.85, "Trend Offset",
minval=0, maxval=1, group=g1)
trendSigma = input.float(6, "Trend Sigma", minval=0.1, group=g1)
devLength = input.int(34, "Deviation Length", minval=5, group=g1)
bandMultiplier = input.float(0.65, "Confirmation Band",
minval=0, group=g1)
slopeLength = input.int(3, "Slope Lookback", minval=1, group=g1)
minimumSlope = input.float(0.08, "Minimum Slope / ATR",
minval=0, group=g1)
atrLength = input.int(14, "ATR Length", minval=1, group=g1)
string g2 = "2 • Initial Stop"
stopLookback = input.int(12, "Prior Structure Lookback",
minval=1, group=g2)
minimumATR = input.float(0.75, "Minimum SL Distance — ATR",
minval=0.01, group=g2)
maximumATR = input.float(3, "Maximum SL Distance — ATR",
minval=0.01, group=g2)
string g3 = "3 • Target and Trailing"
targetChoice = input.string("1:3", "Target Risk : Reward",
options=["1:1", "1:2", "1:3", "1:4", "1:5", "1:6", "Trail only"],
group=g3)
enableTrail = input.bool(true, "Enable Trailing SL", group=g3)
trailingMethod = input.string("ATR", "Trailing Method",
options=["ATR", "ALMA"], group=g3)
activationR = input.float(2, "Trail Activation — R",
minval=0.1, step=0.25, group=g3,
tooltip="Activates after the post-entry high/low reaches this favourable R multiple.")
trailMultiplier = input.float(2, "ATR Method: Distance Multiplier",
minval=0.1, step=0.25, group=g3,
tooltip="Used only in ATR mode. Long: highest high minus ATR distance. Short: lowest low plus ATR distance.")
almaBufferATR = input.float(0.25, "ALMA Method: Buffer — ATR",
minval=0, step=0.05, group=g3,
tooltip="Used only in ALMA mode. Long: ALMA minus buffer × ATR. Short: ALMA plus buffer × ATR. Zero uses ALMA directly.")
float rr = switch targetChoice
"1:1" => 1.0
"1:2" => 2.0
"1:3" => 3.0
"1:4" => 4.0
"1:5" => 5.0
"1:6" => 6.0
=> na
bool fixedTarget = targetChoice != "Trail only"
bool trailingEnabled = enableTrail or not fixedTarget
string g4 = "4 • Entry Filters"
directionChoice = input.string("Both", "Direction",
options=["Both", "Long only", "Short only"], group=g4)
useSession = input.bool(false, "Restrict Entry Session", group=g4)
entrySession = input.session("0915-1530", "Entry Session", group=g4)
timezone = input.string("Asia/Kolkata", "Session Timezone", group=g4)
string g5 = "5 • Display"
showBands = input.bool(true, "Show Trend Ribbon", group=g5)
showLevels = input.bool(true, "Show Trade Levels", group=g5)
showExitMarkers = input.bool(true, "Show Exit Symbols", group=g5)
showDashboard = input.bool(true, "Show Dashboard", group=g5)
bullColor = input.color(#00897B, "Bull Colour", group=g5)
bearColor = input.color(#E53935, "Bear Colour", group=g5)
targetColor = input.color(#2E7D32, "Target Exit Colour", group=g5)
stopColor = input.color(#D32F2F, "Initial SL Exit Colour", group=g5)
trailColor = input.color(#F9A825, "Trailing Exit Colour", group=g5)
if barstate.isfirst
if minimumATR > maximumATR
runtime.error("Minimum SL ATR must be <= Maximum SL ATR.")
if useSession and not timeframe.isintraday
runtime.error("Session filtering requires an intraday chart.")
float basis = ta.alma(src, trendLength, trendOffset, trendSigma)
float deviation = ta.stdev(src, devLength)
float atr = ta.atr(atrLength)
float upper = basis + deviation * bandMultiplier
float lower = basis - deviation * bandMultiplier
float priorLow = ta.lowest(low, stopLookback)[1]
float priorHigh = ta.highest(high, stopLookback)[1]
float slope = atr > 0 ?
(basis - basis[slopeLength]) / atr : 0
bool ready = not na(basis[slopeLength]) and
not na(deviation) and not na(priorLow) and
not na(priorHigh) and atr > 0
bool bullishSetup = ready and
slope > minimumSlope and close > upper
bool bearishSetup = ready and
slope < -minimumSlope and close < lower
bool sessionOK = not useSession or
not na(time(timeframe.period, entrySession, timezone))
var int visualTrend = 0
var int activeDirection = 0
var int entryBar = na
var int lastExitBar = na
var float entry = na
var float riskDistance = na
var float protectiveStop = na
var float target = na
var float extreme = na
var bool trailActive = false
var bool stopWasTrailed = false
var string status = "WAITING"
var line entryLine = na
var line stopLine = na
var line targetLine = na
bool buySignal = false
bool sellSignal = false
bool stopExit = false
bool targetExit = false
bool trailCloseExit = false
bool trailingStopExit = false
bool initialStopExit = false
f_level(int x1, int x2, float price, color col) =>
line.new(x1, price, x2, price,
xloc=xloc.bar_index, color=col, width=2)
var table wm = table.new(position.bottom_right, 1, 1)
if barstate.isfirst
table.cell(wm, 0, 0, "Telegram @SimpleForexTools", text_color = color.new(color.gray, 70), text_size = size.large)
if barstate.isconfirmed
if bullishSetup
visualTrend := 1
else if bearishSetup
visualTrend := -1
bool exitedThisBar = false
if activeDirection != 0 and bar_index > entryBar
if showLevels
if not na(entryLine)
line.set_x2(entryLine, bar_index)
if not na(stopLine)
line.set_x2(stopLine, bar_index)
if not na(targetLine)
line.set_x2(targetLine, bar_index)
bool hitStop = activeDirection == 1 ?
low <= protectiveStop : high >= protectiveStop
bool hitTarget = fixedTarget and
(activeDirection == 1 ? high >= target : low <= target)
float exitReference = na
string exitReason = ""
bool trailingExit = false
bool ambiguousExit = hitStop and hitTarget
if hitStop
stopExit := true
trailingExit := stopWasTrailed
trailingStopExit := trailingExit
initialStopExit := not trailingExit
exitReference := activeDirection == 1 ?
math.min(open, protectiveStop) :
math.max(open, protectiveStop)
exitReason := trailingExit ? "TRAIL SL" : "SL"
else if hitTarget
targetExit := true
exitReference := target
exitReason := "TARGET " + targetChoice
else
extreme := activeDirection == 1 ?
math.max(extreme, high) :
math.min(extreme, low)
float favourableR =
activeDirection * (extreme - entry) / riskDistance
if trailingEnabled and favourableR >= activationR
trailActive := true
float nextStop = protectiveStop
if trailActive
float candidate = trailingMethod == "ATR" ?
extreme - activeDirection * atr * trailMultiplier :
basis - activeDirection * atr * almaBufferATR
candidate := activeDirection == 1 ?
math.floor(candidate / syminfo.mintick) * syminfo.mintick :
math.ceil(candidate / syminfo.mintick) * syminfo.mintick
nextStop := activeDirection == 1 ?
math.max(protectiveStop, candidate) :
math.min(protectiveStop, candidate)
bool crossedNПоказано первые 50% кода (символов: 10722)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.