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

Market Structure Dynamics & Order Blocks

indicator_market_structure_dynamics_&_order_blocks_for_tradingview.pine
Вы автор или правообладатель?

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

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

О программе

Это индикатор для TradingView, написанный на Pine Script v6 и предназначенный для отображения на графике аналитических элементов, связанных с рыночной структурой и институциональными блоками. Индикатор работает поверх графика цены и использует технические расчёты, данные другого таймфрейма, графические примитивы и условия для оповещений. Название продукта в исходнике явно указано в вызове indicator как "Market Structure Dynamics & Order Blocks".

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

Индикатор умеет подсвечивать торговые сессии (Лондон, Нью-Йорк, Токио, Сидней) с индивидуальными расписаниями и цветами, а также отображать предыдущие недельные максимум и минимум с настраиваемыми цветами. Имеется аналитическая панель с выбором положения и размера, показывающая агрегированные показатели по созданным и mitigated-блокам. Для пробоев структуры предусмотрены условия оповещений TradingView, а также отображение меток BUY/SELL при соответствующих событиях.

Все параметры задаются через пользовательские настройки в интерфейсе индикатора. Индикатор не является стратегией и не выполняет симуляцию сделок; он предназначен для визуального анализа и оповещений.

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

НастройкаОписание
cfgShowDash Показывает или скрывает аналитическую панель с агрегированными показателями.
cfgDashPos Положение аналитической панели на графике: Top Right, Bottom Right или Bottom Left.
cfgDashSize Размер текста аналитической панели: Tiny, Small, Normal или Large.
cfgPivotLength Количество баров слева и справа для определения локальных экстремумов (пивотов).
cfgBreakThreshold Порог Z-оценки импульса, при превышении которого пробой структуры считается значимым. Влияет на формирование сигналов и блоков.
cfgDisplayMode Режим отображения блоков: Historical (исторический) или Active Only (только активные).
cfgMaxBlocks Максимальное количество одновременно отображаемых активных блоков.
cfgKeepMitigated Продлевает отображение mitigated-блоков на ограниченное время или количество.
cfgFilterOverlap Включает фильтрацию перекрывающихся блоков: новые блоки не создаются, если пересекаются с активными.
cfgShowSessions Включает или отключает подсветку всех торговых сессий.
cfgLondonActive Включает подсветку лондонской торговой сессии.
cfgLondonTime Расписание лондонской сессии в формате торговой сессии.
cfgLondonColor Цвет подсветки лондонской сессии.
cfgNYActive Включает подсветку нью-йоркской торговой сессии.
cfgNYTime Расписание нью-йоркской сессии в формате торговой сессии.
cfgNYColor Цвет подсветки нью-йоркской сессии.
cfgTokyoActive Включает подсветку токийской торговой сессии.
cfgTokyoTime Расписание токийской сессии в формате торговой сессии.
cfgTokyoColor Цвет подсветки токийской сессии.
cfgSydneyActive Включает подсветку сиднейской торговой сессии.
cfgSydneyTime Расписание сиднейской сессии в формате торговой сессии.
cfgSydneyColor Цвет подсветки сиднейской сессии.
cfgShowWeekly Показывает или скрывает предыдущие недельные максимум и минимум.
cfgWhColor Цвет линии предыдущего недельного максимума.
cfgWlColor Цвет линии предыдущего недельного минимума.
cfgShowSignals Показывает или скрывает метки BUY и SELL при пробоях структуры.
Получить полный код

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

indicator("Market Structure Dynamics & Order Blocks", "MS Dynamics & OBs", overlay = true, max_boxes_count = 500, max_lines_count = 500, max_labels_count = 500)

color COLOR_BULL         = #059669 // Emerald Green
color COLOR_BEAR         = #DC2626 // Crimson Red
color COLOR_HPZ_BULL     = #0284C7 // Sky Blue
color COLOR_HPZ_BEAR     = #D97706 // Amber
color COLOR_NEUTRAL      = #6B7280 // Slate Gray

color DASH_BG            = #FFFFFF
color DASH_BORDER        = #E5E7EB
color DASH_TEXT_PRIMARY  = #111827
color DASH_TEXT_MUTED    = #6B7280

string G_DASH            = "Analytics Panel"
string G_MS              = "Market Structure"
string G_OB              = "Institutional Blocks"
string G_SESS            = "Trading Sessions"
string G_WEEKLY          = "Weekly Levels"
string G_SIGNALS         = "Buy / Sell Signals"

bool   cfgShowDash       = input.bool(true, "Show Analytics Panel", group = G_DASH)
string cfgDashPos        = input.string("Top Right", "Panel Position", options = ["Top Right", "Bottom Right", "Bottom Left"], group = G_DASH)
string cfgDashSize       = input.string("Small", "Panel Size", options = ["Tiny", "Small", "Normal", "Large"], group = G_DASH)

int    cfgPivotLength    = input.int(7, "Pivot Lookback Period", minval = 1, group = G_MS)
float  cfgBreakThreshold = input.float(0.5, "Break Momentum Threshold (Z-Score)", minval = 0.1, step = 0.1, group = G_MS)

string cfgDisplayMode    = input.string("Historical", "View Mode", options = ["Historical", "Active Only"], group = G_OB)
int    cfgMaxBlocks      = input.int(10, "Maximum Active Blocks", minval = 1, maxval = 100, group = G_OB)
bool   cfgKeepMitigated  = input.bool(false, "Extend Mitigated Blocks", group = G_OB)
bool   cfgFilterOverlap  = input.bool(true, "Filter Overlapping Blocks", group = G_OB)

bool   cfgShowSessions   = input.bool(true, "Highlight Trading Sessions", group = G_SESS)
bool   cfgLondonActive   = input.bool(false, "London Session", group = G_SESS)
string cfgLondonTime     = input.session("0800-1700:1234567", "London Schedule", group = G_SESS)
color  cfgLondonColor    = input.color(#2563EB, "London Color", group = G_SESS, inline = "LON")

bool   cfgNYActive       = input.bool(false, "New York Session", group = G_SESS)
string cfgNYTime         = input.session("1300-2200:1234567", "New York Schedule", group = G_SESS)
color  cfgNYColor        = input.color(#EA580C, "NY Color", group = G_SESS, inline = "NY")

bool   cfgTokyoActive    = input.bool(false, "Tokyo Session", group = G_SESS)
string cfgTokyoTime      = input.session("0000-0900:1234567", "Tokyo Schedule", group = G_SESS)
color  cfgTokyoColor     = input.color(#E11D48, "Tokyo Color", group = G_SESS, inline = "TYO")

bool   cfgSydneyActive   = input.bool(false, "Sydney Session", group = G_SESS)
string cfgSydneyTime     = input.session("2100-0600:1234567", "Sydney Schedule", group = G_SESS)
color  cfgSydneyColor    = input.color(#CA8A04, "Sydney Color", group = G_SESS, inline = "SYD")

bool   cfgShowWeekly     = input.bool(true, "Show Prev Weekly High / Low", group = G_WEEKLY)
color  cfgWhColor        = input.color(#7C3AED, "Weekly High Color", group = G_WEEKLY, inline = "WH")
color  cfgWlColor        = input.color(#0D9488, "Weekly Low Color", group = G_WEEKLY, inline = "WL")

bool   cfgShowSignals    = input.bool(true, "Show Buy / Sell Signals", group = G_SIGNALS)

type StructureBlock
    box   boxRef
    label labelRef
    line  pocRef
    float score
    float topVal
    float btmVal
    bool  isBullish
    bool  isHighProb
    bool  isMitigated
    int   mitigationIndex

var array<StructureBlock> activeBlocks = array.new<StructureBlock>()

getPosition(string posStr) =>
    switch posStr
        "Top Right"    => position.top_right
        "Bottom Right" => position.bottom_right
        "Bottom Left"  => position.bottom_left
        => position.top_right

getSize(string sizeStr) =>
    switch sizeStr
        "Tiny"   => size.tiny
        "Small"  => size.small
        "Normal" => size.normal
        "Large"  => size.large
        => size.small

renderSessionRange(bool isEnabled, string sessionPattern, color sessionColor, string sessionLabel) =>
    var box   rangeBox   = na
    var label rangeLabel = na
    var float highPrice  = na
    var float lowPrice   = na

    bool inSessionNow = not na(time(timeframe.period, sessionPattern))
    bool sessionStarted = inSessionNow and not inSessionNow[1]

    if isEnabled and inSessionNow
        if sessionStarted
            highPrice  := high
            lowPrice   := low
            rangeBox   := box.new(bar_index, highPrice, bar_index, lowPrice, border_color = sessionColor, border_style = line.style_dotted, bgcolor = color.new(sessionColor, 94))
            rangeLabel := label.new(bar_index, highPrice, sessionLabel, style = label.style_none, textcolor = sessionColor, size = size.small, textalign = text.align_center)
        else
            highPrice := math.max(highPrice, high)
            lowPrice  := math.min(lowPrice, low)
            rangeBox.set_top(highPrice)
            rangeBox.set_bottom(lowPrice)
            rangeBox.set_right(bar_index)
            rangeLabel.set_xy(math.round(math.avg(rangeBox.get_left(), bar_index)), highPrice)
    float(na)

float prevWeeklyHigh = request.security(syminfo.tickerid, "W", high[1], lookahead = barmerge.lookahead_on)
float prevWeeklyLow  = request.security(syminfo.tickerid, "W", low[1],  lookahead = barmerge.lookahead_on)

var line  weeklyHighLine  = na
var line  weeklyLowLine   = na
var label weeklyHighLabel = na
var label weeklyLowLabel  = na

if cfgShowWeekly
    if na(weeklyHighLine)
        weeklyHighLine  := line.new(bar_index, prevWeeklyHigh, bar_index + 10, prevWeeklyHigh, color = cfgWhColor, width = 1, style = line.style_dashed)
        weeklyLowLine   := line.new(bar_index, prevWeeklyLow,  bar_index + 10, prevWeeklyLow,  color = cfgWlColor, width = 1, style = line.style_dashed)
        weeklyHighLabel := label.new(bar_index + 12, prevWeeklyHigh, "PWH", color = color.new(cfgWhColor, 100), textcolor = cfgWhColor, style = label.style_none, size = size.small)
        weeklyLowLabel  := label.new(bar_index + 12, prevWeeklyLow,  "PWL", color = color.new(cfgWlColor, 100), textcolor = cfgWlColor, style = label.style_none, size = size.small)
    else
        weeklyHighLine.set_xy1(bar_index - 50, prevWeeklyHigh)
        weeklyHighLine.set_xy2(bar_index + 10, prevWeeklyHigh)
        weeklyLowLine.set_xy1(bar_index - 50, prevWeeklyLow)
        weeklyLowLine.set_xy2(bar_index + 10, prevWeeklyLow)

        weeklyHighLabel.set_xy(bar_index + 12, prevWeeklyHigh)
        weeklyLowLabel.set_xy(bar_index + 12, prevWeeklyLow)

float priceDiff   = ta.change(close)
float meanDiff    = ta.sma(priceDiff, 50)
float stdDevDiff  = ta.stdev(priceDiff, 50)
float zScore      = (priceDiff - meanDiff) / stdDevDiff
float volPercent  = ta.percentrank(volume, 100)

float highPivot = ta.pivothigh(high, cfgPivotLength, cfgPivotLength)
float lowPivot  = ta.pivotlow(low, cfgPivotLength, cfgPivotLength)

var float recentHighPivot = na
var float recentLowPivot  = na
var int   recentHighIndex = na
var int   recentLowIndex  = na

if not na(highPivot)
    recentHighPivot := highPivot
    recentHighIndex := bar_index - cfgPivotLength

if not na(lowPivot)
    recentLowPivot := lowPivot
    recentLowIndex := bar_index - cfgPivotLength

if cfgShowSessions
    renderSessionRange(cfgLondonActive, cfgLondonTime, cfgLondonColor, "London")
    renderSessionRange(cfgNYActive,     cfgNYTime,     cfgNYColor,     "New York")
    renderSessionRange(cfgTokyoActive,  cfgTokyoTime,  cfgTokyoColor,  "Tokyo")
    renderSessionRange(cfgSydneyActive

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

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

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

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

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

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

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