Видишь паттерн 4 ступеньки вниз? //@version=5
indicator(title='MFX with BOS2 Steps', shorttitle='MFX_BOS2_Steps', overlay=true)

// === Входные параметры ===

// Периоды BOS
bosPeriod2 = input.int(title="BOS Period 2", defval=8, minval=1)
bosPeriod3 = input.int(title="BOS Period 3", defval=200, minval=1)
bosPeriod4 = input.int(title="BOS Period 4", defval=1200, minval=1)

// Параметры для Moving Averages
ma1Period = input.int(title="MA1 Period", defval=10, minval=1)
ma2Period = input.int(title="MA2 Period", defval=50, minval=1)
ma3Period = input.int(title="MA3 Period", defval=200, minval=1)
ma4Period = input.int(title="MA4 Period", defval=20, minval=1)
ma5Period = input.int(title="MA5 Period", defval=100, minval=1)
ma6Period = input.int(title="MA6 Period", defval=1200, minval=1)

// Включение/отключение MA
ma1Enabled = input.bool(title="Enable MA1", defval=true)
ma2Enabled = input.bool(title="Enable MA2", defval=true)
ma3Enabled = input.bool(title="Enable MA3", defval=true)
ma4Enabled = input.bool(title="Enable MA4", defval=true)
ma5Enabled = input.bool(title="Enable MA5", defval=true)
ma6Enabled = input.bool(title="Enable MA6", defval=true)

// Тип Moving Averages
maType = input.string(title="MA Type", defval="EMA", options=["SMA", "EMA", "WMA", "VWMA"])

// Цвета для Moving Averages
ma1Color = input.color(title="MA1 Color", defval=color.new(#FFC0CB, 30)) // Пастельный розовый
ma2Color = input.color(title="MA2 Color", defval=color.new(#AFEEEE, 30)) // Пастельный голубой
ma3Color = input.color(title="MA3 Color", defval=color.new(#B2182B, 30)) // Пастельный красный
ma4Color = input.color(title="MA4 Color", defval=color.new(#FF6347, 30)) // Пастельный томат
ma5Color = input.color(title="MA5 Color", defval=color.new(#8A2BE2, 30)) // Пастельный синий
ma6Color = input.color(title="MA6 Color", defval=color.new(#32CD32, 30)) // Пастельный лайм

// === Функция для расчёта Moving Averages ===
calculateMA(period) =>
    switch maType
        "SMA" => ta.sma(close, period)
        "EMA" => ta.ema(close, period)
        "WMA" => ta.wma(close, period)
        "VWMA" => ta.vwma(close, period)
        => ta.ema(close, period) // EMA по умолчанию

// Вычисление Moving Averages
ma1 = ma1Enabled ? calculateMA(ma1Period) : na
ma2 = ma2Enabled ? calculateMA(ma2Period) : na
ma3 = ma3Enabled ? calculateMA(ma3Period) : na
ma4 = ma4Enabled ? calculateMA(ma4Period) : na
ma5 = ma5Enabled ? calculateMA(ma5Period) : na
ma6 = ma6Enabled ? calculateMA(ma6Period) : na

// === Отображение Moving Averages ===
plot(ma1, color=ma1Color, linewidth=2, title="MA1")
plot(ma2, color=ma2Color, linewidth=2, title="MA2")
plot(ma3, color=ma3Color, linewidth=2, title="MA3")
plot(ma4, color=ma4Color, linewidth=2, title="MA4")
plot(ma5, color=ma5Color, linewidth=2, title="MA5")
plot(ma6, color=ma6Color, linewidth=2, title="MA6")

// === Функция для расчёта BOS ===
calculateBOS(period) =>
    var float bosHigh = na
    var float bosLow = na
    // Инициализация bosHigh и bosLow при первом запуске
    if na(bosHigh)
        bosHigh := high
    if na(bosLow)
        bosLow := low
    // Определение текущего низкого и высокого за период
    currentLow = ta.lowest(low, period)
    currentHigh = ta.highest(high, period)
    // Обновление bosHigh и bosLow в зависимости от закрытия
    if close > bosHigh
        bosHigh := high
        bosLow := currentLow
    if close < bosLow
        bosLow := low
        bosHigh := currentHigh
    [bosHigh, bosLow]

// Вычисление BOS для разных периодов
[bosHigh2, bosLow2] = calculateBOS(bosPeriod2)
[bosHigh3, bosLow3] = calculateBOS(bosPeriod3)
[bosHigh4, bosLow4] = calculateBOS(bosPeriod4)

// === Отображение BOS линий ===
plot(title='BosHigh2', series=bosHigh2, color=#2962ff, linewidth=2, style=plot.style_stepline)
plot(title='BosLow2', series=bosLow2, color=#2962ff, linewidth=2, style=plot.style_stepline)
plot(title='BosHigh3', series=bosHigh3, color=#ffffff, linewidth=3, style=plot.style_stepline)
plot(title='BosLow3', series=bosLow3, color=#ffffff, linewidth=3, style=plot.style_stepline)
plot(title='BosHigh4', series=bosHigh4, color=#b2182c, linewidth=4, style=plot.style_stepline)
plot(title='BosLow4', series=bosLow4, color=#b2182c, linewidth=4, style=plot.style_stepline)

// === Логика для выделения четырёх ступенек вниз на BosHigh2 ===

// Инициализация переменных для отслеживания ступенек
var float lastStep = na
var float[] stepLevels = array.new_float()
var int[] stepBars = array.new_int()

// Обновление последнего уровня ступеньки и добавление в массивы
if not na(bosHigh2)
    if na(lastStep) or bosHigh2 < lastStep
        lastStep := bosHigh2
        array.push(stepLevels, bosHigh2)
        array.push(stepBars, bar_index)
        // Ограничиваем массив до последних 4 ступенек
        if array.size(stepLevels) > 4
            array.shift(stepLevels)
        if array.size(stepBars) > 4
            array.shift(stepBars)
    else if bosHigh2 > lastStep
        lastStep := bosHigh2
        array.clear(stepLevels)
        array.clear(stepBars)
        array.push(stepLevels, bosHigh2)
        array.push(stepBars, bar_index)
    // Если bosHigh2 == lastStep, ничего не меняем

// Объявляем `stepCounter` как серийную переменную без использования `var`
stepCounter = (array.size(stepLevels) == 4) ? 4 : 0

// Проверка наличия четырёх ступенек вниз
// patternDetected срабатывает только на баре, где сейчас добавлена четвёртая ступенька
patternDetected = (stepCounter == 4) and (array.size(stepLevels) == 4) and (stepCounter[1] < 4)

// Переменная для хранения линий (ограничение до 100 линий)
var line[] stepLines = array.new_line()

// Отрисовка линий при обнаружении паттерна
if patternDetected
    // Получаем последние четыре ступени
    step1 = array.get(stepLevels, 0)
    step2 = array.get(stepLevels, 1)
    step3 = array.get(stepLevels, 2)
    step4 = array.get(stepLevels, 3)

    bar1 = array.get(stepBars, 0)
    bar2 = array.get(stepBars, 1)
    bar3 = array.get(stepBars, 2)
    bar4 = array.get(stepBars, 3)

    // Рисование линий между ступеньками для создания обводки
    // Горизонтальная линия от bar1 до bar2 на уровне step1
    stepLine1 = line.new(x1=bar1, y1=step1, x2=bar2, y2=step1, color=color.yellow, width=2, extend=extend.none)

    // Вертикальная линия от step1 до step2 на bar2
    stepLine2 = line.new(x1=bar2, y1=step1, x2=bar2, y2=step2, color=color.yellow, width=2, extend=extend.none)

    // Горизонтальная линия от bar2 до bar3 на уровне step2
    stepLine3 = line.new(x1=bar2, y1=step2, x2=bar3, y2=step2, color=color.yellow, width=2, extend=extend.none)

    // Вертикальная линия от step2 до step3 на bar3
    stepLine4 = line.new(x1=bar3, y1=step2, x2=bar3, y2=step3, color=color.yellow, width=2, extend=extend.none)

    // Горизонтальная линия от bar3 до bar4 на уровне step3
    stepLine5 = line.new(x1=bar3, y1=step3, x2=bar4, y2=step3, color=color.yellow, width=2, extend=extend.none)

    // Вертикальная линия от step3 до step4 на bar4
    stepLine6 = line.new(x1=bar4, y1=step3, x2=bar4, y2=step4, color=color.yellow, width=2, extend=extend.none)

    // Добавление всех линий в массив для ограничения их количества
    array.push(stepLines, stepLine1)
    array.push(stepLines, stepLine2)
    array.push(stepLines, stepLine3)
    array.push(stepLines, stepLine4)
    array.push(stepLines, stepLine5)
    array.push(stepLines, stepLine6)

    // Ограничение количества линий до 100 (удаление самых старых линий)
    while array.size(stepLines) > 100
        oldLine = array.shift(stepLines)
        line.delete(oldLine)

// Опционально: Вы можете добавить дополнительные визуальные элементы или настройку линий по своему усмотрению