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