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

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 и перейдите к оплате.

Стоимость полного кода
1 072,20₽ ≈ $13.11