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

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 и перейдите к оплате.

Стоимость полного кода
1 938,90₽ ≈ $23.70