Индикатор имбаланса (Fair Value Gap) с митигацией в Pine Script v5

Индикатор имбаланса (Fair Value Gap) с митигацией в Pine Script v5 НАЛОГИ, ИП и САМОЗАНЯТОСТЬ
Полное руководство по созданию индикатора Fair Value Gap (FVG) в Pine Script v5 с отслеживанием частичного и полного перекрытия (mitigation) зон.
Суть: Индикатор Fair Value Gap (FVG) на Pine Script v5 автоматически находит ценовые дисбалансы (имбалансы) и динамически отслеживает их перекрытие (mitigation). Скрипт использует пользовательские типы данных (UDT) и графические объекты box для визуализации частичного (касание границы) и полного (полное перекрытие диапазона) теста имбаланса.

Исходный код

В современной алгоритмической торговле концепция Smart Money Concepts (SMC) занимает лидирующие позиции. Одним из ключевых элементов этой методологии является Fair Value Gap (FVG), или имбаланс. Он возникает, когда на рынке наблюдается резкий односторонний импульс, оставляющий за собой неэффективно распределенную ликвидность. Ранее мы рассматривали другие сложные алгоритмы, например, в статье Pine Script v5: Поиск паттерна ‘Три маленьких индейца’ с циклами for, а сегодня сфокусируемся на динамическом отслеживании зон имбаланса.

Обычные индикаторы FVG просто рисуют прямоугольники на истории, засоряя график. Профессиональный подход требует отслеживания состояния зон: была ли зона протестирована частично (цена зашла внутрь имбаланса) или полностью перекрыта (mitigated). Это критически важно для построения торговых систем, так как полностью перекрытый имбаланс теряет свою силу как уровень поддержки или сопротивления.

Ниже представлен оптимизированный код индикатора на языке Pine Script v5. Он использует современные возможности языка, такие как пользовательские типы данных (type) и динамические массивы объектов для эффективного управления памятью терминала TradingView.

//@version=5
indicator("QuantFVG: Fair Value Gap with Mitigation Tracker", overlay=true, max_boxes_count=500)

// --- Inputs ---
grp_fvg  = "FVG Detection Settings"
min_gap_pct = input.float(0.02, "Min Gap Size (%)", minval=0.0, step=0.01, group=grp_fvg, tooltip="Filters out small gaps. Percentage of the middle candle's close.")

grp_style = "Visual Settings"
bull_color     = input.color(color.new(#26a69a, 85), "Bullish FVG Color", group=grp_style)
bear_color     = input.color(color.new(#ef5350, 85), "Bearish FVG Color", group=grp_style)
part_mit_color = input.color(color.new(#ff9800, 80), "Partial Mitigation Color", group=grp_style)
full_mit_color = input.color(color.new(#9e9e9e, 90), "Full Mitigation Color", group=grp_style)

grp_mgmt = "Management Settings"
keep_mitigated = input.bool(true, "Keep Mitigated FVGs?", group=grp_mgmt, tooltip="If false, fully mitigated FVGs will be deleted from the chart.")
max_history    = input.int(300, "Max History Bars", minval=50, group=grp_mgmt, tooltip="Deletes old boxes to optimize performance.")

// --- User Defined Types (UDT) ---
type FvgInstance
    box   fvg_box
    float top
    float bottom
    bool  is_bullish
    bool  is_mitigated
    bool  is_partially_mitigated
    int   start_bar

// --- Persistent Storage ---
var FvgInstance[] active_fvgs = array.new()

// --- FVG Detection Logic ---
float threshold = close[1] * (min_gap_pct / 100.0)

bool is_bull_fvg = (low[0] - high[2]) > threshold and close[1] > high[2]
bool is_bear_fvg = (low[2] - high[0]) > threshold and close[1] < low[2]

// --- Create FVG Objects ---
if is_bull_fvg
    float top_val = low[0]
    float bot_val = high[2]
    box b = box.new(
         left=bar_index - 2, 
         top=top_val, 
         right=bar_index, 
         bottom=bot_val, 
         bgcolor=bull_color, 
         border_color=color.new(bull_color, 30), 
         border_style=line.style_solid
         )
    array.push(active_fvgs, FvgInstance.new(b, top_val, bot_val, true, false, false, bar_index - 2))

if is_bear_fvg
    float top_val = low[2]
    float bot_val = high[0]
    box b = box.new(
         left=bar_index - 2, 
         top=top_val, 
         right=bar_index, 
         bottom=bot_val, 
         bgcolor=bear_color, 
         border_color=color.new(bear_color, 30), 
         border_style=line.style_solid
         )
    array.push(active_fvgs, FvgInstance.new(b, top_val, bot_val, false, false, false, bar_index - 2))

// --- Update and Mitigation Tracking ---
if array.size(active_fvgs) > 0
    for i = array.size(active_fvgs) - 1 to 0 by 1
        FvgInstance fvg = array.get(active_fvgs, i)
        
        // Check if the box is too old
        if (bar_index - fvg.start_bar) > max_history
            box.delete(fvg.fvg_box)
            array.remove(active_fvgs, i)
            continue
            
        if not fvg.is_mitigated
            // Extend the box to the current bar
            box.set_right(fvg.fvg_box, bar_index)
            
            if fvg.is_bullish
                // Partial mitigation: price dips below the top of the bullish FVG
                if low[0] < fvg.top and not fvg.is_partially_mitigated
                    fvg.is_partially_mitigated := true
                    box.set_bgcolor(fvg.fvg_box, part_mit_color)
                    box.set_border_color(fvg.fvg_box, color.new(part_mit_color, 40))
                
                // Full mitigation: price dips below or equals the bottom of the bullish FVG
                if low[0] <= fvg.bottom
                    fvg.is_mitigated := true
                    if keep_mitigated
                        box.set_bgcolor(fvg.fvg_box, full_mit_color)
                        box.set_border_color(fvg.fvg_box, color.new(full_mit_color, 60))
                        box.set_border_style(fvg.fvg_box, line.style_dashed)
                    else
                        box.delete(fvg.fvg_box)
                        array.remove(active_fvgs, i)
                        continue
            else
                // Partial mitigation: price rises above the bottom of the bearish FVG
                if high[0] > fvg.bottom and not fvg.is_partially_mitigated
                    fvg.is_partially_mitigated := true
                    box.set_bgcolor(fvg.fvg_box, part_mit_color)
                    box.set_border_color(fvg.fvg_box, color.new(part_mit_color, 40))
                
                // Full mitigation: price rises above or equals the top of the bearish FVG
                if high[0] >= fvg.top
                    fvg.is_mitigated := true
                    if keep_mitigated
                        box.set_bgcolor(fvg.fvg_box, full_mit_color)
                        box.set_border_color(fvg.fvg_box, color.new(full_mit_color, 60))
                        box.set_border_style(fvg.fvg_box, line.style_dashed)
                    else
                        box.delete(fvg.fvg_box)
                        array.remove(active_fvgs, i)
                        continue

Разбор параметров

Для гибкой настройки индикатора под различные таймфреймы и торговые инструменты мы вынесли ключевые переменные в панель настроек:

  • Min Gap Size (%): Минимальный размер имбаланса в процентах от цены закрытия сигнальной свечи. Позволяет отсеивать рыночный шум на волатильных активах. Например, при анализе спредов, как в статье RSI для спреда ETH/BTC в Pine Script v5: расчет и визуализация, фильтрация шума критически важна.
  • Keep Mitigated FVGs?: Определяет, нужно ли оставлять полностью перекрытые зоны на графике. Если отключить, отработавшие зоны будут удаляться, освобождая визуальное пространство.
  • Max History Bars: Ограничение глубины проверки в барах. Это оптимизирует производительность скрипта и предотвращает переполнение лимитов TradingView на количество графических объектов.
  • Visual Colors: Настройки цвета для бычьего (Bullish FVG Color), медвежьего (Bearish FVG Color), частично перекрытого (Partial Mitigation Color) и полностью протестированного имбаланса.

Как запустить

Чтобы запустить индикатор на графике TradingView, выполните следующие шаги:

1. Откройте терминал TradingView и выберите нужный вам финансовый инструмент.

2. В нижней панели откройте вкладку Pine Editor.

3. Скопируйте представленный выше код и вставьте его в редактор, полностью заменив дефолтный шаблон.

4. Нажмите кнопку Add to Chart (Добавить на график) в правом верхнем углу редактора.

5. Настройте параметры фильтрации под ваш таймфрейм через иконку шестеренки в названии индикатора.

Этот индикатор отлично подходит для генерации сигналов в автоматизированных торговых системах. Вы можете настроить отправку алертов на пробитие или перекрытие зон и связать их с торговым ботом, используя руководство по интеграции Pine Script v5 с Finandy через вебхуки.

Оцените статью
FinFluct