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

Green Zone V1.1

greenzone_v1.1 indicator for tradingview.pine
Вы автор или правообладатель?

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

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

О программе

Green Zone V1.1 — индикатор для TradingView (Pine Script v6), отображаемый на графике поверх цены. Основная задача — определение зон справедливой ценовой разрыва (FVG) после формирования открытого диапазона (Open Range) в начале торговой сессии. Индикатор строит прямоугольник зоны, рассчитывает уровни стоп-лосса и трёх тейк-профитов (1:1, 1:2, 1:3), а также отрисовывает линии волатильности на основе стандартного отклонения.

Встроены фильтры: скользящая средняя EMA для определения тренда и фильтр объёма с настраиваемым множителем. Поддерживаются сессионные фильтры для Азии, Лондона и Нью-Йорка с настраиваемыми часами начала. Есть функция трейлинг-стопа, активируемая после достижения первого тейк-профита, с настраиваемым уровнем активации.

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

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

НастройкаОписание
openRangeMinutes Длительность открытого диапазона в минутах от начала сессии. За это время определяются максимум и минимум, формирующие диапазон.
minFvgSizePips Минимальный размер зоны FVG в пипсах. Зоны меньшего размера игнорируются при расчёте.
slBufferPips Буфер стоп-лосса в пипсах, добавляемый к уровню за пределами открытого диапазона для определения уровня защиты.
lookbackBars Количество баров, используемых для расчёта стандартного отклонения (волатильности), отображаемого в виде линий на графике.
usePartialTP Включает или отключает частичное закрытие позиции по уровням TP1 и TP2 с настраиваемыми процентами.
tp1Percent Процент позиции, закрываемый при достижении первого тейк-профита (TP1).
tp2Percent Процент позиции, закрываемый при достижении второго тейк-профита (TP2).
useTrailingStop Включает или отключает трейлинг-стоп, который перемещается вверх (для лонга) или вниз (для шорта) после достижения TP1.
trailActivationRR Множитель соотношения риск/прибыль, при достижении которого активируется трейлинг-стоп после срабатывания TP1.
useTrendFilter Включает или отключает фильтр тренда на основе EMA. Без включённого фильтра направление тренда не учитывается при формировании сигналов.
emaLength Период экспоненциальной скользящей средней EMA, используемой в фильтре тренда. Применяется только при включённом фильтре тренда.
useVolumeFilter Включает или отключает фильтр объёма. При включённом фильтре объём должен превышать скользящую среднюю объёма с заданным множителем.
volumeMultiplier Множитель, на который умножается скользящая средняя объёма. Текущий объём должен превышать это значение для прохождения фильтра.
showDashboard Включает или отключает информационный дашборд в правом верхнем углу графика с данными о текущей сессии, уровнях и статистике.
showFVGRectangle Включает или отключает отображение прямоугольника зоны FVG (Green Zone) на графике.
showOpenRange Включает или отключает отображение прямоугольника открытого диапазона (Open Range) на графике.
showSDLines Включает или отключает отображение линий волатильности (линии стандартного отклонения) на графике.
showStats Включает или отключает отображение панели статистики в дашборде (количество сделок, процент прибыльных).
fvgColor Цвет заливки прямоугольника зоны справедливой ценовой разрыва (FVG / Green Zone) на графике.
slColor Цвет линии стоп-лосса на графике.
tp1Color Цвет линии первого тейк-профита (соотношение риск/прибыль 1:1).
tp2Color Цвет линии второго тейк-профита (соотношение риск/прибыль 1:2).
tp3Color Цвет линии третьего тейк-профита (соотношение риск/прибыль 1:3).
enableAsiaSession Включает или отключает сессионный фильтр для Азии. Если отключено, сессия не учитывается при формировании открытого диапазона.
enableLondonSession Включает или отключает сессионный фильтр для Лондона. Определяет активность в рамках лондонской торговой сессии.
enableNewYorkSession Включает или отключает сессионный фильтр для Нью-Йорка. Определяет активность в рамках нью-йоркской торговой сессии.
asiaStartHour Час начала торговой сессии Азии по Гринвичу (GMT). Используется для определения начала сессии и формирования открытого диапазона.
londonStartHour Час начала торговой сессии Лондона по Гринвичу (GMT). Используется для определения перехода между сессиями.
newYorkStartHour Час начала торговой сессии Нью-Йорка по Гринвичу (GMT). Используется для определения перехода между сессиями.
enableAlerts Включает или отключает оповещения при срабатывании тейк-профитов, стоп-лосса и появлении торговых сигналов.
Получить полный код

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

indicator("Green Zone V1.1", overlay=true, max_boxes_count=500, max_lines_count=500, max_labels_count=500)

openRangeMinutes = input.int(30, "Open Range Period", minval=5, maxval=120, group="Strategy")
minFvgSizePips = input.float(5.0, "Min FVG Size (pips)", minval=1.0, step=0.5, group="Strategy")
slBufferPips = input.int(10, "SL Buffer (pips)", minval=1, group="Strategy")
lookbackBars = input.int(20, "SD Lookback Bars", minval=5, maxval=100, group="Strategy")

usePartialTP = input.bool(true, "Use Partial TP", group="Risk Management")
tp1Percent = input.int(50, "TP1 Close %", minval=10, maxval=100, group="Risk Management", tooltip="% of position to close at TP1")
tp2Percent = input.int(30, "TP2 Close %", minval=10, maxval=100, group="Risk Management")
useTrailingStop = input.bool(false, "Enable Trailing Stop", group="Risk Management")
trailActivationRR = input.float(1.0, "Trail Activation (RR)", minval=0.5, step=0.5, group="Risk Management")

useTrendFilter = input.bool(false, "Use Trend Filter (EMA)", group="Filters")
emaLength = input.int(50, "EMA Length", minval=10, group="Filters")
useVolumeFilter = input.bool(false, "Use Volume Filter", group="Filters")
volumeMultiplier = input.float(1.5, "Volume > MA x", minval=1.0, step=0.1, group="Filters")

showDashboard = input.bool(true, "Show Dashboard", group="Display")
showFVGRectangle = input.bool(true, "Show Green Zone", group="Display")
showOpenRange = input.bool(false, "Show Open Range", group="Display")
showSDLines = input.bool(true, "Show SD Lines", group="Display")
showStats = input.bool(true, "Show Stats Panel", group="Display")

fvgColor = input.color(color.new(#00ff00, 85), "Green Zone", group="Colors")
slColor = input.color(#ff0000, "Stop Loss", group="Colors")
tp1Color = input.color(#2962ff, "TP1 (1:1)", group="Colors")
tp2Color = input.color(#ffeb3b, "TP2 (1:2)", group="Colors")
tp3Color = input.color(#ff9800, "TP3 (1:3)", group="Colors")

enableAsiaSession = input.bool(true, "Asia Session", inline="sessions", group="Sessions")
enableLondonSession = input.bool(true, "London", inline="sessions", group="Sessions")
enableNewYorkSession = input.bool(true, "New York", inline="sessions", group="Sessions")

asiaStartHour = input.int(0, "Asia Start (GMT)", minval=0, maxval=23, group="Session Times")
londonStartHour = input.int(8, "London Start (GMT)", minval=0, maxval=23, group="Session Times")
newYorkStartHour = input.int(13, "NY Start (GMT)", minval=0, maxval=23, group="Session Times")

enableAlerts = input.bool(true, "Enable Alerts", group="Alerts")

type TradeState
    array<box> allBoxes
    array<line> allLines
    array<label> allLabels
    float orHigh
    float orLow
    bool orCompleted
    int orStartBar
    float fvgTop
    float fvgBottom
    bool fvgFound
    string fvgDirection
    int fvgBar
    bool entryConfirmed
    float entryPrice
    float stopLoss
    float tp1
    float tp2
    float tp3
    string tradeDir
    float swingSD
    float currentTrailStop
    bool tp1Hit
    bool tp2Hit
    string currentSession
    string lastSession
    int sessionStartBar
    int totalTrades
    int winningTrades
    int losingTrades
    float totalPips

var state = TradeState.new(
     array.new<box>(), array.new<line>(), array.new<label>(),
     na, na, false, na,
     na, na, false, na, na,
     false, na, na, na, na, na, na, na, na,
     false, false,
     na, na, na,
     0, 0, 0, 0.0
 )

getPipValue() =>
    if str.contains(syminfo.ticker, "XAU") or str.contains(syminfo.ticker, "GOLD")
        syminfo.mintick * 10
    else if str.contains(syminfo.ticker, "JPY")
        0.01
    else
        syminfo.mintick * 10

pipValue = getPipValue()

getCurrentSession(h) =>
    if enableAsiaSession and h >= asiaStartHour and h < londonStartHour
        "ASIA"
    else if enableLondonSession and h >= londonStartHour and h < newYorkStartHour
        "LONDON"
    else if enableNewYorkSession and h >= newYorkStartHour
        "NY"
    else
        na

calcSwingSD(lookback) =>
    float sum = 0.0
    float mean = 0.0
    int count = 0

    for i = 0 to lookback - 1
        if bar_index - i >= 0
            mean += close[i]
            count += 1
    mean := count > 0 ? mean / count : 0

    for i = 0 to lookback - 1
        if bar_index - i >= 0
            sum += math.pow(close[i] - mean, 2)

    math.sqrt(sum / count)

deleteAllDrawings(s) =>

    if array.size(s.allBoxes) > 0
        for i = array.size(s.allBoxes) - 1 to 0
            box.delete(array.get(s.allBoxes, i))
        array.clear(s.allBoxes)

    if array.size(s.allLines) > 0
        for i = array.size(s.allLines) - 1 to 0
            line.delete(array.get(s.allLines, i))
        array.clear(s.allLines)

    if array.size(s.allLabels) > 0
        for i = array.size(s.allLabels) - 1 to 0
            label.delete(array.get(s.allLabels, i))
        array.clear(s.allLabels)

resetTradeVariables(s) =>
    s.orHigh := na
    s.orLow := na
    s.orCompleted := false
    s.fvgTop := na
    s.fvgBottom := na
    s.fvgFound := false
    s.fvgDirection := na
    s.fvgBar := na
    s.entryConfirmed := false
    s.entryPrice := na
    s.stopLoss := na
    s.tp1 := na
    s.tp2 := na
    s.tp3 := na
    s.tradeDir := na
    s.swingSD := na
    s.currentTrailStop := na
    s.tp1Hit := false
    s.tp2Hit := false

ema = ta.ema(close, emaLength)
trendIsUp = close > ema
trendIsDown = close < ema

volumeMA = ta.sma(volume, 20)
volumeIsHigh = volume > volumeMA * volumeMultiplier

filtersPass(direction) =>
    trendOK = not useTrendFilter or (direction == "LONG" ? trendIsUp : trendIsDown)
    volOK = not useVolumeFilter or volumeIsHigh
    trendOK and volOK

newSess = getCurrentSession(hour)
if not na(newSess) and newSess != state.lastSession
    deleteAllDrawings(state)
    resetTradeVariables(state)

    state.orStartBar := bar_index
    state.sessionStartBar := bar_index
    state.lastSession := newSess
    state.currentSession := newSess

if state.entryConfirmed and not na(state.entryPrice)
    effectiveSL = useTrailingStop and not na(state.currentTrailStop) ? state.currentTrailStop : state.stopLoss

    if not state.tp1Hit and ((state.tradeDir == "LONG" and high >= state.tp1) or (state.tradeDir == "SHORT" and low <= state.tp1))
        state.tp1Hit := true
        if enableAlerts
            alert("TP1 Hit! " + state.tradeDir + " on " + syminfo.ticker, alert.freq_once_per_bar)

    if state.tp1Hit and not state.tp2Hit and ((state.tradeDir == "LONG" and high >= state.tp2) or (state.tradeDir == "SHORT" and low <= state.tp2))
        state.tp2Hit := true
        if enableAlerts
            alert("TP2 Hit! " + state.tradeDir + " on " + syminfo.ticker, alert.freq_once_per_bar)

    tp3Reached = (state.tradeDir == "LONG" and high >= state.tp3) or (state.tradeDir == "SHORT" and low <= state.tp3)
    slReached = (state.tradeDir == "LONG" and low <= effectiveSL) or (state.tradeDir == "SHORT" and high >= effectiveSL)

    if tp3Reached or slReached
        state.totalTrades += 1
        if tp3Reached
            state.winningTrades += 1
            pipsGained = math.abs((state.tp3 - state.entryPrice) / pipValue)
            state.totalPips += pipsGained
            if enableAlerts
                alert("TP3 Hit! Trade closed with profit. " + state.tradeDir + " on " + syminfo.ticker, alert.freq_once_per_bar)
        else
            state.losingTrades += 1
            pipsLost = math.abs((effectiveSL - state.entryPrice) / pipValue)
            state.totalPips -= pipsLost
            if enableAlerts
                alert("Stop Loss Hit! Trade closed. " + state.tradeDir + " on " + syminfo.ticker, alert.freq_once_per_bar)

        deleteAllDrawings(state)
        resetTradeVariables(state)

if useTrailingStop and state.entryConfirmed and not na(state.entryPrice) and state.tp1Hit
    slDist = math.abs(state.entryPrice - state.stopLoss)
    activationLevel = state.tradeDir == "LONG" ? state.entryPrice + (slDist * trailActivationRR) : state.entryPrice - (slDist * trailActivationRR)

    if state.tradeDir == "LONG"
        if high >= activationLevel
            newTrail = high - slDist
            if na(state.currentTrailStop) or newTrail > state.currentTrailStop
                state.currentTrailStop := newTrail
                trailLine = line.new(bar_index, state.currentTrailStop, bar_index + 1, state.currentTrailStop, color=color.new(#ff6b00, 0), width=2, style=line.style_dotted, extend=extend.right)
                array.push(state.allLines, trailLine)
    else
        if low <= activationLevel
            newTrail = low + slDist
            if na(state.currentTrailStop) or newTrail < state.currentTrailStop
                state.currentTrailStop := newTrail
                trailLine = line.new(bar_index, state.currentTrailStop, bar_index + 1, state.currentTrailStop, color=color.new(#ff6b00, 0), width=2, style=line.style_dotted, extend=extend.right)
                array.push(state.allLines, trailLine)

if not state.orCompleted and not na(state.sessionStartBar)
    barsElapsed = bar_index - state.sessionStartBar
    minutesElapsed = barsElapsed * timeframe.multiplier

    if minutesElapsed <= openRangeMinutes
        state.orHigh := na(state.orHigh) ? high : math.max(state.orHigh, high)
        state.orLow := na(state.orLow) ? low : math.min(state.orLow, low)

    if minutesElapsed > openRangeMinutes and not na(state.orHigh)
        state.orCompleted := true

        if showOpenRange
            orBox = box.new(state.sessionStartBar, state.orHigh, bar_index + 50, state.orLow, border_color=color.new(color.gray, 50), border_width=1, bgcolor=color.new(color.gray, 95))
            array.push(state.allBoxes, orBox)

if state.orCompleted and not state.fvgFound and bar_index >= 2
    minFvgSize = minFvgSizePips * pipValue

    if low > high[2] and (low - high[2]) >= minFvgSize
        state.fvgBottom := high[2]
        state.fvgTop := low
        state.fvgFound := true
        state.fvgDirection := "LONG"
        state.fvgBar := bar_index

        if showFVGRectangle
            fvgBox = box.new(bar_index, state.fvgBottom, bar_index + 300, state.fvgTop, border_color=#00ff00, border_width=2, bgcolor=fvgColor)
            array.push(state.allBoxes, fvgBox)

    else if high < low[2] and (low[2] - high) >= minFvgSize
        state.fvgTop := low[2]
        state.fvgBottom := high
        state.fvgFound := true
        state.fvgDirection := "SHORT"
        state.fvgBar := bar_index

        if showFVGRectangle
            fvgBox = box.new(bar_index, state.fvgBottom, bar_index + 300, state.fvgTop, border_color=#00ff00, border_width=2, bgcolor=fvgColor)
            array.push(state.allBoxes, fvgBox)

if state.fvgFound and not state.entryConfirmed

    if state.fvgDirection == "LONG" and close > state.fvgTop and filtersPass("LONG")
        deleteAllDrawings(state)

        state.entryConfirmed := true
        state.entryPrice := close
        state.stopLoss := state.orLow - (slBufferPips * pipValue)
        state.tradeDir := "LONG"
        state.swingSD := calcSwingSD(lookbackBars)

        slDist = state.entryPrice - state.stopLoss
        state.tp1 := state.entryPrice + slDist
        state.tp2 := state.entryPrice + (slDist * 2)
        state.tp3 := state.entryPrice + (slDist * 3)

        slLine = line.new(bar_index, state.stopLoss, bar_index + 1, state.stopLoss, color=slColor, width=2, extend=extend.right)
        tp1Line = line.new(bar_index, state.tp1, bar_index + 1, state.tp1, color=tp1Color, width=2, extend=extend.right)
        tp2Line = line.new(bar_index, state.tp2, bar_index + 1, state.tp2, color=tp2Color, width=2, extend=extend.right)
        tp3Line = line.new(bar_index, state.tp3, bar_index + 1, state.tp3, color=tp3Color, width=2, extend=extend.right)

        array.push(state.allLines, slLine)
        array.push(state.allLines, tp1Line)
        array.push(state.allLines, tp2Line)
        array.push(state.allLines, tp3Line)

        if showSDLines
            sd1Line = line.new(bar_index, state.entryPrice + state.swingSD, bar_index + 1, state.entryPrice + state.swingSD, color=color.new(#2962ff, 70), width=1, style=line.style_dashed, extend=extend.right)
            sd2Line = line.new(bar_index, state.entryPrice + (state.swingSD*2), bar_index + 1, state.entryPrice + (state.swingSD*2), color=color.new(#ffeb3b, 70), width=1, style=line.style_dashed, extend=extend.right)
            sd3Line = line.new(bar_index, state.entryPrice + (state.swingSD*3), bar_index + 1, state.entryPrice + (state.swingSD*3), color=color.new(#ff9800, 70), width=1, style=line.style_dashed, extend=extend.right)
            array.push(state.allLines, sd1Line)
            array.push(state.allLines, sd2Line)
            array.push(state.all

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

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

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

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

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

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

Стоимость полного кода
2 038,10₽ ≈ $25.35