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

Full Trendline + SMC System

indicator_full_trendline_+_smart_money_concepts_system_for_tradingview.pine
Вы автор или правообладатель?

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

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

О программе

Индикатор «Full Trendline + SMC System» для TradingView (Pine Script v6) отображает на графике систему анализа, объединяющую трендовые линии и концепции Smart Money. Он строит линии по точкам свинговых максимумов и минимумов, определяет структурные сдвиги рынка (BOS/CHOCH) и отрисовывает соответствующие линии и метки. Линии продлеваются вправо и автоматически ограничиваются по количеству.

Индикатор визуализирует ордер-блоки бычьего и медвежьего типа, справедливые пробелы (FVG), ликвидностные скачки (BSL/SSL), а также равные максимумы/минимумы (EQH/EQL). Каждый тип зон имеет настройки отображения, глубины поиска, продления и очистки заполненных. Все графические элементы рисуются поверх цены.

Предусмотрена линия 50%-ного эквилибриума с возможностью заливки зон премиума/дисконта, а также фильтр тренда на основе быстрой и медленной EMA. Индикатор генерирует сигналы BUY/SELL при совпадении нескольких факторов (структурные сдвиги, скачки, пробои трендовых линий, зоны, EMA) и минимальном уровне конфлюэнса. Доступны отдельные условия оповещений TradingView для каждого типа события.

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

НастройкаОписание
swingLen Минимальное расстояние (в барах) между свинговыми точками для определения локальных максимумов и минимумов цены.
keepTrendlines Максимальное количество трендовых линий (сопротивления и поддержки), одновременно отображаемых на графике.
showTrendlines Отображение трендовых линий сопротивления и поддержки, соединяющих свинговые точки на графике.
showTLBreaks Отображение меток пробитых трендовых линий (TL Break) при их преодолении ценой.
showStructure Отображение структурных сдвигов: BOS (прорыв структуры) и CHOCH (изменение характера) с линиями и метками.
showSweeps Отображение ликвидностных скачков: BSL Sweep (снимение медвежьей ликвидности) и SSL Sweep (снимение бычьей ликвидности).
showEQ Отображение равных максимумов (EQH) и равных минимумов (EQL) с горизонтальными линиями и метками.
eqAtrLen Период индикатора средних истинных диапазонов (ATR), определяющий допуск при распознавании равных максимумов и минимумов (EQH/EQL).
eqAtrMult Множитель ATR, задающий допуск (в ценовых единицах) для определения равных максимумов и минимумов (EQH/EQL).
showOB Отображение зон ордер-блоков (бычьих и медвежьих) в виде прямоугольников на графике.
obLookback Глубина поиска (в количестве баров назад) для обнаружения ордер-блоков при формировании структурного сдвига.
obExtend Количество баров вправо, на которые продлеваются прямоугольники ордер-блоков на графике.
obMode Режим построения диапазона ордер-блока: по свечным теням (Wick) или по телу свечи (Body).
keepOB Максимальное количество зон ордер-блоков (бычьих и медвежьих), одновременно отображаемых на графике.
showFVG Отображение справедливых пробелов (Fair Value Gaps) в виде прямоугольников на графике.
fvgExtend Количество баров вправо, на которые продлеваются прямоугольники справедливых пробелов (FVG) на графике.
keepFVG Максимальное количество прямоугольников справедливых пробелов (FVG), одновременно отображаемых на графике.
deleteFilledFVG Удаление справедливых пробелов (FVG), которые были полностью закрыты ценой, вместо того чтобы оставлять их на графике.
showPD Отображение горизонтальной линии 50%-ного эквилибриума между последним свинговым максимумом и минимумом.
shadePD Включает заливку фона графика в зоне премиума (цена выше 50%-ного эквилибриума) или дисконта (цена ниже).
showSignals Отображение графических меток BUY и SELL на графике при выполнении условий генерации сигналов.
minConfluence Минимальное количество совпадающих факторов (от 2 до 5), необходимое для генерации сигнала Buy или Sell.
requireClosedCandle Требование подтверждения свечи закрытием (а не в реальном времени) перед генерацией торговых сигналов.
useEMAFilter Включение фильтра тренда на основе соотношения быстрой и медленной EMA: бычий сигнал только при быстрой EMA выше медленной и наоборот.
emaFastLen Период быстрой скользящей средней экспоненциального типа (EMA), используемой в качестве фильтра тренда при генерации сигналов.
emaSlowLen Период медленной скользящей средней экспоненциального типа (EMA), используемой в качестве фильтра тренда при генерации сигналов.
showEMAs Отображение быстрой и медленной скользящих средних EMA на графике при включённом фильтре тренда.
bullColor Цвет бычьих (восходящих) графических элементов: трендовых линий, меток структуры, зон ордер-блоков и FVG, а также сигналов Buy.
bearColor Цвет медвежьих (нисходящих) графических элементов: трендовых линий, меток структуры, зон ордер-блоков и FVG, а также сигналов Sell.
neutralColor Цвет нейтральных графических элементов: линии 50%-ного эквилибриума и, при необходимости, заливки зон.
Получить полный код

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

indicator("Full Trendline + SMC System", overlay=true, max_lines_count=500, max_labels_count=500, max_boxes_count=500)

gTrend = "Trendlines"
swingLen = input.int(5, "Swing length", minval=2, group=gTrend)
keepTrendlines = input.int(8, "Keep trendlines", minval=1, maxval=50, group=gTrend)
showTrendlines = input.bool(true, "Show trendlines", group=gTrend)
showTLBreaks = input.bool(true, "Show trendline breaks", group=gTrend)

gSMC = "SMC Structure"
showStructure = input.bool(true, "Show BOS / CHOCH", group=gSMC)
showSweeps = input.bool(true, "Show liquidity sweeps", group=gSMC)
showEQ = input.bool(true, "Show EQH / EQL", group=gSMC)
eqAtrLen = input.int(14, "EQ tolerance ATR length", minval=1, group=gSMC)
eqAtrMult = input.float(0.10, "EQ tolerance ATR multiplier", minval=0.01, step=0.01, group=gSMC)

gOB = "Order Blocks"
showOB = input.bool(true, "Show order blocks", group=gOB)
obLookback = input.int(20, "OB search lookback", minval=3, maxval=100, group=gOB)
obExtend = input.int(80, "OB extend bars", minval=5, maxval=500, group=gOB)
obMode = input.string("Wick", "OB range", options=["Wick", "Body"], group=gOB)
keepOB = input.int(8, "Keep OB zones", minval=1, maxval=50, group=gOB)

gFVG = "Fair Value Gaps"
showFVG = input.bool(true, "Show FVG", group=gFVG)
fvgExtend = input.int(80, "FVG extend bars", minval=5, maxval=500, group=gFVG)
keepFVG = input.int(10, "Keep FVG zones", minval=1, maxval=50, group=gFVG)
deleteFilledFVG = input.bool(true, "Delete filled FVG", group=gFVG)

gPD = "Premium / Discount"
showPD = input.bool(true, "Show 50% equilibrium", group=gPD)
shadePD = input.bool(false, "Shade premium / discount", group=gPD)

gSignals = "Signals"
showSignals = input.bool(true, "Show Buy / Sell signals", group=gSignals)
minConfluence = input.int(3, "Minimum confluence factors", minval=2, maxval=5, group=gSignals)
requireClosedCandle = input.bool(true, "Require closed candle", group=gSignals)
useEMAFilter = input.bool(false, "Use EMA trend filter", group=gSignals)
emaFastLen = input.int(50, "Fast EMA", minval=1, group=gSignals)
emaSlowLen = input.int(200, "Slow EMA", minval=1, group=gSignals)
showEMAs = input.bool(false, "Show EMAs", group=gSignals)

gStyle = "Style"
bullColor = input.color(color.rgb(0, 170, 90), "Bull color", group=gStyle)
bearColor = input.color(color.rgb(220, 70, 70), "Bear color", group=gStyle)
neutralColor = input.color(color.rgb(150, 150, 150), "Neutral color", group=gStyle)

f_trimLines(array<line> arr, int maxCount) =>
    while array.size(arr) > maxCount
        line.delete(array.shift(arr))

f_trimLabels(array<label> arr, int maxCount) =>
    while array.size(arr) > maxCount
        label.delete(array.shift(arr))

f_trimBoxes(array<box> arr, int maxCount) =>
    while array.size(arr) > maxCount
        box.delete(array.shift(arr))

f_manageOB(array<box> arr, bool bullish, int extBars) =>
    int i = array.size(arr) - 1
    while i >= 0
        box bx = array.get(arr, i)
        float top = box.get_top(bx)
        float bot = box.get_bottom(bx)
        bool invalid = bullish ? close < bot : close > top
        if invalid
            box.delete(bx)
            array.remove(arr, i)
        else
            box.set_right(bx, bar_index + extBars)
        i -= 1

f_manageFVG(array<box> arr, bool bullish, int extBars, bool deleteFilled) =>
    int i = array.size(arr) - 1
    while i >= 0
        box bx = array.get(arr, i)
        float top = box.get_top(bx)
        float bot = box.get_bottom(bx)
        bool filled = bullish ? low <= bot : high >= top
        if filled and deleteFilled
            box.delete(bx)
            array.remove(arr, i)
        else
            box.set_right(bx, bar_index + extBars)
        i -= 1

f_zoneTouched(array<box> arr) =>
    bool touched = false
    int i = array.size(arr) - 1
    while i >= 0
        box bx = array.get(arr, i)
        float top = box.get_top(bx)
        float bot = box.get_bottom(bx)
        if high >= bot and low <= top
            touched := true
        i -= 1
    touched

f_score(bool condition) =>
    condition ? 1 : 0

f_getBullOB(int lb, bool useWicks) =>
    int off = na
    float top = na
    float bot = na
    for i = 1 to lb
        if na(off) and close[i] < open[i]
            off := i
            top := useWicks ? high[i] : open[i]
            bot := useWicks ? low[i] : close[i]
    [off, top, bot]

f_getBearOB(int lb, bool useWicks) =>
    int off = na
    float top = na
    float bot = na
    for i = 1 to lb
        if na(off) and close[i] > open[i]
            off := i
            top := useWicks ? high[i] : close[i]
            bot := useWicks ? low[i] : open[i]
    [off, top, bot]

var int lastHighBar = na
var float lastHighPrice = na
var int prevHighBar = na
var float prevHighPrice = na

var int lastLowBar = na
var float lastLowPrice = na
var int prevLowBar = na
var float prevLowPrice = na

var int msTrend = 0

var line activeResLine = na
var line activeSupLine = na

var array<line> resLines = array.new_line()
var array<line> supLines = array.new_line()
var array<line> msLines = array.new_line()
var array<line> eqLines = array.new_line()

var array<label> msLabels = array.new_label()
var array<label> sweepLabels = array.new_label()
var array<label> tlLabels = array.new_label()
var array<label> eqLabels = array.new_label()

var array<box> bullOBs = array.new_box()
var array<box> bearOBs = array.new_box()
var array<box> bullFVGs = array.new_box()
var array<box> bearFVGs = array.new_box()

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

atr = ta.atr(eqAtrLen)
eqTolerance = atr * eqAtrMult

if not na(ph)
    int newHighBar = bar_index - swingLen

    if showEQ and not na(lastHighPrice) and math.abs(ph - lastHighPrice) <= eqTolerance
        float lvl = (ph + lastHighPrice) / 2.0
        line l = line.new(lastHighBar, lvl, newHighBar, lvl, color=color.new(bearColor, 0), style=line.style_dotted, width=1)
        label lb = label.new(newHighBar, lvl, "EQH", style=label.style_label_down, color=color.new(bearColor, 0), textcolor=color.white, size=size.tiny)
        array.push(eqLines, l)
        array.push(eqLabels, lb)
        f_trimLines(eqLines, 30)
        f_trimLabels(eqLabels, 30)

    prevHighBar := lastHighBar
    prevHighPrice := lastHighPrice
    lastHighBar := newHighBar
    lastHighPrice := ph

    if showTrendlines and not na(prevHighBar)
        activeResLine := line.new(prevHighBar, prevHighPrice, lastHighBar, lastHighPrice, extend=extend.right, color=color.new(bearColor, 0), width=2)
        array.push(resLines, activeResLine)
        f_trimLines(resLines, keepTrendlines)

if not na(pl)
    int newLowBar = bar_index - swingLen

    if showEQ and not na(lastLowPrice) and math.abs(pl - lastLowPrice) <= eqTolerance
        float lvl = (pl + lastLowPrice) / 2.0
        line l = line.new(lastLowBar, lvl, newLowBar, lvl, color=color.new(bullColor, 0), style=line.style_dotted, width=1)
        label lb = label.new(newLowBar, lvl, "EQL", style=label.style_label_up, color=color.new(bullColor, 0), textcolor=color.white, size=size.tiny)
        array.push(eqLines, l)
        array.push(eqLabels, lb)
        f_trimLines(eqLines, 30)
        f_trimLabels(eqLabels, 30)

    prevLowBar := lastLowBar
    prevLowPrice := lastLowPrice
    lastLowBar := newLowBar
    lastLowPrice := pl

    if showTrendlines and not na(prevLowBar)
        activeSupLine := line.new(prevLowBar, prevLowPrice, lastLowBar, lastLowPrice, extend=extend.right, color=color.new(bullColor, 0), width=2)
        array.push(supLines, activeSupLine)
        f_trimLines(supLines, keepTrendlines)

float resNow = not na(activeResLine) ? line.get_price(activeResLine, bar_index) : na
float resPrev = not na(activeResLine) ? line.get_price(activeResLine, bar_index - 1) : na
float supNow = not na(activeSupLine) ? line.get_price(activeSupLine, bar_index) : na
float supPrev = not na(activeSupL

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

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

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

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

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

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

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