Исправь ошибку Error at 176:16 Could not find function or function reference 'box.exists'

//@version=5
indicator(title='MFX with BOS2 Steps and Layered Backgrounds', shorttitle='MFX_BOS2_Steps_BG', 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)) // Пастельный лайм

// === Входные параметры для цветов заливки фона ===

// Для BOS2
downBgColor2 = input.color(title="BOS2 Background Color for Down Steps", defval=color.new(color.red, 80))
upBgColor2 = input.color(title="BOS2 Background Color for Up Steps", defval=color.new(color.green, 80))

// Для BOS3
downBgColor3 = input.color(title="BOS3 Background Color for Down Steps", defval=color.new(color.maroon, 80))
upBgColor3 = input.color(title="BOS3 Background Color for Up Steps", defval=color.new(color.lime, 80))

// Для BOS4
downBgColor4 = input.color(title="BOS4 Background Color for Down Steps", defval=color.new(color.purple, 80))
upBgColor4 = input.color(title="BOS4 Background Color for Up Steps", defval=color.new(color.teal, 80))

// === Функция для расчёта 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)

// === Функция для обнаружения паттерна ступенек ===
detectSteps(bosHigh, bosLow) =>
    // Логика для ступенек вниз
    var float lastStepDown = na
    var float[] stepLevelsDown = array.new_float()
    var int[] stepBarsDown = array.new_int()
    if not na(bosHigh)
        if na(lastStepDown) or bosHigh < lastStepDown
            lastStepDown := bosHigh
            array.push(stepLevelsDown, bosHigh)
            array.push(stepBarsDown, bar_index)
            // Ограничиваем массив до последних 4 ступенек
            if array.size(stepLevelsDown) > 4
                array.shift(stepLevelsDown)
            if array.size(stepBarsDown) > 4
                array.shift(stepBarsDown)
        else if bosHigh > lastStepDown
            lastStepDown := bosHigh
            array.clear(stepLevelsDown)
            array.clear(stepBarsDown)
            array.push(stepLevelsDown, bosHigh)
            array.push(stepBarsDown, bar_index)
        // Если bosHigh == lastStepDown, ничего не меняем

    stepCounterDown = (array.size(stepLevelsDown) == 4) ? 4 : 0
    patternDetectedDown = (stepCounterDown == 4) and (array.size(stepLevelsDown) == 4) and (stepCounterDown[1] < 4)

    // Логика для ступенек вверх
    var float lastStepUp = na
    var float[] stepLevelsUp = array.new_float()
    var int[] stepBarsUp = array.new_int()
    if not na(bosLow)
        if na(lastStepUp) or bosLow > lastStepUp
            lastStepUp := bosLow
            array.push(stepLevelsUp, bosLow)
            array.push(stepBarsUp, bar_index)
            // Ограничиваем массив до последних 4 ступенек
            if array.size(stepLevelsUp) > 4
                array.shift(stepLevelsUp)
            if array.size(stepBarsUp) > 4
                array.shift(stepBarsUp)
        else if bosLow < lastStepUp
            lastStepUp := bosLow
            array.clear(stepLevelsUp)
            array.clear(stepBarsUp)
            array.push(stepLevelsUp, bosLow)
            array.push(stepBarsUp, bar_index)
        // Если bosLow == lastStepUp, ничего не меняем

    stepCounterUp = (array.size(stepLevelsUp) == 4) ? 4 : 0
    patternDetectedUp = (stepCounterUp == 4) and (array.size(stepLevelsUp) == 4) and (stepCounterUp[1] < 4)

    [patternDetectedDown, patternDetectedUp]

// === Функция для создания и управления заливкой фона ===
createBackground(patternDetected, bgColor, boxArray) =>
    if patternDetected
        // Создаём новый бокс с текущим баром
        newBox = box.new(left=bar_index, top=na, right=bar_index + 1, bottom=na, border_color=na, bgcolor=bgColor, extend=extend.right)
        array.push(boxArray, newBox)

// === Функция для удаления старых боксов ===
removeOldBoxes(boxArray) =>
    for i = 0 to array.size(boxArray) - 1
        existingBox = array.get(boxArray, i)
        if not box.exists(existingBox)
            array.remove(boxArray, i)

// === Инициализация массивов для боксов ===

// Для BOS2
var box[] boxesUp2 = array.new_box()
var box[] boxesDown2 = array.new_box()

// Для BOS3
var box[] boxesUp3 = array.new_box()
var box[] boxesDown3 = array.new_box()

// Для BOS4
var box[] boxesUp4 = array.new_box()
var box[] boxesDown4 = array.new_box()

// === Обнаружение паттернов для всех BOS уровней ===
[patternDown2, patternUp2] = detectSteps(bosHigh2, bosLow2)
[patternDown3, patternUp3] = detectSteps(bosHigh3, bosLow3)
[patternDown4, patternUp4] = detectSteps(bosHigh4, bosLow4)

// === Создание заливки фона для каждого паттерна ===

// Для BOS2
createBackground(patternDown2, downBgColor2, boxesDown2)
createBackground(patternUp2, upBgColor2, boxesUp2)

// Для BOS3
createBackground(patternDown3, downBgColor3, boxesDown3)
createBackground(patternUp3, upBgColor3, boxesUp3)

// Для BOS4
createBackground(patternDown4, downBgColor4, boxesDown4)
createBackground(patternUp4, upBgColor4, boxesUp4)

// === Удаление несуществующих боксов (опционально) ===
// Это делается автоматически, но можно добавить дополнительные условия для удаления, если необходимо

// Примечание: В Pine Script нет прямой поддержки динамического обновления `top` и `bottom` боксов, поэтому они будут создаваться с `na` значениями.
// Для полноценной заливки фона потребуется определить конкретные уровни цен. Здесь мы используем `na`, поэтому заливка будет распространяться на весь график.