Intraday MTF SR Zones
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «indicator intraday mtf sr zones for tradingview.pine» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Intraday MTF SR Zones — это индикатор для TradingView (Pine Script v6), который отображает на графике зоны поддержки и сопротивления, рассчитанные по нескольким таймфреймам одновременно. Пивотные точки ( highs и lows ) определяются на до четырёх пользовательских таймфреймов и визуализируются в виде цветных зон с оценкой силы.
Каждая зона получает числовой балл (0–10), который зависит от нескольких внутренних факторов: веса таймфрейма, количества совпадающих уровней, выраженности реакции цены и выраженности пивота. Зоны могут объединяться при наложении, формируя конфлюэнтные уровни с тегом задействованных таймфреймов.
Индикатор включает информационную панель (дашборд) в углу графика с отображением количества уровней по каждому таймфрейму, ближайших зон цены, среднего балла и текущей сессии. Доступны пять условий для оповещений TradingView: появление новых уровней поддержки/сопротивления, приближение цены к зоне и касание сильной зоны.
Параметры настройки охватывают таймфреймы слотов, чувствительность пивотов, визуальное оформление зон (толщина, цвета, прозрачность), фильтрацию по силе, управление сессиями и стиль дашборда. Индикатор работает поверх графика (overlay).
Настройки программы
| Настройка | Описание |
|---|---|
| i_en1 | Слот 1 — Включение первого слота таймфрейма. |
| i_tf1 | Таймфрейм слота 1 — Таймфрейм первого слота для расчёта уровней. |
| i_en2 | Слот 2 — Включение второго слота таймфрейма. |
| i_tf2 | Таймфрейм слота 2 — Таймфрейм второго слота для расчёта уровней. |
| i_en3 | Слот 3 — Включение третьего слота таймфрейма. |
| i_tf3 | Таймфрейм слота 3 — Таймфрейм третьего слота для расчёта уровней. |
| i_en4 | Слот 4 — Включение четвёртого слота таймфрейма. |
| i_tf4 | Таймфрейм слота 4 — Таймфрейм четвёртого слота для расчёта уровней. |
| i_pL | Сила пивота (слева) — Число баров слева для определения пивотной точки. |
| i_pR | Сила пивота (справа) — Число баров справа для определения пивотной точки. |
| i_res | Сопротивление (пивот highs) — Отображение уровней сопротивления (пивотные максимумы). |
| i_sup | Поддержка (пивот lows) — Отображение уровней поддержки (пивотные минимумы). |
| i_sesTf | Таймфрейм сессии — Таймфрейм, по которому определяется начало новой торговой сессии. |
| i_keepN | Сессий для хранения зон — Количество последних сессий, зоны которых сохраняются на графике. |
| i_capSes | Макс. зон в сессии — Максимальное количество зон, сохраняемых в рамках одной сессии; лишние слабые зоны удаляются. |
| i_extendR | Продление последней сессии (бары) — Количество баров, на которые продлевается последняя зона текущей сессии. |
| i_thMode | Метод толщины — Метод задания толщины зон: ATR × или % от цены. |
| i_thATR | Толщина (ATR ×) — Толщина зоны в кратных ATR (при методе ATR ×). |
| i_thPct | Толщина (% от цены) — Толщина зоны в процентах от цены (при методе % of Price). |
| i_atrLen | Длина ATR — Длина ATR, используемая для расчёта толщины зон и нормализации факторов силы. |
| i_merge | Объединение пересекающихся уровней — Объединение пересекающихся зон одного типа в конфлюэнтные. |
| i_mergeATR | Расстояние слияния (ATR ×) — Расстояние (в кратных ATR), при котором зоны считаются пересекающимися для объединения. |
| i_confBonus | Бонус конфлюэнса — Дополнительный бонус к баллу при объединении пересекающихся уровней. |
| i_minStr | Скрыть зоны ниже балла — Минимальный балл зоны; зоны с меньшим баллом скрываются. |
| i_wTF | Вес ранга таймфрейма — Внутренний весовой коэффициент для ранга таймфрейма в расчёте силы зоны. |
| i_wConf | Вес конфлюэнса — Внутренний весовой коэффициент для фактора конфлюэнса в расчёте силы зоны. |
| i_wWick | Вес реакции цены — Внутренний весовой коэффициент для фактора реакции цены (отклонение свечи) в расчёте силы зоны. |
| i_wPro | Вес выраженности пивота — Внутренний весовой коэффициент для фактора выраженности пивота в расчёте силы зоны. |
| i_strongTh | Порог сильной зоны — Пороговый балл, выше которого зона считается сильной. |
| i_showLab | Показать метки — Отображение меток с информацией о зонах. |
| i_showStar | Показать звёзды и категорию — Отображение звёзд и категории (тира) силы зоны в метках. |
| i_latest | Метки только на последней сессии — Показывать метки только для зон последней сессии. |
| i_labSize | Размер меток — Размер меток уровней на графике. |
| i_r1 | Цвет сопротивления 1 — Основной цвет зон сопротивления (самый слабый оттенок). |
| i_r2 | Цвет сопротивления 2 — Второй оттенок цвета зон сопротивления. |
| i_r3 | Цвет сопротивления 3 — Третий оттенок цвета зон сопротивления. |
| i_r4 | Цвет сопротивления 4 — Наиболее насыщенный оттенок цвета зон сопротивления (элитный). |
| i_s1 | Цвет поддержки 1 — Основной цвет зон поддержки (самый слабый оттенок). |
| i_s2 | Цвет поддержки 2 — Второй оттенок цвета зон поддержки. |
| i_s3 | Цвет поддержки 3 — Третий оттенок цвета зон поддержки. |
| i_s4 | Цвет поддержки 4 — Наиболее насыщенный оттенок цвета зон поддержки (элитный). |
| i_confCol | Цвет конфлюэнса — Цвет конфлюэнтных (совпадающих) зон. |
| i_baseTr | Прозрачность слабейшей — Прозрачность самой слабой зоны в процентах. |
| i_span | Диапазон прозрачности силы — Диапазон прозрачности между самой слабой и самой сильной зоной. |
| i_border | Показать границы зон — Отображение границ зон на графике. |
| i_showDash | Показать дашборд — Отображение информационной панели на графике. |
| i_dashPos | Положение дашборда — Положение информационной панели на графике. |
| i_dashSize | Размер текста дашборда — Размер текста в информационной панели. |
Поиск по коду файла
indicator("Intraday MTF SR Zones", overlay = true,
max_boxes_count = 500, max_labels_count = 500, max_lines_count = 100, max_bars_back = 5000)
string G_TF = "① Timeframe Levels (pivot core)"
bool i_en1 = input.bool(true, "Slot 1", inline = "t1", group = G_TF)
string i_tf1 = input.timeframe("30", "", inline = "t1", group = G_TF)
bool i_en2 = input.bool(true, "Slot 2", inline = "t2", group = G_TF)
string i_tf2 = input.timeframe("60", "", inline = "t2", group = G_TF)
bool i_en3 = input.bool(true, "Slot 3", inline = "t3", group = G_TF)
string i_tf3 = input.timeframe("120", "", inline = "t3", group = G_TF)
bool i_en4 = input.bool(true, "Slot 4", inline = "t4", group = G_TF)
string i_tf4 = input.timeframe("240", "", inline = "t4", group = G_TF)
int i_pL = input.int(5, "Pivot Strength (left)", minval = 1, maxval = 60, group = G_TF)
int i_pR = input.int(5, "Pivot Strength (right)", minval = 1, maxval = 60, group = G_TF)
bool i_res = input.bool(true, "Resistance (pivot highs)", inline = "d", group = G_TF)
bool i_sup = input.bool(true, "Support (pivot lows)", inline = "d", group = G_TF)
string G_SES = "② Session Handling"
string i_sesTf = input.timeframe("D", "Session Timeframe", group = G_SES, tooltip = "A fresh session of levels begins on each new bar of this timeframe. 'D' = daily.")
int i_keepN = input.int(3, "Sessions Of Zones To Keep", minval = 1, maxval = 10, group = G_SES, tooltip = "How many recent sessions keep their full stack of zones drawn.")
int i_capSes = input.int(14, "Max Zones Per Session", minval = 2, maxval = 30, group = G_SES, tooltip = "Weakest levels in a session are dropped past this so the stack stays clean.")
int i_extendR = input.int(10, "Extend Latest Session (bars)", minval = 0, maxval = 200, group = G_SES)
string G_SHP = "③ Zone Shape"
string i_thMode = input.string("ATR ×", "Thickness Method", options = ["ATR ×", "% of Price"], group = G_SHP)
float i_thATR = input.float(0.28, "Thickness (ATR ×)", minval = 0.05, maxval = 3.0, step = 0.05, group = G_SHP)
float i_thPct = input.float(0.10, "Thickness (% of Price)", minval = 0.02, maxval = 2.0, step = 0.02, group = G_SHP)
int i_atrLen = input.int(14, "ATR Length", minval = 1, maxval = 200, group = G_SHP)
string G_MRG = "④ Confluence Merge"
bool i_merge = input.bool(true, "Merge Overlapping Levels", group = G_MRG, tooltip = "Same-side levels in a session whose bands overlap fuse into one confluence zone tagged with every timeframe involved.")
float i_mergeATR = input.float(0.35, "Merge Distance (ATR ×)", minval = 0.0, maxval = 3.0, step = 0.05, group = G_MRG)
float i_confBonus= input.float(0.9, "Confluence Bonus / Extra TF", minval = 0.0, maxval = 2.0, step = 0.1, group = G_MRG)
string G_STR = "⑤ Strength Engine (0-10)"
float i_minStr = input.float(0.0, "Hide Zones Below Score", minval = 0.0, maxval = 10.0, step = 0.5, group = G_STR)
float i_wTF = input.float(0.40, " Weight · Timeframe Rank", minval = 0, maxval = 1, step = 0.02, group = G_STR)
float i_wConf = input.float(0.28, " Weight · Confluence", minval = 0, maxval = 1, step = 0.02, group = G_STR)
float i_wWick = input.float(0.18, " Weight · Rejection Wick", minval = 0, maxval = 1, step = 0.02, group = G_STR)
float i_wPro = input.float(0.14, " Weight · Pivot Prominence",minval = 0, maxval = 1, step = 0.02, group = G_STR)
float i_strongTh = input.float(7.0, "Strong-Zone Threshold", minval = 3.0, maxval = 10.0, step = 0.5, group = G_STR)
string G_LAB = "⑥ Labels"
bool i_showLab = input.bool(true, "Show Labels", group = G_LAB)
bool i_showStar = input.bool(true, "Show Stars & Tier", group = G_LAB)
bool i_latest = input.bool(false, "Labels On Latest Session Only", group = G_LAB)
string i_labSize = input.string("Small", "Label Size", options = ["Tiny", "Small", "Normal", "Large"], group = G_LAB)
string G_COL = "⑦ Theme · Std-Dev Palette"
color i_r1 = input.color(#158362, "Resistance ►", inline = "r1", group = G_COL, tooltip = "Four shades graded weak → elite (upper / +SD teal family).")
color i_r2 = input.color(#196c64, "", inline = "r1", group = G_COL)
color i_r3 = input.color(#005950, "", inline = "r1", group = G_COL)
color i_r4 = input.color(#00322a, "", inline = "r1", group = G_COL)
color i_s1 = input.color(#851793, "Support ►", inline = "s1", group = G_COL, tooltip = "Four shades graded weak → elite (lower / -SD magenta-red-purple family).")
color i_s2 = input.color(#771212, "", inline = "s1", group = G_COL)
color i_s3 = input.color(#580933, "", inline = "s1", group = G_COL)
color i_s4 = input.color(#300d5b, "", inline = "s1", group = G_COL)
color i_confCol = input.color(#7458a6, "Confluence", group = G_COL)
int i_baseTr = input.int(60, "Weakest Transparency", minval = 30, maxval = 96, group = G_COL)
int i_span = input.int(34, "Strength Opacity Span", minval = 0, maxval = 55, group = G_COL)
bool i_border = input.bool(true, "Show Zone Borders", group = G_COL)
string G_DASH = "⑧ Dashboard"
bool i_showDash = input.bool(true, "Show Dashboard", group = G_DASH)
string i_dashPos = input.string("Top Right", "Position", options = ["Top Right", "Top Left", "Bottom Right", "Bottom Left", "Middle Right"], group = G_DASH)
string i_dashSize = input.string("Small", "Text Size", options = ["Tiny", "Small", "Normal"], group = G_DASH)
color C_PANEL = color.rgb(16, 20, 28)
color C_ALT = color.rgb(23, 28, 38)
color C_HDR = color.rgb(30, 37, 48)
color C_SUB = color.rgb(12, 16, 23)
color C_EDGE = color.rgb(48, 56, 70)
color C_TXT = color.rgb(228, 233, 242)
color C_LO = color.rgb(138, 147, 163)
color C_NEU = color.rgb(96, 104, 118)
color C_AMB = color.rgb(25, 108, 100)
color C_AZ = color.rgb(133, 23, 147)
color C_GOLD = color.rgb(116, 88, 166)
f_clamp(float v, float lo, float hi) => math.max(lo, math.min(hi, v))
f_lab(string s) =>
switch s
"Tiny" => size.tiny
"Small" => size.small
"Normal" => size.normal
"Large" => size.large
=> size.small
f_dpos(string p) =>
switch p
"Top Left" => position.top_left
"Bottom Right" => position.bottom_right
"Bottom Left" => position.bottom_left
"Middle Right" => position.middle_right
=> position.top_right
f_stars(float s) => s >= 8 ? "★★★★★" : s >= 6.5 ? "★★★★" : s >= 5 ? "★★★" : s >= 3.5 ? "★★" : s >= 2 ? "★" : "·"
f_tier(float s) => s >= 8 ? "ELITE" : s >= 6.5 ? "STRONG" : s >= 5 ? "MODERATE" : s >= 3.5 ? "WEAK" : "FORMING"
f_tfLabel(string tf) =>
int s = timeframe.in_seconds(tf)
s % 86400 == 0 ? "D" + str.tostring(s / 86400) : s >= 3600 and s % 3600 == 0 ? "H" + str.tostring(s / 3600) : s >= 60 ? "M" + str.tostring(s / 60) : "S" + str.tostring(s)
f_tfWeight(int sec) => sec >= 14400 ? 1.0 : sec >= 3600 ? 0.78 : sec >= 900 ? 0.55 : sec >= 300 ? 0.38 : sec >= 60 ? 0.30 : 0.25
f_sess() =>
int m = hour(time, "GMT") * 60 + minute(time, "GMT")
m >= 480 and m < 780 ? "London" : m >= 780 and m < 1320 ? "NY" : m >= 0 and m < 540 ? "Asian" : "Other"
int lenRef = i_pL + i_pR
int chartMs = timeframe.in_seconds() * 1000
int sec1 = timeframe.in_seconds(i_tf1)
int sec2 = timeframe.in_seconds(i_tf2)
int sec3 = timeframe.in_seconds(i_tf3)
int sec4 = timeframe.in_seconds(i_tf4)
string L1 = f_tfLabel(i_tf1)
string L2 = f_tfLabel(i_tf2)
string L3 = f_tfLabel(i_tf3)
string L4 = f_tfLabel(i_tf4)
f_tfset(bool h1, bool h2, bool h3, bool h4) =>
string s = ""
if h1
s := L1
if h2
s := s == "" ? L2 : s + "·" + L2
if h3
s := s == "" ? L3 : s + "·" + L3
if h4
s := s == "" ? L4 : s + "·" + L4
s == "" ? "—" : s
detect() =>
float atrv = ta.atr(i_atrLen)
float refMid = ta.sma(hl2, lenRef)
float ph = ta.pivothigh(high, i_pL, i_pR)
float pl = ta.pivotlow(low, i_pL, i_pR)
float phWk = na
float plWk = na
float phPro = na
float plPro = na
if not na(ph)
phWk := math.max(high[i_pR] - math.max(open[i_pR], close[i_pR]), 0.0)
phPro := math.max(ph - refMid, 0.0)
if not na(pl)
plWk := math.max(math.min(open[i_pR], close[i_pR]) - low[i_pR], 0.0)
plPro := math.max(refMid - pl, 0.0)
[ph, pl, atrv, phWk, plWk, phPro, plPro]
[ph1, pl1, atr1, pw1, lw1, pp1, lp1] = request.security(syminfo.tickerid, i_tf1, detect(), lookahead = barmerge.lookahead_off)
[ph2, pl2, atr2, pw2, lw2, pp2, lp2] = request.security(syminfo.tickerid, i_tf2, detect(), lookahead = barmerge.lookahead_off)
[ph3, pl3, atr3, pw3, lw3, pp3, lp3] = request.security(syminfo.tickerid, i_tf3, detect(), lookahead = barmerge.lookahead_off)
[ph4, pl4, atr4, pw4, lw4, pp4, lp4] = request.security(syminfo.tickerid, i_tf4, detect(), lookahead = barmerge.lookahead_off)
float atrChart = ta.atr(i_atrLen)
f_transp(float sc) => int(f_clamp(i_baseTr - (sc / 10.0) * i_span, 30.0, 96.0))
f_score(float tfW, int cc, float wickAvg, float prom, float atrv) =>
float tfF = f_clamp(tfW, 0.0, 1.0)
float cnfF = f_clamp((cc - 1) / 2.0, 0.0, 1.0)
float wkF = atrv > 0 ? f_clamp(wickAvg / (atrv * 0.6), 0.0, 1.0) : 0.0
float prF = atrv > 0 ? f_clamp(prom / (atrv * 3.0), 0.0, 1.0) : 0.0
float wSum = math.max(i_wTF + i_wConf + i_wWick + i_wPro, 1e-6)
float raw = (tfF * i_wTF + cnfF * i_wConf + wkF * i_wWick + prF * i_wPro) / wSum
f_clamp(raw * 10.0 + i_confBonus * (cc - 1), 0.0, 10.0)
type SRZone
box body
label tag
bool isRes
bool hasTf1
bool hasTf2
bool hasTf3
bool hasTf4
float level
float topP
float botP
float tfW
int maxSec
float wickSum
int wickN
float prom
float score
int sesId
int sesStart
string tier
var SRZone[] zones = array.new<SRZone>()
var int sessionId = 0
var int curSesStart = na
var float lph1 = na
var float lph2 = na
var float lph3 = na
var float lph4 = na
var float lpl1 = na
var float lpl2 = na
var float lpl3 = na
var float lpl4 = na
f_thick() => i_thMode == "ATR ×" ? atrChart * i_thATR : close * i_thPct / 100.0
f_shade(bool isRes, float s) =>
isRes ? (s >= 6.5 ? i_r4 : s >= 5 ? i_r3 : s >= 3.5 ? i_r2 : i_r1) : (s >= 6.5 ? i_s4 : s >= 5 ? i_s3 : s >= 3.5 ? i_s2 : i_s1)
f_zc(SRZone z) =>
int cc = (z.hasTf1 ? 1 : 0) + (z.hasTf2 ? 1 : 0) + (z.hasTf3 ? 1 : 0) + (z.hasTf4 ? 1 : 0)
cc > 1 ? i_confCol : f_shade(z.isRes, z.score)
f_build(bool isRes, int tfIdx, float lvl, float atrv, float wick, float prom) =>
float h = f_thick()
float top = lvl + h / 2.0
float bot = lvl - h / 2.0
bool h1 = tfIdx == 1
bool h2 = tfIdx == 2
bool h3 = tfIdx == 3
bool h4 = tfIdx == 4
int sec = tfIdx == 1 ? sec1 : tfIdx == 2 ? sec2 : tfIdx == 3 ? sec3 : sec4
float tfW = f_tfWeight(sec)
float pr = na(prom) ? 0.0 : prom
float wk = na(wick) ? 0.0 : wick
float sc = f_score(tfW, 1, wk, pr, atrv)
color zc = f_shade(isRes, sc)
int right = time + (barstate.islast ? i_extendR * chartMs : 0)
box body = box.new(curSesStart, top, right, bot, xloc = xloc.bar_time, bgcolor = color.new(zc, f_transp(sc)), border_color = i_border ? color.new(zc, 30) : color.new(zc, 100), border_width = i_border ? 1 : 0)
label tag = label.new(int(math.round((curSesStart + right) / 2.0)), lvl, "", xloc = xloc.bar_time, style = label.style_none, textcolor = C_TXT, size = f_lab(i_labSize), textalign = text.align_center)
SRZone.new(body, tag, isRes, h1, h2, h3, h4, lvl, top, bot, tfW, sec, wk, wk > 0 ? 1 : 0, pr, sc, sessionId, curSesStart, f_tier(sc))
f_spawn(bool isRes, int tfIdx, float lvl, float atrv, float wick, float prom) =>
if not na(lvl) and not na(curSesStart)
zones.push(f_build(isRes, tfIdx, lvl, na(atrv) ? atrChart : atrv, wick, prom))
f_absorb(SRZone a, SRZone b) =>
a.hasTf1 := a.hasTf1 or b.hasTf1
a.hasTf2 := a.hasTf2 or b.hasTf2
a.hasTf3 := a.hasTf3 or b.hasTf3
a.hasTf4 := a.hasTf4 or b.hasTf4
float wkA = math.max(a.wickN, 1)
float wkB = math.max(b.wickN, 1)
a.level := (a.level * wkA + b.level * wkB) / (wkA + wkB)
a.wickSum += b.wickSum
a.wickN += b.wickN
a.prom := math.max(a.prom, b.prom)
a.tfW := math.max(a.tfW, b.tfW)
a.maxSec := math.max(a.maxSec, b.maxSec)
float h = f_thick()
a.topP := a.level + h / 2.0
a.botP := a.level - h / 2.0
int cc = (a.hasTf1 ? 1 : 0) + (a.hasTf2 ? 1 : 0) + (a.hasTf3 ? 1 : 0) + (a.hasTf4 ? 1 : 0)
float wickAvg = a.wickSum / math.max(a.wickN, 1)
a.score := f_score(a.tfW, cc, wickAvg, a.prom, atrChart)
a.tier := f_tier(a.score)
b.body.delete()
b.tag.delete()
f_consolidate() =>
bool didMerge = false
int n = zones.size()
if n > 1
for i = 0 to n - 2
if didMerge
break
for j = i + 1 to n - 1
SRZone A = zones.get(i)
SRZone B = zones.get(j)
if A.sesId == sessionId and B.sesId == sessionId and A.isRes == B.isRes
float tol = atrChart * i_mergeATR
if A.botP <= B.topP + tol and B.botP <= A.topP + tol
f_absorb(A, B)
zones.remove(j)
didMerge := true
break
didMerge
f_capSession() =>
int cnt = 0
if zones.size() > 0
for i = 0 toПоказано первые 50% кода (символов: 19389)
Открыть по тарифу
Купите тариф с пакетом открытий или войдите, если тариф уже есть. Открытый файл останется в вашем кабинете навсегда.
Разовая покупка файла
На этой странице откроется полный исходный код файла вместо ознакомительного фрагмента.
Зачем нужен email? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.