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