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

TJR Smart Money Model

indicator tjr smart money model for tradingview.pine
Вы автор или правообладатель?

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

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

О программе

TJR Smart Money Model — это индикатор для TradingView (Pine Script v6), предназначенный для визуализации и анализа рыночной структуры в концепциях Smart Money. Индикатор отображает свинг-пивоты, Break of Structure (BOS) и Change of Character (CHoCH), уровни ликвидности (BSL/SSL) и их спреи, справедливые пробелы (FVG), ордер-блоки, а также определяет сдвиг рыночной структуры (MSS) на основе параметров смещения.

Индикатор реализует пошаговую модель: от спрея ликвидности через подтверждение MSS до входа в зону равновесия. Для подтверждения входов опционально используется дивергенция с коррелированным инструментом (SMT). Доступны фильтрация сигналов по торговым сессиям (Лондон, Нью-Йорк) и монохромная окраска свечей.

При наличии торгового сигнала индикатор строит блоки TP/SL с уровнями, рассчитанными в единицах ATR, отслеживает результаты по TP1 и отображает статистику на дашборде. Дашборд показывает текущую рыночную конвекцию, направление биаса, стадию процесса, SMT-статус, килозону и последний сигнал. Индикатор поддерживает оповещения TradingView для BUY, SELL, ликвидностных спреев, CHoCH и SMT-дивергенций.

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

НастройкаОписание
pivLen Количество баров с каждой стороны для подтверждения свинг-хай/лоу. Чем выше значение, тем только более значимая структура отслеживается.
showBos Отображает метки и линии Break of Structure (BOS) и Change of Character (CHoCH) на графике.
showSwn Отмечает сырые точки свинг-хай и свинг-лоу маленькими метками на графике.
showLiq Отображает уровни ликвидности: Buy-Side Liquidity (BSL) над ценой и Sell-Side Liquidity (SSL) под ценой.
showSwp Отображает метки ликвидностных спреев — случаев, когда цена пробивает свинг-уровень и возвращается обратно.
dispAtr Минимальное тело свечи (в кратных ATR), необходимое для признания движения смещением при определении MSS.
mssWin Количество баров после ликвидностного спрея, в течение которого сдвиг рыночной структуры (MSS) считается подтверждением.
entryWin Количество баров, в течение которого зона входа остаётся актуальной после подтверждения MSS.
showFVG Отображает справедливые пробелы (Fair Value Gaps) на графике.
fvgMinAtr Минимальный размер справедливого пробела в кратных ATR для его отображения на графике.
fvgMax Максимальное количество одновременно отображаемых активных справедливых пробелов (FVG).
showOB Отображает ордер-блоки — зоны последующих свечей перед движением смещения.
obMax Максимальное количество одновременно отображаемых активных ордер-блоков.
zonePad Толщина зоны входа (в кратных ATR) вокруг 50%-ного уровня равновесия, когда нет справедливого пробела.
useSMT При включении входные сигналы требуют подтверждения SMT-дивергенцией с коррелированным инструментом.
smtInput Тикер коррелированного инструмента для проверки SMT-дивергенции. Пустое значение отключает проверку.
showSMT Отображает метки SMT-дивергенций, когда движение инструмента не подтверждается коррелированным символом.
useKZ При включении торговые сигналы генерируются только внутри активных килозон (торговых сессий).
kzTz Часовой пояс, в котором задаются временные окна килозон (например, America/New_York).
kzLdnOn Включает или отключает Лондонскую килозону для фильтрации сигналов и затенения графика.
kzLdn Временной диапазон Лондонской торговой сессии в формате часов (например, 0200-0500).
kzNyOn Включает или отключает утреннюю нью-йоркскую килозону для фильтрации сигналов и затенения графика.
kzNy Временной диапазон утренней нью-йоркской торговой сессии в формате часов (например, 0930-1100).
showKZ Затеняет области графика, соответствующие активным торговым сессиям (Лондон, Нью-Йорк).
paintC При включении свечи рисуются монохромно: бычьи — светлые, медвежьи — серые.
showBox Отображает блоки и линии уровней входа, стоп-лосса и тейк-профита при торговых сигналах.
atrLenT Длина ATR для расчёта индикатора смещения и уровней риска.
slPad Дополнительный отступ стоп-лосса за уровнем ликвидностного спрея в кратных ATR.
tp1R Первый тейк-профит в кратных от риска (R).
tp2R Второй тейк-профит в кратных от риска (R).
tp3R Третий тейк-профит в кратных от риска (R).
boxW Ширина блоков TP/SL в барах — горизонтальный размер отображения уровней входа, стоп-лосса и тейк-профита.
minGap Минимальное количество баров между последовательными сигналами BUY/SELL для предотвращения наложения.
showHUD Включает или отключает информационный дашборд с данными о биасе, стадии, сигнале и статистике.
hudPos Позиция дашборда на графике: верхний правый, верхний левый, нижний правый, нижний левый или средний правый угол.
hudSize Размер текста на дашборде: Tiny, Small, Normal или Large.
Получить полный код

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

indicator("TJR Smart Money Model", "TJR SMC", overlay = true, max_lines_count = 500, max_labels_count = 500, max_boxes_count = 500)

WHITE   = #F5F7FA
LGREY   = #C7CDD6
MGREY   = #8A93A3
DGREY   = #4A5160
INK     = #14181F
MUTE    = #8A93A3
ACC_UP  = #1E9E7A          // reserved bullish accent (sweep low / bullish MSS)
ACC_UPH = #56D6AE
ACC_DN  = #C0392B          // reserved bearish accent (sweep high / bearish MSS)
ACC_DNH = #E8837A
GOLD    = #C9A24B          // equilibrium / entry zone

gS      = "Structure"
pivLen  = input.int(8, "Swing pivot strength", minval = 2, group = gS, tooltip = "Bars either side used to confirm a swing high/low. Higher = only major structure is tracked.")
showBos = input.bool(true, "Show BOS / CHoCH", group = gS)
showSwn = input.bool(false, "Mark raw swing points", group = gS)

gL      = "Liquidity & Sweeps"
showLiq = input.bool(true, "Show liquidity levels (BSL/SSL)", group = gL, tooltip = "Draws the most recent buy-side (above) and sell-side (below) liquidity that price is likely to seek.")
showSwp = input.bool(true, "Mark liquidity sweeps", group = gL)

gM      = "Market Structure Shift"
dispAtr = input.float(0.6, "Displacement body (ATR x)", minval = 0.1, step = 0.1, group = gM, tooltip = "The MSS candle's body must exceed this multiple of ATR to count as displacement.")
mssWin  = input.int(12, "Sweep-to-MSS window (bars)", minval = 1, group = gM, tooltip = "How long after a sweep an MSS is still accepted as its confirmation.")
entryWin= input.int(20, "MSS-to-entry window (bars)", minval = 1, group = gM, tooltip = "How long the entry zone stays valid after an MSS before the setup is abandoned.")

gZ      = "Entry Zones"
showFVG = input.bool(true, "Show fair value gaps", group = gZ)
fvgMinAtr = input.float(0.20, "Min FVG size (ATR x)", minval = 0.0, step = 0.05, group = gZ)
fvgMax  = input.int(6, "Max live FVGs", minval = 1, maxval = 30, group = gZ)
showOB  = input.bool(true, "Show order blocks", group = gZ)
obMax   = input.int(6, "Max live order blocks", minval = 1, maxval = 20, group = gZ)
zonePad = input.float(0.10, "Equilibrium zone pad (ATR x)", minval = 0.0, step = 0.05, group = gZ, tooltip = "Thickness of the 50% equilibrium entry band when no fair-value gap is present.")

gSMT    = "SMT Divergence"
useSMT  = input.bool(false, "Require SMT divergence", group = gSMT, tooltip = "Only allow entries confirmed by a divergence against a correlated instrument.")
smtInput= input.symbol("", "Correlated symbol", group = gSMT, tooltip = "e.g. when trading one index, set its correlated index here. Leave blank to disable the check.")
showSMT = input.bool(true, "Label SMT divergences", group = gSMT)

gK      = "Killzones"
useKZ   = input.bool(false, "Only signal inside killzones", group = gK, tooltip = "Restrict entries to the session windows where this model is designed to be used.")
kzTz    = input.string("America/New_York", "Killzone timezone", group = gK)
kzLdnOn = input.bool(true, "London killzone", group = gK)
kzLdn   = input.session("0200-0500", "London window", group = gK)
kzNyOn  = input.bool(true, "New York AM killzone", group = gK)
kzNy    = input.session("0930-1100", "New York AM window", group = gK)
showKZ  = input.bool(true, "Shade killzones", group = gK)

gC      = "Candle Paint"
paintC  = input.bool(true, "Paint candles monochrome", group = gC, tooltip = "Bullish candles light, bearish candles grey — the signature clean tape.")

gTr     = "Signals & Trade"
showBox = input.bool(true, "TP/SL boxes", group = gTr)
atrLenT = input.int(14, "ATR length", minval = 1, group = gTr)
slPad   = input.float(0.5, "SL padding beyond sweep (ATR x)", minval = 0.0, step = 0.1, group = gTr)
tp1R    = input.float(1.0, "TP1 (R)", minval = 0.5, step = 0.5, group = gTr)
tp2R    = input.float(2.0, "TP2 (R)", minval = 0.5, step = 0.5, group = gTr)
tp3R    = input.float(3.0, "TP3 (R)", minval = 0.5, step = 0.5, group = gTr)
boxW    = input.int(28, "TP/SL box width (bars)", minval = 5, group = gTr)
minGap  = input.int(10, "Min bars between signals", minval = 0, group = gTr, tooltip = "Spacing so Buy/Sell never overlap on lower timeframes. 0 = off.")

gP      = "Dashboard"
showHUD = input.bool(true, "Show dashboard", group = gP)
hudPos  = input.string("Top Right", "Position", options = ["Top Right", "Top Left", "Bottom Right", "Bottom Left", "Middle Right"], group = gP)
hudSize = input.string("Normal", "Text size", options = ["Tiny", "Small", "Normal", "Large"], group = gP)

f_pos(string s) =>
    switch s
        "Top Right"    => position.top_right
        "Top Left"     => position.top_left
        "Bottom Right" => position.bottom_right
        "Bottom Left"  => position.bottom_left
        => position.middle_right

hudTS = hudSize == "Tiny" ? size.tiny : hudSize == "Small" ? size.small : hudSize == "Large" ? size.large : size.normal

atr = ta.atr(atrLenT)
atrSafe = na(atr) or atr <= 0 ? syminfo.mintick : atr

inLdn = kzLdnOn and not na(time(timeframe.period, kzLdn, kzTz))
inNy  = kzNyOn  and not na(time(timeframe.period, kzNy,  kzTz))
inKZ  = inLdn or inNy
killOK = not useKZ or inKZ

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

var float shPrice = na
var int   shBar   = na
var bool  shBroken= false
var float slPrice = na
var int   slBar   = na
var bool  slBroken= false

var float lastSHp = na
var float prevSHp = na
var float lastSLp = na
var float prevSLp = na

smtSym = smtInput == "" ? syminfo.tickerid : smtInput
[cHigh, cLow] = request.security(smtSym, timeframe.period, [high, low], lookahead = barmerge.lookahead_off)
var float lastSHc = na
var float prevSHc = na
var float lastSLc = na
var float prevSLc = na

if not na(ph)
    shPrice := ph
    shBar   := bar_index - pivLen
    shBroken:= false
    prevSHp := lastSHp
    lastSHp := ph
    prevSHc := lastSHc
    lastSHc := cHigh[pivLen]
if not na(pl)
    slPrice := pl
    slBar   := bar_index - pivLen
    slBroken:= false
    prevSLp := lastSLp
    lastSLp := pl
    prevSLc := lastSLc
    lastSLc := cLow[pivLen]

smtHasSym = smtInput != ""
bearSMT = smtHasSym and not na(prevSHp) and lastSHp > prevSHp and lastSHc <= prevSHc  // we higher high, corr didn't
bullSMT = smtHasSym and not na(prevSLp) and lastSLp < prevSLp and lastSLc >= prevSLc  // we lower low, corr didn't

if showSwn and not na(ph)
    label.new(bar_index - pivLen, ph, "·", style = label.style_none, textcolor = color.new(MGREY, 30), size = size.tiny)
if showSwn and not na(pl)
    label.new(bar_index - pivLen, pl, "·", style = label.style_none, textcolor = color.new(MGREY, 30), size = size.tiny)

if showSMT and bearSMT
    label.new(bar_index - pivLen, ph, "SMT", style = label.style_label_down, color = color.new(ACC_DN, 20), textcolor = WHITE, size = size.tiny, yloc = yloc.abovebar)
if showSMT and bullSMT
    label.new(bar_index - pivLen, pl, "SMT", style = label.style_label_up, color = color.new(ACC_UP, 20), textcolor = WHITE, size = size.tiny, yloc = yloc.belowbar)

var int bias = 0

bullBreak = not na(shPrice) and not shBroken and close > shPrice
bearBreak = not na(slPrice) and not slBroken and close < slPrice

bool choChUp = false
bool choChDn = false

if bullBreak
    choChUp := bias < 0          // break against a bearish bias = change of character
    shBroken := true
    bias := 1
if bearBreak
    choChDn := bias > 0
    slBroken := true
    bias := -1

if showBos and (bullBreak or bearBreak)
    lvl = bullBreak ? shPrice : slPrice
    x1  = bullBreak ? shBar : slBar
    line.new(x1, lvl, bar_index, lvl, color = bullBreak ? color.new(ACC_UP, 30) : color.new(ACC_DN, 30), style = line.style_dashed, width = 1)
    txt = (bullBreak ? (choChUp ? "CHoCH" : "BOS") : (choChDn ? "CHoCH" : "BOS"))
    label.new(bar_index, lvl, txt, style = bullBreak ? label.style_label_up : label.style_label_down, color = bullBreak ? color.new(ACC_UP, 15) : color.new(ACC_DN, 15), textcolor = WHITE, size = size.tiny, yloc = bullBreak ? yloc.belowbar : yloc.abovebar)

dispUp = (close - open) > dispAtr * atrSafe
dispDn = (open - close) > dispAtr * atrSafe

var line bslLine = na
var line sslLine = na
var label bslLbl = na
var label sslLbl = na
if showLiq and barstate.islast
    if na(bslLine)
        bslLine := line.new(bar_index, na, bar_index, na, color = color.new(MGREY, 40), style = line.style_dotted)
        sslLine := line.new(bar_index, na, bar_index, na, color = color.new(MGREY, 40), style = line.style_dotted)
        bslLbl  := label.new(bar_index, na, "", style = label.style_label_left, color = color.new(INK, 100), textcolor = MUTE, size = size.tiny)
        sslLbl  := label.new(bar_index, na, "", style = label.style_label_left, color = color.new(INK, 100), textcolor = MUTE, size = size.tiny)
    if not na(shPrice)
        line.set_xy1(bslLine, bar_index - 40, shPrice)
        line.set_xy2(bslLine, bar_index + 8, shPrice)
        label.set_xy(bslLbl, bar_index + 8, shPrice)
        label.set_text(bslLbl, " BSL " + str.tostring(shPrice, format.mintick))
    if not na(slPrice)
        line.set_xy1(sslLine, bar_index - 40, slPrice)
        line.set_xy2(sslLine, bar_index + 8, slPrice)
        label.set_xy(sslLbl, bar_index + 8, slPrice)
        label.set_text(sslLbl, " SSL " + str.tostring(slPrice, format.mintick))

sweepUp = not na(shPrice) and high > shPrice and close < shPrice   // raid buy-side -> bearish intent
sweepDn = not na(slPrice) and low  < slPrice and close > slPrice   // raid sell-side -> bullish intent

if showSwp and sweepUp
    label.new(bar_index, high, "sweep", style = label.style_label_down, color = color.new(ACC_DN, 35), textcolor = WHITE, size = size.tiny, yloc = yloc.abovebar)
if showSwp and sweepDn
    label.new(bar_index, low, "sweep", style = label.style_label_up, color = color.new(ACC_UP, 35), textcolor = WHITE, size = size.tiny, yloc = yloc.belowbar)

var array<box> obBox = array.new<box>()
var array<int> obDir = array.new<int>()

bullOB = dispUp and close[1] < open[1]
bearOB = dispDn and close[1] > open[1]

if showOB and bullOB
    b = box.new(bar_index - 1, math.max(open[1], close[1]), bar_index + 6, low[1], border_color = color.new(ACC_UP, 45), bgcolor = color.new(ACC_UP, 88), border_width = 1, text = "Demand", text_color = color.new(ACC_UP, 20), text_size = size.tiny, text_halign = text.align_left, text_valign = text.align_bottom)
    array.push(obBox, b)
    array.push(obDir, 1)
if showOB and bearOB
    b = box.new(bar_index - 1, high[1], bar_index + 6, math.min(open[1], close[1]), border_color = color.new(ACC_DN, 45), bgcolor = color.new(ACC_DN, 88), border_width = 1, text = "Supply", text_color = color.new(ACC_DN, 20), text_size = size.tiny, text_halign = text.align_left, text_valign = text.align_top)
    array.push(obBox, b)
    array.push(obDir, -1)

if array.size(obBox) > 0
    for i = array.size(obBox) - 1 to 0
        b   = array.get(obBox, i)
        d   = array.get(obDir, i)
        top = box.get_top(b)
        bot = box.get_bottom(b)
        mitig = d == 1 ? close < bot : close > top
        if mitig
            box.delete(b)
            array.remove(obBox, i)
            array.remove(obDir, i)
        else
            box.set_right(b, bar_index + 6)
while array.size(obBox) > obMax
    box.delete(array.shift(obBox))
    array.shift(obDir)
var table wm = table.new(position.bottom_right, 1, 1)
if barstate.isfirst
    table.cell(wm, 0, 0, "Telegram @SimpleForexTools", text_color = color.new(color.gray, 70), text_size = size.large)

var array<box>   fvgBox = array.new<box>()
var array<int>   fvgDir = array.new<int>()

bullFVG = low > high[2] and (low - high[2]) > fvgMinAtr * atrSafe
bearFVG = high < low[2] and (low[2] - high) > fvgMinAtr * atrSafe

if showFVG and bullFVG
    b = box.new(bar_index - 2, low, bar_index + 3, high[2], border_color = color.new(GOLD, 60), bgcolor = color.new(GOLD, 90))
    array.push(fvgBox, b)
    array.push(fvgDir, 1)
if showFVG and bearFVG
    b = box.new(bar_index - 2, low[2], bar_index + 3, high, border_color = color.new(GOLD, 60), bgcolor = color.new(GOLD, 90))
    array.push(fvgBox, b)
    array.push(fvgDir, -1)

if array.size(fvgBox) > 0
    for i = array.size(fvgBox) - 1 to 0
        b   = array.get(fvgBox, i)
        d   = array.get(fvgDir, i)
     

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

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

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

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

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

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

Стоимость полного кода
1 888,40₽ ≈ $23.08