Gold M1 Range + HTF Squeeze + SMC [Stable]
Похожие материалы по тегам
Сообщите нам, если считаете, что материал размещён без разрешения.
Сообщить о материале
Обращение по товару «range breakout @meowforex1.pine» отправится на рассмотрение. Укажите контакт для ответа и опишите причину.
О программе
Индикатор для 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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.