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