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

Профиль ликвидности SMC TEMA ДС/ПС

liquidity profile_smc_tema_dsps$.pine

Похожие материалы по тегам

le van do® - swing signals & overlays private.pineTradingView · 1 общих теговben's stochastic ema auto trading robot.mq4MQL4 / MetaTrader 4 · 1 общих теговwae_smc_htf_v2.pineTradingView · 1 общих тегов#dtosc 2.06 + bells&whistles nmc.mq5MQL5 / MetaTrader 5 · 1 общих теговindicator previous session range + projected candles + boschoch protected for tradingview.pineTradingView · 1 общих тегов#__slope direction line.mq5MQL5 / MetaTrader 5 · 1 общих тегов
Вы автор или правообладатель?

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

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

О программе

Этот индикатор TradingView отображает на графике комплексный анализ ликвидности и рыночной структуры. Он рассчитывает объемный профиль с точкой контроля (POC), визуализируя распределение торгового объема по ценовым уровням, и отображает ограничивающую рамку профиля. Индикатор определяет направление тренда с помощью скользящих средних и стандартного отклонения, отслеживает ликвидационные сдвиги и рисует линии рыночной структуры в зависимости от текущего тренда. Дополнительно отображаются зоны поддержки и спроса, пропуски справедливой стоимости (FVG), а также линии и метки многотаймфреймных зон покупки и продажи. Встроена визуализация Heikin Ashi с наложением быстрых, средних и медленных EMA с заливкой областей между ними.

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

НастройкаОписание
len Количество периодов для расчета тренда. Большая длина создает более плавный и долгосрочный сигнал
mult Множитель для расчета стандартного отклонения. Большие значения создают более широкие полосы и делают индикатор менее чувствительным к шуму
src Ценовые данные для расчетов. Обычно используется цена закрытия, но можно также использовать open, high, low, hl2, hlc3 или ohlc4
major_sweep_thresh Пороговое значение для определения крупных ликвидационных сдвигов. Большие значения означают, что только более значительные движения будут считаться крупными сдвигами
show_profile Отображать визуализацию объемного профиля. Показывает распределение объема торгов по ценовым уровням
show_bounds Отображать рамку вокруг объемного профиля для четкого определения границ
res Количество баров в объемном профиле. Большие значения создают более детализированные профили
scale Контролирует ширину отображения объемного профиля. Большие значения делают профиль шире
bullColor Цвет для бычьих трендов и индикаторов
bearColor Цвет для медвежьих трендов и индикаторов
pc1 Цвет визуализации объемного профиля
dismiss Отключает предупреждение при отсутствии данных об объеме
draw_structure Показать Рыночную Структуру
line_width Толщина линий РС
line_up_color Цвет линии движения вверх
line_down_color Цвет линии движения вниз
draw_supply Показать Поддержку
draw_demand Показать Спрос
supply_bg_color Цвет фона зон поддержки
supply_border_color Цвет границы зон поддержки
demand_bg_color Цвет фона зон спроса
demand_border_color Цвет границы зон спроса
drawFVG Рисовать FVG
bullishGapColor Цвет бычьего FVG
bearishGapColor Цвет медвежьего FVG
emaslow Период быстрой EMA
emaslow2 Период средней EMA
emaslow3 Период медленной EMA
inputTimeframe Таймфрейм для анализа
showLines Показывать линии
lineAt Линия зоны покупки по
lineAtBull Линия зоны продажи по
lineColorBuy Цвет линий продажи
lineColorSell Цвет линий покупки
lineWidth Толщина линий
maxLines Макс. линий
lineExtension Удлинение линии (баров)
showLabel Показывать метки
labelOffsetTicks Смещение метки (тиков)
labelColorBuy Цвет меток продажи
labelColorSell Цвет меток покупки
labelTextColor Цвет текста меток
graceBars Период ожидания (баров)
Получить полный код

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

indicator("<[$/Профиль ликвидности_SMC_TEMA_ДС/ПС/$]>", shorttitle="<{PL_SMC_TEMA_ДС/ПС}>", overlay=true, max_lines_count=500, max_boxes_count=500, max_labels_count=500, max_bars_back=5000)

len = input.int(10, "Длина", minval=1, tooltip="Количество периодов для расчета тренда. Большая длина создает более плавный и долгосрочный сигнал", group="Настройки тренда")
mult = input.float(1.2, "Множитель", minval=0.1, step=0.1, tooltip="Множитель для расчета стандартного отклонения. Большие значения создают более широкие полосы и делают индикатор менее чувствительным к шуму", group="Настройки тренда")
src = input.source(close, "Источник", tooltip="Ценовые данные для расчетов. Обычно используется цена закрытия, но можно также использовать open, high, low, hl2, hlc3 или ohlc4", group="Настройки тренда")
major_sweep_thresh = input.float(30, "Порог крупного сдвига", minval=0, tooltip="Пороговое значение для определения крупных ликвидационных сдвигов. Большие значения означают, что только более значительные движения будут считаться крупными сдвигами", group="Настройки тренда")

show_profile = input.bool(true, "Показывать объемный профиль", tooltip="Отображать визуализацию объемного профиля. Показывает распределение объема торгов по ценовым уровням", group="Настройки профиля")
show_bounds = input.bool(true, "Показывать ограничивающую рамку", tooltip="Отображать рамку вокруг объемного профиля для четкого определения границ", group="Настройки профиля")
res = input.int(68, "Разрешение", minval=1, tooltip="Количество баров в объемном профиле. Большие значения создают более детализированные профили", group="Настройки профиля")
scale = input.int(13, "Масштаб", minval=1, tooltip="Контролирует ширину отображения объемного профиля. Большие значения делают профиль шире", group="Настройки профиля")

bullColor = input.color(#005082, "Цвет быков", tooltip="Цвет для бычьих трендов и индикаторов", group="Внешний вид")
bearColor = input.color(#801922, "Цвет медведей", tooltip="Цвет для медвежьих трендов и индикаторов", group="Внешний вид")
pc1 = input.color(#ffa726, "Цвет профиля", tooltip="Цвет визуализации объемного профиля", group="Внешний вид")
dismiss = input.bool(false, "Игнорировать предупреждение об отсутствии объема", "Отключает предупреждение при отсутствии данных об объеме", group="Внешний вид")

profileCalculation(start_index, end_index, res, scale) =>
    top_boundaries = array.new_float(res)
    bottom_boundaries = array.new_float(res)
    binlen = array.new_float(res)
    highs = array.new_float()
    lows = array.new_float()
    volumes = array.new_float()

    for i = bar_index-start_index to bar_index-end_index
        highs.push(high[i])
        lows.push(low[i])
        volumes.push(volume[i])

    maxx = array.max(highs)
    minn = array.min(lows)
    size = array.size(highs)

    poc = 0.0

    if size > 0
        step = (maxx - minn) / res
        granularity = res
        for i = 0 to granularity - 1
            bin_size = 0.0
            bottom = minn + (i * step)
            top = minn + ((i + 1) * step)
            bottom_boundaries.insert(i, bottom)
            top_boundaries.insert(i, top)
            for j = 0 to array.size(highs) - 1
                candle_above_hbar = lows.get(j) > top
                candle_below_hbar = highs.get(j) < bottom
                is_candle_in_bucket = not (candle_above_hbar or candle_below_hbar)
                bin_size += is_candle_in_bucket ? volumes.get(j) : 0
            array.insert(binlen, i, bin_size)
        boc = binlen.max()
        boci = binlen.indexof(boc) > 0 ? binlen.indexof(boc) : 0
        poc := math.avg(top_boundaries.get(boci), bottom_boundaries.get(boci))

    [top_boundaries, bottom_boundaries, binlen, poc]

var cumVol = 0.
cumVol += nz(volume)
if barstate.islast and cumVol == 0 and not dismiss
    color WHITE = color.new(color.white, 20)
    color BLUE = color.new(#747474, 50)
    string ST_1 = "⚠️ Для этого тикера нет данных об объеме, попробуйте другой тикер или\n отключите это предупреждение в настройках"
    string textInput1 = ST_1
    string infoBoxSizeInput = "huge"
    string infoBoxYPosInput = "middle"
    string infoBoxXPosInput = "center"
    int heightInput = 12
    int widthInput = 80
    color textColorInput = WHITE
    color bgColorInput = BLUE
    var table watermark = table.new(infoBoxYPosInput + "_" + infoBoxXPosInput, 1, 1)
    string txt = textInput1
    table.cell(watermark, 0, 0, txt, widthInput, heightInput, textColorInput, text_size = infoBoxSizeInput, bgcolor = bgColorInput)

basis = ta.sma(ta.ema(src, len), len)
deviation = ta.ema(math.abs(close - basis), len * 3) * mult
upper = basis + deviation
lower = basis - deviation

length = int(len*mult)
nvol = (volume - ta.lowest(volume, length)) / (ta.highest(volume, length) - ta.lowest(volume, length)) * 100

var float trend = 0.0
if close > upper
    trend := 1
if close < lower
    trend := -1

peakform   = high[1] > high and high[2] < high[1]
valleyform = low[1]  < low and low[2]  > low[1]

var aPeakLines   = array.new_line()    // Для максимумов (используется в нисходящем тренде)
var aValleyLines = array.new_line()    // Для минимумов (используется в восходящем тренде)
var aPeakVols    = array.new_float()   // Соответствующие уровни объема
var aValleyVols  = array.new_float()   // Соответствующие уровни объема
var aPeakNVols    = array.new_float()   // Соответствующие нормализованные уровни объема
var aValleyNVols  = array.new_float()   // Соответствующие нормализованные уровни объема

if trend < 0
    if peakform and high[1] < upper
        l = line.new(bar_index-1, high[1], bar_index, high[1], color=color.new(bearColor, 100-nvol[1]), width = 2)
        array.push(aPeakLines, l)
        array.push(aPeakVols, volume[1])
        array.push(aPeakNVols, nvol[1])
else if trend > 0 and low[1] > lower
    if valleyform
        l = line.new(bar_index-1, low[1], bar_index, low[1], color=color.new(bullColor, 100-nvol[1]), width = 2)
        array.push(aValleyLines, l)
        array.push(aValleyVols, volume[1])
        array.push(aValleyNVols, nvol[1])

bullliq = 0.0
bearliq = 0.0
Nbullliq = 0.0
Nbearliq = 0.0

if aPeakLines.size() > 0
    qt = aPeakLines.size()

    for ln = qt - 1 to 0
        if ln < aPeakLines.size()
            currentLine = aPeakLines.get(ln)
            lineLevel = currentLine.get_y1()

            if high > lineLevel or upper < lineLevel
                if high > lineLevel
                    bearliq += aPeakVols.get(ln)
                    Nbearliq += aPeakNVols.get(ln)
                aPeakLines.remove(ln)
                aPeakVols.remove(ln)
                aPeakNVols.remove(ln)
            else
                currentLine.set_x2(bar_index)

    if aPeakLines.size() > 500
        aPeakLines.shift().delete()
        aPeakVols.shift()
        aPeakNVols.shift()

if aValleyLines.size() > 0
    qt = aValleyLines.size()

    for ln = qt - 1 to 0
        if ln < aValleyLines.size()
            currentLine = aValleyLines.get(ln)
            lineLevel = currentLine.get_y1()

            if low < lineLevel or lower > lineLevel
                if low < lineLevel
                    bullliq += aValleyVols.get(ln)
                    Nbullliq += aValleyNVols.get(ln)
                aValleyLines.remove(ln)
                aValleyVols.remove(ln)
                aValleyNVols.remove(ln)
            else
                currentLine.set_x2(bar_index)

    if aValleyLines.size() > 500
        aValleyLines.shift().delete()
        aValleyVols.shift()
        aValleyNVols.shift()

volatility = ta.atr(14)/2
timer = ta.barssince(ta.cross(trend, 0))

profile_upper = ta.highest(math.max(1, nz(timer)))
profile_lower = ta.lowest(math.max(1, nz(timer)))

end_index = bar_index
start_index = (bar_index - timer) + (end_index > (bar_index - timer) ? 1 : 0)

[top_boundaries, bottom_boundaries, binlen, poc] = profileCalculation(start_index, end_index, res, scale)

var boxes = array.new_box()
var br = array.new_box()

while boxes.size() > 0
    boxes.shift().delete()

while br.size() > 0
    br.shift().delete()

for i = 0 to res - 1
    if show_profile and not (barstate.islast and cumVol == 0)
        box_right = bar_index + 7 + scale
        box_left = box_right - math.round(binlen.get(i)) / math.round(binlen.max()) * scale
        box_top = array.get(top_boundaries, i)
        box_bottom = array.get(bottom_boundaries, i)
        gradient_color = color.from_gradient(math.sin(binlen.get(i) * math.pi / binlen.max()) * binlen.max(), 0, binlen.max(), trend > 0 ? bullColor : bearColor, pc1)
        array.push(boxes, box.new(box_left, box_top, box_right, box_bottom, border_style = line.style_solid, border_color = gradient_color, border_width = 1, bgcolor = color.new(gradient_color, 10)))

if show_bounds and not (barstate.islast and cumVol == 0)
    br.push(box.new(start_index, profile_upper, end_index+scale+7, profile_lower, border_style = line.style_solid, border_color = color.new(chart.fg_color, 90), border_width = 1, bgcolor = color.new(chart.fg_color, 95)))

draw_structure = input(defval = false, title = '⫸ Показать Рыночную Структуру', group = 'Панель управления')
line_width = input.int(defval = 2, title = 'Толщина линий РС', minval = 1, maxval = 5, group = 'Настройки линий')

line_up_color = input.color(defval = #00ffee, title = 'Цвет линии движения вверх', group = 'Настройки линий')
line_down_color = input.color(defval = #e91e63, title = 'Цвет линии движения вниз', group = 'Настройки линий')

var array<line> line_smc_ups = array.new_line()
var array<line> line_smc_downs = array.new_line()

get_move_up() =>
    move_up = high[0] > high[1] and low[0] > low[1]
    if array.size(line_smc_ups) > 0
        most_recent_move = array.get(line_smc_ups, array.size(line_smc_ups) - 1)
        x2 = line.get_x2(most_recent_move)
        y2 = line.get_y2(most_recent_move)
        if x2 == bar_index - 1
            if high >= y2
                line.set_x2(most_recent_move, bar_index)
                line.set_y2(most_recent_move, high)
        else
            if move_up == true
                if low[2] < low[1]
                    up_move = line.new(x1 = bar_index - 2, y1 = low[2], x2 = bar_index, y2 = high, color = line_up_color)
                    line.set_style(up_move, line.style_dashed)
                    line.set_width(up_move, line_width) 
                    array.push(line_smc_ups, up_move)
                else
                    up_move = line.new(x1 = bar_index - 1, y1 = low[1], x2 = bar_index, y2 = high, color = line_up_color)
                    line.set_style(up_move, line.style_dashed)
                    line.set_width(up_move, line_width) 
                    array.push(line_smc_ups, up_move)
    else
        if move_up == true
            if low[2] < low[1]
                up_move = line.new(x1 = bar_index - 2, y1 = low[2], x2 = bar_index, y2 = high, color = line_up_color)
                line.set_style(up_move, line.style_dashed)
                line.set_width(up_move, line_width) 
                array.push(line_smc_ups, up_move)
            else
                up_move = line.new(x1 = bar_index - 1, y1 = low[1], x2 = bar_index, y2 = high, color = line_up_color)
                line.set_style(up_move, line.style_dashed)
                line.set_width(up_move, line_width) 
                array.push(line_smc_ups, up_move)

get_move_down() =>
    move_down = low[0] < low[1] and high[0] < high[1]
    if array.size(line_smc_downs) > 0
        most_recent_move = array.get(line_smc_downs, array.size(line_smc_downs) - 1)
        x2 = line.get_x2(most_recent_move)
        y2 = line.get_y2(most_recent_move)
        if x2 == bar_index - 1
            if low <= y2
                line.set_x2(most_recent_move, bar_index)
                line.set_y2(most_recent_move, l

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

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

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

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

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

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

Стоимость полного кода
1 836,90₽ ≈ $22.84