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? После подтверждения оплаты файл сохранится в кабинете на этот email. Если аккаунта ещё нет, мы создадим его и пришлём ссылку для задания пароля. Если аккаунт уже есть, покупка добавится в него. Укажите адрес, к которому у вас есть доступ.
Чтобы оформить заказ, введите email и перейдите к оплате.