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

Smart Money Renko Matrix

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

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

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

О программе

Smart Money Renko Matrix — индикатор для TradingView, написанный на Pine Script v6. Отображает ренко-свечи на графике с градиентной окраской, зависящей от направления и длины серии сделок. Использует ATR для определения размера блоков ренко и позволяет настраивать визуальное представление через пользовательские параметры.

Индикатор включает мультитаймфреймовую матрицу сходимости на основе скользящих средних, а также элементы анализа структуры рынка: обнаружение ликвидностных сдвигов, отображение ордер-блоков институциональных игроков и фильтрацию по торговым сессиям. Поддерживается автоматическое определение точек разворота характера и профиль объёма с уровнем POC.

Встроенный модуль управления рисками рассчитывает уровни стоп-лосса и три цели прибыли на основе ATR, а также отображает линию трейлинг-стопа. При наступлении сигналов индикатор формирует JSON-оповещения с ценовыми уровнями и отправляет их через систему алертов TradingView. На графике отображается информационная панель с текущими параметрами индикатора.

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

НастройкаОписание
i_atrLen Длина ATR — Период расчёта ATR, используемый для определения размера блоков ренко
i_mult Множитель разрешения ATR — Множитель, применяемый к ATR при расчёте таймфрейма для ренко-бингов
i_cBullA Начальный цвет бычьего градиента — Цвет начала градиента для бычьих серий
i_cBullB Конечный цвет бычьего градиента — Цвет конца градиента для бычьих серий
i_cBearA Начальный цвет медвежьего градиента — Цвет начала градиента для медвежьих серий
i_cBearB Конечный цвет медвежьего градиента — Цвет конца градиента для медвежьих серий
i_gDepth Глубина градиента серии — Количество баров, за которое градиент переходит от начального к конечному цвету
i_sltp Динамические SL/TP в алертах — Включает ли уровни стоп-лосса и целей прибыли в JSON-оповещения
i_structSl Использовать стоп-лосс по структуре — Включает привязку стоп-лосса к ближайшему ордер-блоку вместо ATR
i_slMult Множитель ATR для стоп-лосса — Множитель ATR, определяющий расстояние стоп-лосса от цены входа
i_tp1Mult Множитель ATR для цели 1 — Множитель ATR для первого уровня фиксации прибыли
i_tp2Mult Множитель ATR для цели 2 — Множитель ATR для второго уровня фиксации прибыли
i_tp3Mult Множитель ATR для цели 3 — Множитель ATR для третьего уровня фиксации прибыли
i_trail Показывать линию трейлинг-стопа — Отображает ли линию трейлинг-стопа на графике
i_useMtf Использовать мультитаймфреймовую матрицу — Включает подтверждение сигнала по нескольким таймфреймам через скользящие средние
i_mtfTf1 Таймфрейм матрицы 1 — Первый таймфрейм для мультитаймфреймового анализа
i_mtfTf2 Таймфрейм матрицы 2 — Второй таймфрейм для мультитаймфреймового анализа
i_mtfTf3 Таймфрейм матрицы 3 — Третий таймфрейм для мультитаймфреймового анализа
i_showLiq Показывать сдвиги ликвидности — Отображает маркеры ликвидностных сдвигов на графике
i_liqLen Глубина поиска сдвигов — Количество баров назад для поиска экстремумов при определении сдвигов ликвидности
i_cLiqB Цвет бычьего сдвига — Цвет маркера бычьего сдвига ликвидности
i_cLiqS Цвет медвежьего сдвига — Цвет маркера медвежьего сдвига ликвидности
i_showIob Показывать институциональные ордер-блоки — Отображает блоки ордеров институциональных игроков на графике
i_iobMax Максимум активных ордер-блоков — Максимальное количество отображаемых ордер-блоков одновременно
i_useKz Включить зоны убийства сессий — Включает фильтрацию сигналов по заданным торговым сессиям
i_session Активные сессии (UTC) — Диапазоны времени торговых сессий в UTC для фильтрации сигналов
i_showWick Показывать отклонения по теням (x3) — Отмечает точки, где три и более подряд свечей имеют отклонение по тени
i_showDiv Показывать дивергенцию объёма — Отображает маркеры дивергенции между направлением сделки и уровнем объёма
i_aLong Действие Long — Текстовое значение действия для бычьего сигнала в вебхуке
i_aShort Действие Short — Текстовое значение действия для медвежьего сигнала в вебхуке
i_aCLong Закрытие Long — Текстовое значение действия для закрытия длинной позиции в вебхуке
i_aCSh Закрытие Short — Текстовое значение действия для закрытия короткой позиции в вебхуке
dash_bg_color Цвет фона панели — Фоновый цвет информационной таблицы на графике
dash_txt_color Цвет текста панели — Цвет текста в информационной таблице на графике
Получить полный код

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

indicator("Smart Money Renko Matrix", overlay=true, precision=5)

type RenkoBar
    float rc = na
    float ro = na
    float vol = na

type SignalEngine
    int  lStrk = 0
    int  sStrk = 0
    bool isBull = false
    bool isBear = false
    bool buyF = false
    bool sellF = false
    bool isChoCh = false
    float entryPrice = na

type RiskManager
    float sl = na
    float tp1 = na
    float tp2 = na
    float tp3 = na
    float trailStop = na

method updateSignals(SignalEngine this, float rcConf, float roConf, bool mtfBull, bool mtfBear, bool inKz, int recentSweep) =>
    this.isBull := rcConf > roConf
    this.isBear := rcConf < roConf
    this.lStrk := this.isBull ? this.lStrk + 1 : 0
    this.sStrk := this.isBear ? this.sStrk + 1 : 0
    this.buyF := this.lStrk == 1 and mtfBull and inKz
    this.sellF := this.sStrk == 1 and mtfBear and inKz
    this.isChoCh := (this.buyF and recentSweep == -1) or (this.sellF and recentSweep == 1)
    this.entryPrice := rcConf

f_color(int streak, color cA, color cB, int gd, bool highVol, bool exhausted) =>
    float t = math.min(streak / float(gd), 1.0)
    int   a = math.max(highVol ? 5 : 40, 50 - streak * 4)
    if exhausted
        a := 85
    color.new(color.from_gradient(t, 0.0, 1.0, cA, cB), a)

float  i_atrLen  = input.float(10.0, "ATR Length",       minval=1, maxval=100, step=1, group="◈ Renko")
int    i_mult    = input.int(1,      "ATR Resolution ×", minval=0,                     group="◈ Renko")

color  i_cBullA  = input.color(#0A2818, "Bull → Start",          group="◈ Visuals")
color  i_cBullB  = input.color(#39FF6A, "Bull → End",            group="◈ Visuals")
color  i_cBearA  = input.color(#2A0A0A, "Bear → Start",          group="◈ Visuals")
color  i_cBearB  = input.color(#FF4500, "Bear → End",            group="◈ Visuals")
int    i_gDepth  = input.int(12,        "Gradient Streak Depth", minval=3, maxval=50,  group="◈ Visuals")

bool   i_sltp       = input.bool(true,  "Dynamic SL/TP in Alerts", group="◈ Risk Management")
bool   i_structSl   = input.bool(false,  "Use Structure-Based SL",  group="◈ Risk Management")
float  i_slMult     = input.float(1.5,  "SL ATR Multiplier",       minval=0.1, maxval=10.0, step=0.1, group="◈ Risk Management")
float  i_tp1Mult    = input.float(2.0,  "TP1 ATR Multiplier",      minval=0.1, maxval=20.0, step=0.1, group="◈ Risk Management")
float  i_tp2Mult    = input.float(4.0,  "TP2 ATR Multiplier",      minval=0.1, maxval=20.0, step=0.1, group="◈ Risk Management")
float  i_tp3Mult    = input.float(6.0,  "TP3 ATR Multiplier",      minval=0.1, maxval=20.0, step=0.1, group="◈ Risk Management")
bool   i_trail      = input.bool(true,  "Show Trailing Stop Line", group="◈ Risk Management")

bool   i_useMtf  = input.bool(false,  "Use MTF Matrix",            group="◈ Quant Matrix")
string i_mtfTf1  = input.timeframe("60",  "MTF Tier 1 (1H)",      group="◈ Quant Matrix")
string i_mtfTf2  = input.timeframe("240", "MTF Tier 2 (4H)",      group="◈ Quant Matrix")
string i_mtfTf3  = input.timeframe("D",   "MTF Tier 3 (1D)",      group="◈ Quant Matrix")

bool   i_showLiq = input.bool(true,  "Show Liquidity Sweeps",     group="◈ SMC & Liquidity")
int    i_liqLen  = input.int(10,     "Sweep Lookback (bars)",     minval=3, maxval=50, group="◈ SMC & Liquidity")
color  i_cLiqB   = input.color(color.rgb(50, 220, 255), "Bullish Sweep Color", group="◈ SMC & Liquidity")
color  i_cLiqS   = input.color(color.rgb(255, 140, 0),  "Bearish Sweep Color", group="◈ SMC & Liquidity")
bool   i_showIob = input.bool(true,  "Show Institutional OBs",    group="◈ SMC & Liquidity")
int    i_iobMax  = input.int(5,      "Max Active OBs",            minval=1, maxval=10, group="◈ SMC & Liquidity")
bool   i_useKz   = input.bool(false, "Enable Session Killzones",  group="◈ SMC & Liquidity")
string i_session = input.session("0800-1200,1300-1700", "Active Sessions (UTC)", group="◈ SMC & Liquidity")

bool   i_showWick= input.bool(true,  "Show Wick Rejections (x3)", group="◈ Order Flow")
bool   i_showDiv = input.bool(true,  "Show Volume Divergence",    group="◈ Order Flow")

string i_aLong   = input.string("long",       "Long",        group="◈ Webhook Actions")
string i_aShort  = input.string("short",      "Short",       group="◈ Webhook Actions")
string i_aCLong  = input.string("closelong",  "Close Long",  group="◈ Webhook Actions")
string i_aCSh    = input.string("closeshort", "Close Short", group="◈ Webhook Actions")

string GRP_DASH       = '📊 Dashboard Settings'
color  dash_bg_color  = input.color(color.rgb(10, 14, 26, 5),    'Background Color', group=GRP_DASH)
color  dash_txt_color = input.color(color.rgb(224, 247, 255, 0), 'Text Color',       group=GRP_DASH)

string _res = timeframe.ismonthly ? str.tostring(timeframe.multiplier * i_mult, "###M") : timeframe.isweekly ? str.tostring(timeframe.multiplier * i_mult, "###W") : timeframe.isdaily ? str.tostring(timeframe.multiplier * i_mult, "###D") : timeframe.isintraday ? str.tostring(timeframe.multiplier * i_mult, "####") : "1D"
string _tid = ticker.renko(syminfo.tickerid, "ATR", i_atrLen)

var RenkoBar _bar = RenkoBar.new()
_bar.rc  := request.security(_tid, _res, close[1],  lookahead=barmerge.lookahead_on)
_bar.ro  := request.security(_tid, _res, open[1],   lookahead=barmerge.lookahead_on)
_bar.vol := request.security(_tid, _res, volume[1], lookahead=barmerge.lookahead_on)

float _rcConf = _bar.rc
float _roConf = _bar.ro
float _atr = ta.atr(14)
float _volMa = ta.sma(_bar.vol, 20)
bool  _highVol = _bar.vol > _volMa
bool  _boxChanged = _rcConf != _rcConf[1] or _roConf != _roConf[1]

float _mtfEma1 = request.security(syminfo.tickerid, i_mtfTf1, ta.sma(close, 50)[1], lookahead=barmerge.lookahead_on)
float _mtfEma2 = request.security(syminfo.tickerid, i_mtfTf2, ta.sma(close, 50)[1], lookahead=barmerge.lookahead_on)
float _mtfEma3 = request.security(syminfo.tickerid, i_mtfTf3, ta.sma(close, 50)[1], lookahead=barmerge.lookahead_on)

int _bullScore = (close > _mtfEma1 ? 1 : 0) + (close > _mtfEma2 ? 1 : 0) + (close > _mtfEma3 ? 1 : 0)
int _bearScore = (close < _mtfEma1 ? 1 : 0) + (close < _mtfEma2 ? 1 : 0) + (close < _mtfEma3 ? 1 : 0)

bool  _mtfBull = not i_useMtf or _bullScore >= 2
bool  _mtfBear = not i_useMtf or _bearScore >= 2

bool _inKz = not i_useKz or not na(time(timeframe.period, i_session))

float _recentHigh = ta.highest(high[1], i_liqLen)
float _recentLow  = ta.lowest(low[1],  i_liqLen)

bool _bslSweep = high > _recentHigh and close < _recentHigh and close < open
bool _sslSweep = low  < _recentLow  and close > _recentLow  and close > open

var int _recentSweepState = 0
if _bslSweep
    _recentSweepState := 1
if _sslSweep
    _recentSweepState := -1

var SignalEngine _engine = SignalEngine.new()
_engine.updateSignals(_rcConf, _roConf, _mtfBull, _mtfBear, _inKz, _recentSweepState)

if _engine.buyF or _engine.sellF
    _recentSweepState := 0 

var array<int> _streakHist = array.new<int>()
var bool _isExhausted = false

if _boxChanged and _engine.lStrk == 0 and (_engine[1]).lStrk > 2
    array.push(_streakHist, (_engine[1]).lStrk)
if _boxChanged and _engine.sStrk == 0 and (_engine[1]).sStrk > 2
    array.push(_streakHist, (_engine[1]).sStrk)

int _histSz = array.size(_streakHist)
if _histSz > 30
    array.shift(_streakHist)
    _histSz := array.size(_streakHist)

if _histSz >= 5
    float _meanStrk = array.avg(_streakHist)
    float _stdStrk  = array.stdev(_streakHist)
    if _stdStrk > 0
        if _engine.isBull
            _isExhausted := (_engine.lStrk - _meanStrk) / _stdStrk > 2.0
        else if _engine.isBear
            _isExhausted := (_engine.sStrk - _meanStrk) / _stdStrk > 2.0

var array<float> _vpPrice = array.new<float>()
var array<float> _vpVol   = array.new<float>()
var float _pocPrice = na

if _boxChanged and not na(_bar.vol)
    int _idx = array.indexof(_vpPrice, _rcConf)
    if _idx == -1
        array.push(_vpPrice, _rcConf)
        array.push(_vpVol, _bar.vol)
    else
        array.set(_vpVol, _idx, array.get(_vpVol, _idx) + _bar.vol)

    int _vpSz = array.size(_vpPrice)
    if _vpSz > 100 
        array.shift(_vpPrice)
        array.shift(_vpVol)
        _vpSz := array.size(_vpPrice)

    if _vpSz > 0
        float _maxVol = array.max(_vpVol)
        int _pocIdx = array.indexof(_vpVol, _maxVol)
        _pocPrice := array.get(_vpPrice, _pocIdx)

var float _avwapNum = 0.0
var float _avwapDen = 0.0
var float _avwapVal = na

if _engine.isChoCh
    _avwapNum := 0.0
    _avwapDen := 0.0

if not na(_bar.vol)
    _avwapNum += close * volume 
    _avwapDen += volume

_avwapVal := _avwapDen > 0 ? _avwapNum / _avwapDen : na

var array<float> _iobTop  = array.new<float>()
var array<float> _iobBot  = array.new<float>()
var array<bool>  _iobBull = array.new<bool>()
var array<box>   _iobDrw  = array.new<box>()

if i_showIob and (_engine.buyF or _engine.sellF)
    if array.size(_iobTop) >= i_iobMax
        array.shift(_iobTop)
        array.shift(_iobBot)
        array.shift(_iobBull)
        box.delete(array.shift(_iobDrw))

    float _top = math.max(_rcConf, _roConf)
    float _bot = math.min(_rcConf, _roConf)
    array.push(_iobTop, _top)
    array.push(_iobBot, _bot)
    array.push(_iobBull, _engine.buyF)

    color _iobCol = _engine.buyF ? color.new(i_cBullA, 85) : color.new(i_cBearA, 85)
    array.push(_iobDrw, box.new(bar_index - 10, _top, bar_index + 20, _bot, border_color=na, bgcolor=_iobCol))

int _iobDrwSz = array.size(_iobDrw)
if _iobDrwSz > 0
    for i = 0 to _iobDrwSz - 1
        box.set_right(array.get(_iobDrw, i), bar_index + 15)

var float _lastWickH = na, var int _cntWickH = 0
var float _lastWickL = na, var int _cntWickL = 0

if high > math.max(close, open)
    if math.abs(high - _lastWickH) <= (_atr * 0.1)
        _cntWickH += 1
    else
        _lastWickH := high
        _cntWickH := 1
else
    _cntWickH := 0

if low < math.min(close, open)
    if math.abs(low - _lastWickL) <= (_atr * 0.1)
        _cntWickL += 1
    else
        _lastWickL := low
        _cntWickL := 1
else
    _cntWickL := 0

bool _volDivBuy  = _engine.buyF  and not _highVol
bool _volDivSell = _engine.sellF and not _highVol

var RiskManager _risk = RiskManager.new()

if _engine.isBull
    _risk.trailStop := na(_risk.trailStop) ? _roConf : math.max(_risk.trailStop, _roConf)
else if _engine.isBear
    _risk.trailStop := na(_risk.trailStop) ? _rcConf : math.min(_risk.trailStop, _rcConf)
else
    _risk.trailStop := na

float _nearestSrSl = na
if _engine.buyF or _engine.sellF
    if i_structSl and array.size(_iobTop) > 1
        float _dist = 9999999.9
        int _iobSz = array.size(_iobTop)
        for i = 0 to _iobSz - 2
            float top = array.get(_iobTop, i)
            float bot = array.get(_iobBot, i)
            if _engine.buyF and top < _rcConf
                if (_rcConf - top) < _dist
                    _dist := _rcConf - top
                    _nearestSrSl := bot
            if _engine.sellF and bot > _rcConf
                if (bot - _rcConf) < _dist
                    _dist := bot - _rcConf
                    _nearestSrSl := top

    float _atrSl = _engine.buyF ? _rcConf - _atr * i_slMult : _rcConf + _atr * i_slMult
    _risk.sl := not na(_nearestSrSl) ? _nearestSrSl : _atrSl
    _risk.tp1 := _engine.buyF ? _rcConf + _atr * i_tp1Mult : _rcConf - _atr * i_tp1Mult
    _risk.tp2 := _engine.buyF ? _rcConf + _atr * i_tp2Mult : _rcConf - _atr * i_tp2Mult
    _risk.tp3 := _engine.buyF ? _rcConf + _atr * i_tp3Mult : _rcConf - _atr * i_tp3Mult

var int _legBoxCount = 0
_legBoxCount := _engine.isBull or _engine.isBear ? (_engine.buyF or _engine.sellF ? 1 : _legBoxCount + (_boxChanged ? 1 : 0)) : _legBoxCount

float _gradT = _engine.isBull ? math.min(_engine.lStrk / fl

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

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

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

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

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

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

Стоимость полного кода
1 931,10₽ ≈ $23.60