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

Gold M1 Range + HTF Squeeze + SMC [Stable]

range breakout @meowforex1.pine

Похожие материалы по тегам

#1.mtf_collider_h4_close_13_v18bar.mq4MQL4 / MetaTrader 4 · 1 общих тегов!mth_fasttmaline_edit3.mq4MQL4 / MetaTrader 4 · 1 общих тегов!mth_fasttmaline_edit2.mq4MQL4 / MetaTrader 4 · 1 общих тегов!mth_fasttmaline_edit.mq4MQL4 / MetaTrader 4 · 1 общих теговsmcj, fix.mq5MQL5 / MetaTrader 5 · 1 общих теговbabon slope .mq5MQL5 / MetaTrader 5 · 1 общих тегов
Вы автор или правообладатель?

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

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

О программе

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

Диапазон формируется, когда цена удерживается в узком коридоре относительно волатильности. При выходе цены за границы диапазона прямоугольник перекрашивается в цвет пробоя вверх или вниз, а на графике появляются треугольные метки. Дополнительно индикатор отслеживает структуру рынка по свингам и отмечает события BOS и CHoCH.

Встроенные фильтры оценивают сжатие полос Боллинджера относительно каналов Кельтнера, отсутствие тренда по ADX, «пилообразность» по коэффициенту эффективности, низкий объём и сжатие на старших таймфреймах (5, 15, 30 и 60 минут). Когда условия сжатия и отсутствия тренда совпадают, диапазон помечается как зона AVOID. Индикатор также формирует условия для оповещений TradingView по пробоям, смене состояния AVOID и структурным событиям.

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

НастройкаОписание
length Минимальное число баров, в течение которых цена должна удерживаться в узком коридоре для формирования диапазона.
mult Множитель ATR, задающий ширину коридора диапазона.
atrLen Период расчёта ATR, применяемого для определения ширины диапазона.
useBBSq Включает требование сжатия полос Боллинджера для пометки зоны AVOID.
bbLen Период расчёта полос Боллинджера для оценки сжатия.
bbMult Множитель стандартного отклонения для полос Боллинджера.
kcLen Период расчёта каналов Кельтнера для оценки сжатия.
kcMult Множитель ATR для каналов Кельтнера.
adxLen Период расчёта ADX, используемого для оценки отсутствия тренда.
adxThres Порог ADX: значения ниже этого уровня трактуются как отсутствие тренда.
erLen Период расчёта коэффициента эффективности, оценивающего «пилообразность» движения.
erThres Порог коэффициента эффективности: значения ниже этого уровня трактуются как «пилообразное» движение.
useVolume Включает учёт низкого объёма при определении зоны AVOID.
volLen Период расчёта скользящей средней объёма.
volMult Порог низкого объёма как доля от средней объёма.
useHTF Включает учёт сжатия на старших таймфреймах.
htfNeed Минимальное число старших таймфреймов, на которых должно наблюдаться сжатие (от 1 до 4).
htfLength Период расчёта диапазона на старших таймфреймах.
htfMult Множитель ATR для оценки ширины диапазона на старших таймфреймах.
htfAdxTh Порог ADX на старших таймфреймах: значения ниже этого уровня означают отсутствие тренда.
swingLen Длина свинга для определения структуры рынка.
showStruct Включает отображение структурных событий BOS и CHoCH.
upCss Цвет диапазона после пробоя вверх.
dnCss Цвет диапазона после пробоя вниз.
unbrokenCss Цвет диапазона, который ещё не пробит.
avoidCss Цвет заливки диапазона, помеченного как зона AVOID.
showBg Включает подсветку фона графика, когда активна зона AVOID.
showMid Включает отображение линий верхней и нижней границ диапазона.
showBreakLbl Включает отображение треугольных меток в моменты пробоя диапазона.
Получить полный код

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

indicator("Gold M1 Range + HTF Squeeze + SMC [Stable]", overlay=true, max_boxes_count=500, max_lines_count=500, max_labels_count=500)

grpR = "Range Detector (stable boxes)"
length = input.int(20, "Minimum Range Length", minval=2, group=grpR)
mult   = input.float(1.0, "Range Width (ATR mult)", minval=0.1, step=0.1, group=grpR)
atrLen = input.int(500, "ATR Length", minval=1, group=grpR)

grpSq = "Squeeze / Chop filters"
useBBSq  = input.bool(true, "Require BB Squeeze for AVOID", group=grpSq)
bbLen    = input.int(20, "BB Length", group=grpSq)
bbMult   = input.float(2.0, "BB Mult", step=0.1, group=grpSq)
kcLen    = input.int(20, "Keltner Length", group=grpSq)
kcMult   = input.float(1.5, "Keltner Mult", step=0.1, group=grpSq)
adxLen   = input.int(14, "ADX Length", group=grpSq)
adxThres = input.float(25.0, "ADX below = no trend", step=0.5, group=grpSq)
erLen    = input.int(10, "ER Length", group=grpSq)
erThres  = input.float(0.35, "ER below = choppy", step=0.01, group=grpSq)

grpV = "Volume"
useVolume = input.bool(true, "Use Low Volume in AVOID", group=grpV)
volLen    = input.int(20, "Volume MA Length", group=grpV)
volMult   = input.float(0.85, "Low Volume threshold", step=0.05, group=grpV)

grpHTF = "HTF M5 / M15 / M30 / H1"
useHTF    = input.bool(true, "Use HTF compression", group=grpHTF)
htfNeed   = input.int(2, "Min HTFs compressed (1-4)", minval=1, maxval=4, group=grpHTF)
htfLength = input.int(20, "HTF range length", minval=2, group=grpHTF)
htfMult   = input.float(2.8, "HTF range ATR mult", step=0.1, group=grpHTF)
htfAdxTh  = input.float(27.0, "HTF ADX no-trend", step=0.5, group=grpHTF)

grpSMC = "SMC (light)"
swingLen   = input.int(5, "Structure swing length", minval=2, group=grpSMC)
showStruct = input.bool(true, "Show BOS / CHoCH", group=grpSMC)

grpStyle = "Style"
upCss       = input.color(#089981, "Broken Upward", group=grpStyle)
dnCss       = input.color(#f23645, "Broken Downward", group=grpStyle)
unbrokenCss = input.color(#2157f3, "Unbroken Range", group=grpStyle)
avoidCss    = input.color(#ff9800, "AVOID fill", group=grpStyle)
showBg      = input.bool(true, "Background when AVOID", group=grpStyle)
showMid     = input.bool(true, "Show range top/bottom plots", group=grpStyle)
showBreakLbl = input.bool(true, "Show breakout triangles", group=grpStyle)

n   = bar_index
atr = ta.atr(atrLen) * mult
ma  = ta.sma(close, length)

count = 0
for i = 0 to length - 1
    count += math.abs(close[i] - ma) > atr ? 1 : 0

var box   bx = na
var line  lvl = na
var float max = na
var float min = na
var int   os = 0
color detect_css = na

if count == 0 and count[1] != 0
    if not na(bx) and n[length] <= bx.get_right()
        max := math.max(ma + atr, bx.get_top())
        min := math.min(ma - atr, bx.get_bottom())
        bx.set_top(max)
        bx.set_rightbottom(n, min)
        bx.set_bgcolor(color.new(unbrokenCss, 80))
        bx.set_border_color(unbrokenCss)
        avg = math.avg(max, min)
        if not na(lvl)
            lvl.set_y1(avg)
            lvl.set_xy2(n, avg)
            lvl.set_color(unbrokenCss)
        os := 0
    else
        max := ma + atr
        min := ma - atr
        bx  := box.new(n[length], max, n, min, border_color=unbrokenCss, bgcolor=color.new(unbrokenCss, 80), border_width=2)
        lvl := line.new(n[length], math.avg(max, min), n, math.avg(max, min), color=unbrokenCss, style=line.style_dotted, width=2)
        detect_css := color.new(color.gray, 85)
        os := 0

else if count == 0 and not na(bx) and os == 0
    bx.set_right(n)
    if not na(lvl)
        lvl.set_x2(n)

if not na(bx)
    if close > bx.get_top()
        bx.set_bgcolor(color.new(upCss, 80))
        bx.set_border_color(upCss)
        if not na(lvl)
            lvl.set_color(upCss)
        os := 1
    else if close < bx.get_bottom()
        bx.set_bgcolor(color.new(dnCss, 80))
        bx.set_border_color(dnCss)
        if not na(lvl)
            lvl.set_color(dnCss)
        os := -1

inActiveRange = not na(bx) and os == 0 and count == 0

bbBasis = ta.sma(close, bbLen)
bbDev   = bbMult * ta.stdev(close, bbLen)
kcBasis = ta.ema(close, kcLen)
kcAtr   = ta.atr(kcLen)
squeezeOn = (bbBasis + bbDev) < (kcBasis + kcMult * kcAtr) and (bbBasis - bbDev) > (kcBasis - kcMult * kcAtr)

[diP, diM, adx] = ta.dmi(adxLen, adxLen)
noTrend = adx < adxThres

chg  = math.abs(close - close[erLen])
volE = math.sum(math.abs(close - close[1]), erLen)
er   = volE != 0 ? chg / volE : 1.0
isChoppy = er < erThres

volMa     = ta.sma(volume, volLen)
lowVolume = volume < volMa * volMult

f_htf_cond() =>
    htf_atr = ta.atr(14)
    htf_hh  = ta.highest(high, htfLength)
    htf_ll  = ta.lowest(low, htfLength)
    [_, _, htf_adx] = ta.dmi(adxLen, adxLen)
    (htf_hh - htf_ll) < (htf_atr * htfMult) and htf_adx < htfAdxTh

m5c  = request.security(syminfo.tickerid, "5",  f_htf_cond(), barmerge.gaps_off, barmerge.lookahead_off)
m15c = request.security(syminfo.tickerid, "15", f_htf_cond(), barmerge.gaps_off, barmerge.lookahead_off)
m30c = request.security(syminfo.tickerid, "30", f_htf_cond(), barmerge.gaps_off, barmerge.lookahead_off)
h1c  = request.security(syminfo.tickerid, "60", f_htf_cond(), barmerge.gaps_off, barmerge.lookahead_off)

htfScore = (m5c ? 1 : 0) + (m15c ? 1 : 0) + (m30c ? 1 : 0) + (h1c ? 1 : 0)
htfOK    = htfScore >= htfNeed

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

var float lastPH = na
var float lastPL = na
var int   lastPHbar = na
var int   lastPLbar = na
var int   trend = 0
var bool  isBOS = false
var bool  isCHOCH = false

if not na(ph)
    lastPH := ph
    lastPHbar := bar_index - swingLen
if not na(pl)
    lastPL := pl
    lastPLbar := bar_index - swingLen

isBOS   := false
isCHOCH := false

crossUpPH = ta.crossover(close, lastPH)
crossDnPL = ta.crossunder(close, lastPL)

if barstate.isconfirmed and not na(lastPH) and crossUpPH
    isCHOCH := trend == -1
    isBOS   := trend != -1
    trend   := 1
    if showStruct
        line.new(lastPHbar, lastPH, bar_index, lastPH, color=upCss, width=1, style=line.style_dashed)
        label.new(bar_index, lastPH, isCHOCH ? "CHoCH ▲" : "BOS ▲", style=label.style_label_down, color=upCss, textcolor=color.white, size=size.tiny)

if barstate.isconfirmed and not na(lastPL) and crossDnPL
    isCHOCH := trend == 1
    isBOS   := trend != 1
    trend   := -1
    if showStruct
        line.new(lastPLbar, l

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

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

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

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

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

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

Стоимость полного кода
1 038,70₽ ≈ $12.70