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

OPFX ZONA PREMIUM

indicator opfx zona premium and risk for tradingview.pine
Вы автор или правообладатель?

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

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

О программе

OPFX ZONA PREMIUM — это индикатор для TradingView на Pine Script v6, предназначенный для визуального анализа рынка. Он отображает на графике зоны спроса и предложения в виде цветных прямоугольников, а также линии и подписи, помогающие трейдеру оценивать потенциальные уровни поддержки и сопротивления. Индикатор рассчитывает скользящие средние и использует ATR для определения динамических уровней, а также строит линии следования за ценой при включённых настройках.

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

НастройкаОписание
a_buy Чувствительность покупки (множитель) — Множитель ATR, определяющий ширину полосы для линии следования покупки.
c_buy Период ATR покупки — Период расчёта ATR для линии следования покупки; 0 отключает функцию.
a_sell Чувствительность продажи (множитель) — Множитель ATR, определяющий ширину полосы для линии следования продажи.
c_sell Период ATR продажи — Период расчёта ATR для линии следования продажи; 0 отключает функцию.
showTrailBuy Показать линию следования покупки — Включает отображение линии следования за покупкой на графике.
showTrailSell Показать линию следования продажи — Включает отображение линии следования за продажей на графике.
showZones Показать зоны долговечности — Включает отображение зон на основе свинг-пивотов и длины периода.
len_z Длина долговечности — Период для определения высших и низших значений при построении зон.
atrLength Длина ATR — Период расчёта среднего истинного диапазона для уровней TP/SL.
slMultiplier Множитель стоп-лосса (x ATR) — Множитель ATR для расчёта расстояния стоп-лосса от точки входа.
tpMultiplier1 Множитель первого тейк-профита (x ATR) — Множитель ATR для расчёта первого уровня фиксации прибыли.
tpMultiplier2 Множитель второго тейк-профита (x ATR) — Множитель ATR для расчёта второго уровня фиксации прибыли.
showLevels Показать уровни TP/SL — Включает отображение прямоугольников и линий уровней стоп-лосса и тейк-профита.
showLabels Показать ценовые подписи — Включает отображение текстовых меток с ценовыми уровнями на графике.
projectionBars Ширина блока (свечей) — Горизонтальная ширина прямоугольников уровней TP/SL в барах.
swingLen Длина свинга (чувствительность) — Параметр чувствительности для определения свинг-пивотов при построении зон.
maxZones Максимум зон для отображения — Ограничение количества одновременно видимых зон на графике.
maxZoneHeightATR Максимальная высота зоны (множитель ATR) — Верхний предел высоты зоны, выраженный в кратных ATR.
minZoneHeightATR Минимальная высота зоны (множитель ATR) — Нижний предел высоты зоны, выраженный в кратных ATR.
forceZoneHeightATR Принудительная высота зоны (множитель ATR) — Минимальная гарантированная высота зоны при её построении.
minZoneDistance Минимальное расстояние между зонами (свечей) — Минимальное количество баров между новыми зонами одного типа.
invalidationMethod Метод аннулирования зоны — Способ определения пробоя зоны: по цене закрытия или по верхней/нижней тени.
showHistoric Показать исторические зоны — Включает отображение ранее пробитых зон на графике.
activeLookback Глубина активных зон — Количество баров назад, в пределах которых отображаются активные непробитые зоны.
historicBars Глубина исторических зон — Количество баров назад, в пределах которых отображаются пробитые исторические зоны.
showActiveLabels Показать информацию об активных зонах — Включает отображение подписей с информацией об активных зонах.
showHistoricLabels Показать информацию о исторических зонах — Включает отображение подписей с информацией о пробитых зонах.
labelSize Размер подписи — Размер текста меток зон на графике.
activeSupplyCol Цвет активной зоны предложения — Цвет фона активной зоны предложения (продажи).
activeDemandCol Цвет активной зоны спроса — Цвет фона активной зоны спроса (покупки).
historicCol Цвет исторических зон — Цвет фона для пробитых исторических зон.
showRetestMarkers Показать маркеры ретестов — Включает отображение меток ретестов на границах зон.
retestBullCol Цвет ретеста спроса — Цвет метки ретеста для зоны спроса.
retestBearCol Цвет ретеста предложения — Цвет метки ретеста для зоны предложения.
alertsOn Включить оповещения — Разрешает генерацию оповещений TradingView при появлении новых зон.
Получить полный код

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

indicator("OPFX ZONA PREMIUM", shorttitle="OPFX ZONA PREMIUM", overlay=true, max_boxes_count=500, max_labels_count=500, max_lines_count=500, max_bars_back=5000)

groupUT = "OPFX TASDIQ"
a_buy = input.float(2, "Buy Sensitivity (Multiplier)", group=groupUT, minval=0)
c_buy = input.int(1, "Buy ATR Period (0 = disable)", group=groupUT, minval=0)
a_sell = input.float(2, "Sell Sensitivity (Multiplier)", group=groupUT, minval=0)
c_sell = input.int(1, "Sell ATR Period (0 = disable)", group=groupUT, minval=0)
showTrailBuy = input.bool(false, "Show Buy Trailing Line", group=groupUT)
showTrailSell = input.bool(false, "Show Sell Trailing Line", group=groupUT)

groupZones = "OPFX Zones"
showZones = input.bool(true, "Show Longevity Zones", group=groupZones)
len_z = input.int(10, "Longevity Length", group=groupZones)

groupTPSL = "💰 TP/SL Settings"
atrLength    = input.int(14, "ATR Length", minval=5, maxval=100, group=groupTPSL)
slMultiplier = input.float(1.5, "Stop Loss Multiplier (x ATR)", minval=0.5, maxval=5.0, step=0.1, group=groupTPSL)
tpMultiplier1 = input.float(2.0, "Take Profit 1 Multiplier (x ATR)", minval=0.5, maxval=10.0, step=0.5, group=groupTPSL)
tpMultiplier2 = input.float(3.5, "Take Profit 2 Multiplier (x ATR)", minval=0.5, maxval=10.0, step=0.5, group=groupTPSL)
showLevels    = input.bool(true, "Show TP/SL Levels", group=groupTPSL)
showLabels    = input.bool(true, "Show Price Labels", group=groupTPSL)
projectionBars = input.int(18, "Box width (bars)", minval=5, maxval=200, group=groupTPSL)

tpZoneClr   = color.new(color.aqua, 80)
slZoneClr   = color.new(color.red, 85)
entryLineClr = color.new(color.gray, 0)
tpLineClr   = color.new(color.aqua, 0)
slLineClr   = color.new(color.red, 0)

groupSD = "Supply & Demand Zones"
swingLen           = input.int(15, "Swing Length (Sensitivity)", minval=3, maxval=50, group=groupSD)
maxZones           = input.int(10, "Max Zones to Display", minval=3, maxval=30, group=groupSD)
maxZoneHeightATR   = input.float(1.0, "Max Zone Height (ATR Multiplier)", minval=0.5, maxval=10.0, step=0.5, group=groupSD)
minZoneHeightATR   = input.float(1.0, "Min Zone Height (ATR Multiplier)", minval=0.1, maxval=2.0, step=0.1, group=groupSD)
forceZoneHeightATR = input.float(1.0, "Force Zone Height (ATR Multiplier)", minval=0.2, maxval=3.0, step=0.1, group=groupSD)
minZoneDistance    = input.int(44, "Min Distance Between Zones (bars)", minval=1, maxval=100, group=groupSD)
invalidationMethod = input.string("Close", "Zone Invalidation", options=["Close", "Wick"], group=groupSD)
showHistoric       = input.bool(false, "Show Historic Zones", group=groupSD)
activeLookback     = input.int(1000, "Active Zones Lookback", minval=100, maxval=5000, group=groupSD)
historicBars       = input.int(1000, "Historic Zones Lookback", minval=100, maxval=5000, group=groupSD)
showActiveLabels   = input.bool(true, "Show Active Zone Info", group=groupSD)
showHistoricLabels = input.bool(false, "Show Historic Zone Info", group=groupSD)
labelSize          = input.string("Large", "Label Size", options=["Tiny", "Small", "Normal", "Large"], group=groupSD)
activeSupplyCol    = input.color(color.new(color.red, 80), "Active Supply", group=groupSD)
activeDemandCol    = input.color(color.new(color.green, 80), "Active Demand", group=groupSD)
historicCol        = input.color(color.new(color.gray, 85), "Historic Zones", group=groupSD)
showRetestMarkers  = input.bool(true, "Show Retests", group=groupSD)
retestBullCol      = input.color(color.new(color.green, 0), "Demand Retest", group=groupSD)
retestBearCol      = input.color(color.new(color.red, 0), "Supply Retest", group=groupSD)
alertsOn           = input.bool(true, "Enable Alerts", group=groupSD)

buyEnabled  = (c_buy > 0) and (a_buy > 0)
sellEnabled = (c_sell > 0) and (a_sell > 0)

src_buy  = close
ema_buy  = ta.ema(src_buy, 1)
atr_buy  = buyEnabled ? ta.atr(c_buy) : na
nLoss_buy = buyEnabled ? a_buy * atr_buy : na
var float trail_buy = na
if buyEnabled
    if na(trail_buy[1])
        trail_buy := src_buy - nLoss_buy
    else
        if src_buy > trail_buy[1] and src_buy[1] > trail_buy[1]
            trail_buy := math.max(trail_buy[1], src_buy - nLoss_buy)
        else if src_buy < trail_buy[1] and src_buy[1] < trail_buy[1]
            trail_buy := math.min(trail_buy[1], src_buy + nLoss_buy)
        else
            trail_buy := src_buy > trail_buy[1] ? src_buy - nLoss_buy : src_buy + nLoss_buy
else
    trail_buy := na

src_sell  = close
ema_sell  = ta.ema(src_sell, 1)
atr_sell  = sellEnabled ? ta.atr(c_sell) : na
nLoss_sell = sellEnabled ? a_sell * atr_sell : na
var float trail_sell = na
if sellEnabled
    if na(trail_sell[1])
        trail_sell := src_sell + nLoss_sell
    else
        if src_sell > trail_sell[1] and src_sell[1] > trail_sell[1]
            trail_sell := math.max(trail_sell[1], src_sell - nLoss_sell)
        else if src_sell < trail_sell[1] and src_sell[1] < trail_sell[1]
            trail_sell := math.min(trail_sell[1], src_sell + nLoss_sell)
        else
            trail_sell := src_sell > trail_sell[1] ? src_sell - nLoss_sell : src_sell + nLoss_sell
else
    trail_sell := na

above_buy_cross  = ta.crossover(ema_buy, trail_buy)
below_sell_cross = ta.crossover(trail_sell, ema_sell)

above_buy     = buyEnabled and above_buy_cross
buy_signal_raw = buyEnabled and (src_buy > trail_buy) and above_buy
buy_signal    = buy_signal_raw and barstate.isconfirmed

below_sell     = sellEnabled and below_sell_cross
sell_signal_raw = sellEnabled and (src_sell < trail_sell) and below_sell
sell_signal    = sell_signal_raw and barstate.isconfirmed

var int posState = 0
buy_signal_confirmed  = buyEnabled and buy_signal and posState <= 0
sell_signal_confirmed = sellEnabled and sell_signal and posState >= 0
if buy_signal_confirmed
    posState := 1
else if sell_signal_confirmed
    posState := -1

h = ta.highest(len_z)
l = ta.lowest(len_z)
high_pivot = high[1] == h[1] and high < h
low_pivot  = low[1] == l[1] and low > l

plot(showTrailBuy and buyEnabled ? trail_buy : na, title="UT Bot Buy Trail", color=color.new(color.green, 0), linewidth=1)
plot(showTrailSell and sellEnabled ? trail_sell : na, title="UT Bot Sell Trail", color=color.new(color.red, 0), linewidth=1)

alertcondition(buy_signal_confirmed, title="UT Long", message="UT Long")
alertcondition(sell_signal_confirmed, title="UT Short", message="UT Short")

atr = ta.atr(atrLength)
atr20 = ta.atr(20)

f_getLabelSize() =>
    labelSize == "Tiny" ? size.tiny : labelSize == "Small" ? size.small : labelSize == "Normal" ? size.normal : size.large

f_getLabelColor(zoneType, broken) =>
    if broken
        color.new(color.gray, 0)
    else
        zoneType == "Supply" ? color.new(color.red, 0) : color.new(color.green, 0)

f_toPips(val) =>
    pipSize = syminfo.type == "forex" ? (syminfo.currency == "JPY" ? 0.01 : 0.0001) : (syminfo.ticker == "XAUUSD" or syminfo.ticker == "GOLD") ? 0.1 : 0.0001
    math.abs(val) / pipSize

type ZoneData
    box   zoneBox
    label infoLabel
    label retestLabel
    float top
    float bottom
    int   startBar
    int   retests
    bool  broken
    string zoneType
    bool  retestCounted

type ZoneLabel
    label lbl
    float top
    float bot
    int   start
    bool  is_upper
    box   tp_box
    box   sl_box
    line  entry_line
    line  tp1_line
    line  tp2_line
    line  sl_line
    label entry_label
    label tp1_label
    label tp2_label
    label sl_label

var array<ZoneData>  allZones    = array.new<ZoneData>()
var array<ZoneLabel> zone_labels = array.new<ZoneLabel>()
var int lastSupplyBar = 0
var int lastDemandBar = 0

is_price_in_demand(price) =>
    result = false
    if array.size(allZones) > 0
        for i = 0 to array.size(allZones) - 1
            z = array.get(allZones, i)
            if z.zoneType == "Demand" and not z.broken
                if price >= z.bottom and price <= z.top
                    result := true
                    break
    result

is_price_in_supply(price) =>
    result = false
    if array.size(allZones) > 0
        for i = 0 to array.size(allZones) - 1
            z = array.get(allZones, i)
            if z.zoneType == "Supply" and not z.broken
                if price >= z.bottom and price <= z.top
                    result := true
                    break
    result

ph = ta.pivothigh(high, swingLen, swingLen)
pl = ta.pivotlow(low, swingLen, swingLen)

if not na(ph) and barstate.isconfirmed
    ztop = high[swingLen]
    zbot = low[swingLen]
    zStart = bar_index - swingLen

    if bar_index - lastSupplyBar >= minZoneDistance
        mid = (ztop + zbot) / 2
        zoneH = ztop - zbot

        if zoneH < atr20 * forceZoneHeightATR
            fH = atr20 * forceZoneHeightATR
            ztop := mid + (fH / 2)
            zbot := mid - (fH / 2)
            zoneH := fH

        if zoneH > atr20 * maxZoneHeightATR
            mH = atr20 * maxZoneHeightATR
            ztop := mid + (mH / 2)
            zbot := mid - (mH / 2)
            zoneH := mH

        if zoneH >= atr20 * minZoneHeightATR
            mergedWithExisting = false
            if array.size(allZones) > 0
                for i = array.size(allZones) - 1 to math.max(0, array.size(allZones) - 10)
                    z = array.get(allZones, i)
                    if z.zoneType == "Supply" and not z.broken
                        if ztop >= z.bottom and zbot <= z.top
                            newTop = math.max(ztop, z.top)
                            newBot = math.min(zbot, z.bottom)
                            z.top    := newTop
                            z.bottom := newBot
                            box.set_top(z.zoneBox, newTop)
                            box.set_bottom(z.zoneBox, newBot)
                            mergedWithExisting := true
                            break

            if not mergedWithExisting
                zBox = box.new(zStart, ztop, bar_index + 400, zbot, bgcolor=activeSupplyCol, border_width=0)
                zData = ZoneData.new(zBox, na, na, ztop, zbot, zStart, 0, false, "Supply", false)
                array.push(allZones, zData)
                lastSupplyBar := bar_index
                if array.size(allZones) > maxZones * 4
                    array.shift(allZones)

if not na(pl) and barstate.isconfirmed
    ztop = high[swingLen]
    zbot = low[swingLen]
    zStart = bar_index - swingLen

    if bar_index - lastDemandBar >= minZoneDistance
        mid = (ztop + zbot) / 2
        zoneH = ztop - zbot

        if zoneH < atr20 * forceZoneHeightATR
            fH = atr20 * forceZoneHeightATR
            ztop := mid + (fH / 2)
            zbot := mid - (fH / 2)
            zoneH := fH

        if zoneH > atr20 * maxZoneHeightATR
            mH = atr20 * maxZoneHeightATR
            ztop := mid + (mH / 2)
            zbot := mid - (mH / 2)
            zoneH := mH

        if zoneH >= atr20 * minZoneHeightATR
            mergedWithExisting = false
            if array.size(allZones) > 0
                for i = array.size(allZones) - 1 to math.max(0, array.size(allZones) - 10)
                    z = array.get(allZones, i)
                    if z.zoneType == "Demand" and not z.broken
                        if ztop >= z.bottom and zbot <= z.top
                            newTop = math.max(ztop, z.top)
                            newBot = math.min(zbot, z.bottom)
                            z.top    := newTop
                            z.bottom := newBot
                            box.set_top(z.zoneBox, newTop)
                            box.set_bottom(z.zoneBox, newBot)
                            mergedWithExisting := true
                            break

            if not mergedWithExisting
                zBox = box.new(zStart, ztop, bar_index + 400, zbot, bgcolor=activeDemandCol, border_width=0)
                zData = ZoneData.new(zBox, na, na, ztop, zbot, zStart, 0, false, "Demand", false)
                array.push(allZones, zData)
                lastDemandBar := bar_index
                if array.size(allZones) > maxZones * 4
                    array.shift(allZones)

if array.size(allZones) > 0
    activeSupplyCount  = 0
    activeDemandCount  = 0
    historicSupplyCount = 0
    historicDemandCount = 0

    for i = 0 to array.size(allZones) - 1
        z = array.get(allZones, i)
        box.set_right(z.zoneBox, bar_index + 400)

        if not z.broken
            priceInZone = high >= z.bottom and low <= z.top
            if priceInZone and not z.retestCounted
                z.retests += 1
                z.retestCounted := true
            else if not priceInZone
                z.retestCounted := false

        if not z.broken
            if z.zoneType == "Supply"
                breakLevel = invalidationMethod == "Close" ? close : high
                if breakLevel > z.top
                    z.broken := true
                    box.set_bgcolor(z.zoneBox, historicCol)
            else
                breakLevel = invalidationMethod == "Close" ? close : low
                if breakLevel < z.bottom
                    z.broken := true
                    box.set_bgcolor(z.zoneBox, historicCol)

        age = bar_index - z.startBar
        zoneHeight = z.top - z.bottom
        shouldHide = false

        if z.broken and not showHistoric
            shouldHide := true
        if z.broken and age > historicBars
            shouldHide := true
        if not z.broken and age > activeLookback
            shouldHide := true

        if z.broken and showHistoric
            if zoneHeig

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

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

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

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

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

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

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