Ind_Aleks_ICT_Entry_V2_TS_I.../ARCHITECTURE_FVG.md
2026-02-10 21:54:56 +03:00

36 KiB

Архитектура: FVG и iFVG

Источник: TradingView Pine Script v6 - ICT Entry V2 [TS_Indie] Дата создания: 2026-02-03


1. КОНЦЕПЦИЯ FVG (Fair Value Gap)

FVG - это ценовой разрыв между тремя последовательными барами, где средний бар не перекрывается с соседними.

┌─────────────────────────────────────────────────────────────────────────────┐
│                              DEMAND FVG (бычий)                              │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│     Бар [2]      Бар [1]      Бар [0]                                      │
│        │            │            │                                          │
│        │    ┌───────────────────┐│                                          │
│        │    │     high[0]       ││                                          │
│        │    │        │          ││                                          │
│        │    │        │          │┼──────── FVG TOP = low[0]                │
│  ──────┼────┼────────┼──────────┼│         (нижняя граница текущего бара)  │
│        │    │        │  GAP     ││                                          │
│  ──────┼────┼────────┼──────────┼│                                          │
│        │    │        │          │┼──────── FVG BOTTOM = high[2]            │
│  high[2]────┼────────┼──────────┼│         (верхняя граница бара 2)        │
│        │    │        │          ││                                          │
│        │    │        │          ││                                          │
│        │    └───────────────────┘│                                          │
│                                                                             │
│  УСЛОВИЕ: low[0] > high[2] (текущий лоу выше хая 2 бара назад)            │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────────────────────┐
│                              SUPPLY FVG (медвежий)                           │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│     Бар [2]      Бар [1]      Бар [0]                                      │
│        │            │            │                                          │
│        │    ┌───────────────────┐│                                          │
│   low[2]────┼────────┼──────────┼┼──────── FVG TOP = low[2]                │
│        │    │        │          ││         (нижняя граница бара 2)         │
│  ──────┼────┼────────┼──────────┼│                                          │
│        │    │        │  GAP     ││                                          │
│  ──────┼────┼────────┼──────────┼│                                          │
│        │    │        │          │┼──────── FVG BOTTOM = high[0]            │
│        │    │     high[0]       ││         (верхняя граница текущего бара) │
│        │    │        │          ││                                          │
│        │    │        │          ││                                          │
│        │    └───────────────────┘│                                          │
│                                                                             │
│  УСЛОВИЕ: high[0] < low[2] (текущий хай ниже лоу 2 бара назад)            │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

2. СТРУКТУРЫ ДАННЫХ FVG

2.1 Массивы FVG (обычные)

Массив Тип Описание
dfvg_top[] float Верхняя граница Demand FVG (= low[0])
dfvg_bot[] float Нижняя граница Demand FVG (= high[2])
dfvg_bar[] int (time) Время создания FVG
dfvg_col[] color Текущий цвет (меняется при частичной митигации)
sfvg_top[] float Верхняя граница Supply FVG (= low[2])
sfvg_bot[] float Нижняя граница Supply FVG (= high[0])
sfvg_bar[] int (time) Время создания
sfvg_col[] color Текущий цвет

2.2 Pre-Inversion FVG (промежуточные - кандидаты на iFVG)

Массив Тип Описание
dfvg_R_top[] float Копия dfvg_top (для отслеживания инверсии)
dfvg_R_bot[] float Копия dfvg_bot
dfvg_bar_R[] int Время
sfvg_R_top[] float Копия sfvg_top
sfvg_R_bot[] float Копия sfvg_bot
sfvg_bar_R[] int Время

2.3 iFVG (Inversion FVG - ОСНОВНЫЕ для входа!)

Массив Тип Описание
dfvg_R2_top[] float Верхняя граница Demand iFVG
dfvg_R2_bot[] float Нижняя граница Demand iFVG
dfvg_bar_R2[] int Время создания
d_i_fvg_col[] color Цвет
sfvg_R2_top[] float Верхняя граница Supply iFVG
sfvg_R2_bot[] float Нижняя граница Supply iFVG
sfvg_bar_R2[] int Время создания
s_i_fvg_col[] color Цвет

3. ЖИЗНЕННЫЙ ЦИКЛ FVG

3.1 Создание FVG (tz.md строки 272-298)

Demand FVG:

// Условие: low > high[2] (неявное, через проверку массива)
value_unshift(dfvg_top, low, dfvg_bot, high[2], dfvg_bar, time[2])
add_int_unshift(dfvg_col, Col_fvg_d)
value_unshift(dfvg_R_top, low, dfvg_R_bot, high[2], dfvg_bar_R, time[2])  // Копия для iFVG

Supply FVG:

value_unshift(sfvg_top, low[2], sfvg_bot, high, sfvg_bar, time[2])
add_int_unshift(sfvg_col, Col_fvg_s)
value_unshift(sfvg_R_top, low[2], sfvg_R_bot, high, sfvg_bar_R, time[2])  // Копия для iFVG

3.2 Митигация FVG (удаление при пробое)

Demand FVG митигируется когда: low <= dfvg_bot[0]

if low <= array.get(dfvg_bot, 0):
    for i = 0 to qty_fvg-1:
        // Создать фиксированный box (история)
        add_array_unshift(d_fvg_mit, box.new(...))
        // Удалить из активных
        value_remove(dfvg_top, dfvg_bot, dfvg_bar, 0)
        array.remove(dfvg_col, 0)
        Delete_Box_Push(d_fvg_zone, 0)

        if low > array.get(dfvg_bot, 0) or na(...):
            break

Supply FVG митигируется когда: high >= sfvg_top[0]

3.3 Частичная митигация (изменение цвета)

// Demand FVG частично затронут:
if low <= array.get(dfvg_top, 0):  // Цена коснулась TOP
    for i = 0 to qty_fvg-1:
        if low <= array.get(dfvg_top, i):
            array.set(dfvg_col, i, Col_fvg_mit)  // Меняем цвет на "mitigated"

4. КОНЦЕПЦИЯ iFVG (Inversion FVG)

iFVG - это FVG, который был ПРОБИТ ЗАКРЫТИЕМ и "перевернулся":

  • Supply FVG → Demand iFVG (когда close > sfvg_top)
  • Demand FVG → Supply iFVG (когда close < dfvg_bot)
┌─────────────────────────────────────────────────────────────────────────────┐
│                      ИНВЕРСИЯ: Supply FVG → Demand iFVG                      │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  ДО инверсии:                    ПОСЛЕ инверсии:                           │
│                                                                             │
│  ┌─────────────┐ sfvg_top        ┌─────────────┐ dfvg_R2_top               │
│  │             │                  │             │                           │
│  │ SUPPLY FVG  │ ─────────────►  │ DEMAND iFVG │                           │
│  │  (медвежий) │                  │  (бычий)    │                           │
│  │             │                  │             │                           │
│  └─────────────┘ sfvg_bot        └─────────────┘ dfvg_R2_bot               │
│                                                                             │
│  Условие инверсии: close > sfvg_R_top[0]                                   │
│  (закрытие ВЫШЕ верхней границы Supply FVG)                                │
│                                                                             │
│  ВАЖНО: только close! Тень (wick) НЕ считается!                            │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

5. ЛОГИКА СОЗДАНИЯ iFVG (tz.md строки 357-391)

5.1 Demand iFVG (из Supply FVG)

// Условие: close ПРОБИВАЕТ Supply FVG вверх
if close > array.get(sfvg_R_top, 0) and barstate.isconfirmed:
    for i = 0 to qty_fvg-1:
        if close > array.get(sfvg_R_top, 0):
            // Копируем Supply FVG в Demand iFVG
            value_unshift(dfvg_R2_top, array.get(sfvg_R_top, 0),
                          dfvg_R2_bot, array.get(sfvg_R_bot, 0),
                          dfvg_bar_R2, array.get(sfvg_bar_R, 0))
            add_int_unshift(d_i_fvg_col, Col_ifvg_d)

            // Удаляем из Pre-Inversion
            value_remove(sfvg_R_top, sfvg_R_bot, sfvg_bar_R, 0)

        if close <= array.get(sfvg_R_top, 0) or na(...):
            break

5.2 Supply iFVG (из Demand FVG)

// Условие: close ПРОБИВАЕТ Demand FVG вниз
if close < array.get(dfvg_R_bot, 0) and barstate.isconfirmed:
    for i = 0 to qty_fvg-1:
        if close < array.get(dfvg_R_bot, 0):
            // Копируем Demand FVG в Supply iFVG
            value_unshift(sfvg_R2_top, array.get(dfvg_R_top, 0),
                          sfvg_R2_bot, array.get(dfvg_R_bot, 0),
                          sfvg_bar_R2, array.get(dfvg_bar_R, 0))
            add_int_unshift(s_i_fvg_col, Col_ifvg_s)

            // Удаляем из Pre-Inversion
            value_remove(dfvg_R_top, dfvg_R_bot, dfvg_bar_R, 0)

6. МИТИГАЦИЯ iFVG

Demand iFVG митигируется когда: low <= dfvg_R2_bot[0] Supply iFVG митигируется когда: high >= sfvg_R2_top[0]


7. ПОТОК ДАННЫХ FVG → iFVG

┌─────────────────────────────────────────────────────────────────────────────┐
│                           ПОТОК ДАННЫХ FVG → iFVG                            │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  ┌──────────────────┐                                                       │
│  │  Создание FVG    │  low > high[2] (Demand) или high < low[2] (Supply)   │
│  └────────┬─────────┘                                                       │
│           │                                                                 │
│           ▼                                                                 │
│  ┌──────────────────┐       ┌──────────────────┐                           │
│  │    dfvg/sfvg     │ ────► │  dfvg_R/sfvg_R   │  (копия для отслеживания) │
│  │  (активные FVG)  │       │ (Pre-Inversion)  │                           │
│  └────────┬─────────┘       └────────┬─────────┘                           │
│           │                          │                                      │
│           │                          │ close пробивает FVG                  │
│           │                          ▼                                      │
│           │                 ┌──────────────────┐                           │
│           │                 │  dfvg_R2/sfvg_R2 │  (iFVG - для Entry!)      │
│           │                 │   (Inversion)    │                           │
│           │                 └────────┬─────────┘                           │
│           │                          │                                      │
│           ▼                          ▼                                      │
│  ┌──────────────────┐       ┌──────────────────┐                           │
│  │    Митигация     │       │    Митигация     │                           │
│  │ low <= dfvg_bot  │       │ low <= dfvg_R2_bot│                          │
│  │ high >= sfvg_top │       │ high >= sfvg_R2_top                          │
│  └──────────────────┘       └──────────────────┘                           │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

8. ИСПОЛЬЗОВАНИЕ iFVG В ENTRY CONDITIONS (tz.md строки 935-991)

8.1 Buy Signal (con_buy + Check_gap_buy)

// Условие: iFVG существует И swept Demand уровень НИЖЕ iFVG
if not na(array.get(dfvg_R2_bot, 0)) and value_dem_lid < array.get(dfvg_R2_bot, 0) and up_trend:

    // 1. Расчёт GAP между iFVG и FVG
    FVG_gap_buy := math.abs(array.get(dfvg_R2_top, 0) - array.get(dfvg_bot, 0))
    //             iFVG TOP                           FVG BOTTOM

    // 2. Проверка GAP в допустимых пределах
    Con_gap_buy = FVG_gap_buy >= atr_check_FVG_min and FVG_gap_buy <= atr_check_FVG_max

    // 3. Если con_buy активен И GAP валиден:
    if con_buy[1] and Con_gap_buy:

        // 4. Premium/Discount фильтр
        EQ_entry_buy = Follow_trend and EQ_con ?
            (array.get(dfvg_R2_bot, 0) <= Discount and array.get(dfvg_R2_bot, 0) >= Discount2) : true

        // 5. Фильтр размера FVG
        Size_FVG_dem = math.abs(array.get(dfvg_top, 0) - array.get(dfvg_bot, 0))
        size_FVG_con_dem = not Filter_size_FVG or
            (Filter_size_FVG and Size_FVG_dem >= Check_min_FVG and Size_FVG_dem <= Check_max_FVG)

        // 6. Фильтр размера iFVG
        Size_iFVG_dem = math.abs(array.get(dfvg_R2_top, 0) - array.get(dfvg_R2_bot, 0))
        size_iFVG_con_dem = not Filter_size_iFVG or
            (Filter_size_iFVG and Size_iFVG_dem >= Check_min_iFVG and Size_iFVG_dem <= Check_max_iFVG)

        // 7. Фильтр взаимного расположения FVG и iFVG
        con_mix_dem = Con_FVG_mix ? true :
            (not iFVG_be_FVG ?
                array.get(dfvg_bot, 0) >= array.get(dfvg_R2_top, 0) :  // FVG выше iFVG
                array.get(dfvg_bot, 0) < array.get(dfvg_R2_top, 0))    // FVG ниже iFVG

        // 8. Финальная проверка
        if EQ_entry_buy and size_FVG_con_dem and size_iFVG_con_dem and con_mix_dem:
            Check_gap_buy := true

8.2 Sell Signal (аналогично)

if not na(array.get(sfvg_R2_top, 0)) and value_sup_lid > array.get(sfvg_R2_top, 0) and down_trend:
    FVG_gap_sell := math.abs(array.get(sfvg_R2_bot, 0) - array.get(sfvg_top, 0))
    // ... аналогичные проверки ...
    if all_conditions:
        Check_gap_sell := true

9. РАСЧЁТ ENTRY И STOP LOSS (tz.md строки 1054, 1071)

Для Buy:

sl_cal_long = array.get(dfvg_R2_bot, 0)   // SL = нижняя граница iFVG
entry_b = array.get(dfvg_R2_top, 0)        // Entry = верхняя граница iFVG

Для Sell:

sl_cal_short = array.get(sfvg_R2_top, 0)  // SL = верхняя граница iFVG
entry_s = array.get(sfvg_R2_bot, 0)        // Entry = нижняя граница iFVG

10. ДИАГРАММА РАСПОЛОЖЕНИЯ FVG И iFVG ДЛЯ BUY

┌─────────────────────────────────────────────────────────────────────────────┐
│                           BUY SETUP: FVG + iFVG                              │
├─────────────────────────────────────────────────────────────────────────────┤
│                                                                             │
│  Вариант 1: FVG ВЫШЕ iFVG (iFVG_be_FVG = false)                            │
│  ─────────────────────────────────────────────                              │
│                                                                             │
│     ┌─────────────┐ ← dfvg_top (FVG верх)                                  │
│     │             │                                                         │
│     │  DEMAND FVG │                                                         │
│     │             │                                                         │
│     └─────────────┘ ← dfvg_bot (FVG низ)                                   │
│           ↑                                                                 │
│           │ GAP (FVG_gap_buy)                                              │
│           │ Должен быть >= atr_check_FVG_min И <= atr_check_FVG_max        │
│           ↓                                                                 │
│     ┌─────────────┐ ← dfvg_R2_top (iFVG верх) ═══ ENTRY                    │
│     │             │                                                         │
│     │ DEMAND iFVG │                                                         │
│     │             │                                                         │
│     └─────────────┘ ← dfvg_R2_bot (iFVG низ) ═══ STOP LOSS                 │
│                                                                             │
│                                                                             │
│  Вариант 2: FVG НИЖЕ iFVG (iFVG_be_FVG = true)                             │
│  ─────────────────────────────────────────────                              │
│                                                                             │
│     ┌─────────────┐ ← dfvg_R2_top (iFVG верх) ═══ ENTRY                    │
│     │             │                                                         │
│     │ DEMAND iFVG │                                                         │
│     │             │                                                         │
│     └─────────────┘ ← dfvg_R2_bot (iFVG низ) ═══ STOP LOSS                 │
│           ↑                                                                 │
│           │ GAP                                                             │
│           ↓                                                                 │
│     ┌─────────────┐ ← dfvg_top (FVG верх)                                  │
│     │             │                                                         │
│     │  DEMAND FVG │                                                         │
│     │             │                                                         │
│     └─────────────┘ ← dfvg_bot (FVG низ)                                   │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

11. ПАРАМЕТРЫ КОНФИГУРАЦИИ FVG/iFVG

Параметр По умолчанию Описание
fibo_entry 0 Entry Zone внутри iFVG (0-100%)
iFVG_be_FVG false Режим: iFVG перекрывает FVG
Con_FVG_mix false Смешанный режим (оба варианта)
FVG_min_ATR 0.01 Минимальный GAP (x ATR)
FVG_max_ATR 0.2 Максимальный GAP (x ATR)
Filter_size_FVG false Фильтр размера FVG
FVG_min 0.1 Минимальный размер FVG (x ATR)
FVG_max 0.5 Максимальный размер FVG (x ATR)
Filter_size_iFVG false Фильтр размера iFVG
iFVG_min 0.1 Минимальный размер iFVG (x ATR)
iFVG_max 0.5 Максимальный размер iFVG (x ATR)

12. СВЯЗЬ С ДРУГИМИ МОДУЛЯМИ

┌─────────────────────────────────────────────────────────────────────────────┐
│                                                                             │
│  ARCHITECTURE_SWINGS_BOS_MSS.md                                             │
│  ─────────────────────────────                                              │
│  In_Dir_Big (тренд) ──────────────► up_trend / down_trend                  │
│  Premium/Discount ────────────────► EQ_entry_buy / EQ_entry_sell           │
│                                                                             │
│  ARCHITECTURE_LIQUIDITY.md                                                  │
│  ─────────────────────────                                                  │
│  value_dem_lid ───────────────────► Проверка: value_dem_lid < dfvg_R2_bot  │
│  value_sup_lid ───────────────────► Проверка: value_sup_lid > sfvg_R2_top  │
│  con_buy / con_sell ──────────────► Условие активации Check_gap            │
│                                                                             │
│           │                                                                 │
│           ▼                                                                 │
│                                                                             │
│  ARCHITECTURE_FVG.md (этот файл)                                           │
│  ───────────────────────────────                                            │
│  dfvg_R2_top/bot ─────────────────► Entry / Stop Loss (Buy)                │
│  sfvg_R2_top/bot ─────────────────► Entry / Stop Loss (Sell)               │
│  Check_gap_buy / Check_gap_sell ──► buy_signal / sell_signal               │
│                                                                             │
│           │                                                                 │
│           ▼                                                                 │
│                                                                             │
│  ARCHITECTURE_ENTRY.md                                                      │
│  ─────────────────────                                                      │
│  buy_signal / sell_signal                                                   │
│  Entry/SL/TP расчёт                                                         │
│                                                                             │
└─────────────────────────────────────────────────────────────────────────────┘

13. ПСЕВДОКОД ДЛЯ MQL5

// ============ СТРУКТУРЫ ДАННЫХ FVG ============

// FVG массивы
CArrayDouble m_dfvg_top, m_dfvg_bot;  // Demand FVG
CArrayDouble m_sfvg_top, m_sfvg_bot;  // Supply FVG
CArrayLong   m_dfvg_bar, m_sfvg_bar;  // Время

// Pre-Inversion FVG
CArrayDouble m_dfvg_R_top, m_dfvg_R_bot;
CArrayDouble m_sfvg_R_top, m_sfvg_R_bot;
CArrayLong   m_dfvg_bar_R, m_sfvg_bar_R;

// iFVG (Inversion)
CArrayDouble m_dfvg_R2_top, m_dfvg_R2_bot;  // Demand iFVG
CArrayDouble m_sfvg_R2_top, m_sfvg_R2_bot;  // Supply iFVG
CArrayLong   m_dfvg_bar_R2, m_sfvg_bar_R2;

// ============ СОЗДАНИЕ FVG ============

void CheckAddFVG(int i, double low_cur, double high_cur,
                 double low_2, double high_2, datetime time_2)
{
    // Demand FVG: low[0] > high[2]
    if(low_cur > high_2)
    {
        UnshiftArray(m_dfvg_top, low_cur);
        UnshiftArray(m_dfvg_bot, high_2);
        UnshiftArray(m_dfvg_bar, time_2);

        // Копия для Pre-Inversion
        UnshiftArray(m_dfvg_R_top, low_cur);
        UnshiftArray(m_dfvg_R_bot, high_2);
        UnshiftArray(m_dfvg_bar_R, time_2);
    }

    // Supply FVG: high[0] < low[2]
    if(high_cur < low_2)
    {
        UnshiftArray(m_sfvg_top, low_2);
        UnshiftArray(m_sfvg_bot, high_cur);
        UnshiftArray(m_sfvg_bar, time_2);

        UnshiftArray(m_sfvg_R_top, low_2);
        UnshiftArray(m_sfvg_R_bot, high_cur);
        UnshiftArray(m_sfvg_bar_R, time_2);
    }
}

// ============ МИТИГАЦИЯ FVG ============

void CheckFVGMitigation(double low, double high)
{
    // Demand FVG митигация
    while(m_dfvg_bot.Total() > 0 && low <= m_dfvg_bot[0])
    {
        // Создать фиксированный box (история)
        CreateMitigatedFVGBox(m_dfvg_bar[0], m_dfvg_top[0], m_dfvg_bot[0], true);

        // Удалить
        m_dfvg_top.Delete(0);
        m_dfvg_bot.Delete(0);
        m_dfvg_bar.Delete(0);
    }

    // Supply FVG митигация
    while(m_sfvg_top.Total() > 0 && high >= m_sfvg_top[0])
    {
        CreateMitigatedFVGBox(m_sfvg_bar[0], m_sfvg_top[0], m_sfvg_bot[0], false);
        m_sfvg_top.Delete(0);
        m_sfvg_bot.Delete(0);
        m_sfvg_bar.Delete(0);
    }
}

// ============ СОЗДАНИЕ iFVG ============

void CheckCreateIFVG(double close, bool is_confirmed)
{
    if(!is_confirmed) return;

    // Demand iFVG (из Supply FVG): close > sfvg_R_top
    while(m_sfvg_R_top.Total() > 0 && close > m_sfvg_R_top[0])
    {
        // Копируем Supply → Demand iFVG
        UnshiftArray(m_dfvg_R2_top, m_sfvg_R_top[0]);
        UnshiftArray(m_dfvg_R2_bot, m_sfvg_R_bot[0]);
        UnshiftArray(m_dfvg_bar_R2, m_sfvg_bar_R[0]);

        // Удаляем из Pre-Inversion
        m_sfvg_R_top.Delete(0);
        m_sfvg_R_bot.Delete(0);
        m_sfvg_bar_R.Delete(0);
    }

    // Supply iFVG (из Demand FVG): close < dfvg_R_bot
    while(m_dfvg_R_bot.Total() > 0 && close < m_dfvg_R_bot[0])
    {
        UnshiftArray(m_sfvg_R2_top, m_dfvg_R_top[0]);
        UnshiftArray(m_sfvg_R2_bot, m_dfvg_R_bot[0]);
        UnshiftArray(m_sfvg_bar_R2, m_dfvg_bar_R[0]);

        m_dfvg_R_top.Delete(0);
        m_dfvg_R_bot.Delete(0);
        m_dfvg_bar_R.Delete(0);
    }
}

// ============ МИТИГАЦИЯ iFVG ============

void CheckIFVGMitigation(double low, double high)
{
    // Demand iFVG митигация
    while(m_dfvg_R2_bot.Total() > 0 && low <= m_dfvg_R2_bot[0])
    {
        CreateMitigatedIFVGBox(m_dfvg_bar_R2[0], m_dfvg_R2_top[0], m_dfvg_R2_bot[0], true);
        m_dfvg_R2_top.Delete(0);
        m_dfvg_R2_bot.Delete(0);
        m_dfvg_bar_R2.Delete(0);
    }

    // Supply iFVG митигация
    while(m_sfvg_R2_top.Total() > 0 && high >= m_sfvg_R2_top[0])
    {
        CreateMitigatedIFVGBox(m_sfvg_bar_R2[0], m_sfvg_R2_top[0], m_sfvg_R2_bot[0], false);
        m_sfvg_R2_top.Delete(0);
        m_sfvg_R2_bot.Delete(0);
        m_sfvg_bar_R2.Delete(0);
    }
}

// ============ CHECK GAP BUY ============

bool CheckGapBuy(double value_dem_lid, double atr_sl)
{
    if(m_dfvg_R2_bot.Total() == 0) return false;
    if(m_dfvg_bot.Total() == 0) return false;
    if(value_dem_lid >= m_dfvg_R2_bot[0]) return false;
    if(!m_up_trend) return false;

    // GAP между iFVG top и FVG bottom
    double gap = MathAbs(m_dfvg_R2_top[0] - m_dfvg_bot[0]);
    double gap_min = atr_sl * inp_fvg_min_atr;
    double gap_max = atr_sl * inp_fvg_max_atr;

    if(gap < gap_min || gap > gap_max) return false;

    // Premium/Discount filter
    if(inp_follow_trend && inp_eq_con)
    {
        if(m_dfvg_R2_bot[0] > m_discount || m_dfvg_R2_bot[0] < m_discount2)
            return false;
    }

    // Size FVG filter
    if(inp_filter_size_fvg)
    {
        double size_fvg = MathAbs(m_dfvg_top[0] - m_dfvg_bot[0]);
        double check_min = inp_fvg_min * atr_sl;
        double check_max = inp_fvg_max * atr_sl;
        if(size_fvg < check_min || size_fvg > check_max) return false;
    }

    // Size iFVG filter
    if(inp_filter_size_ifvg)
    {
        double size_ifvg = MathAbs(m_dfvg_R2_top[0] - m_dfvg_R2_bot[0]);
        double check_min = inp_ifvg_min * atr_sl;
        double check_max = inp_ifvg_max * atr_sl;
        if(size_ifvg < check_min || size_ifvg > check_max) return false;
    }

    // Mix condition
    if(!inp_con_fvg_mix)
    {
        if(!inp_ifvg_be_fvg)
        {
            // FVG должен быть выше iFVG
            if(m_dfvg_bot[0] < m_dfvg_R2_top[0]) return false;
        }
        else
        {
            // FVG должен быть ниже iFVG
            if(m_dfvg_bot[0] >= m_dfvg_R2_top[0]) return false;
        }
    }

    return true;
}

// ============ CHECK GAP SELL ============

bool CheckGapSell(double value_sup_lid, double atr_sl)
{
    if(m_sfvg_R2_top.Total() == 0) return false;
    if(m_sfvg_top.Total() == 0) return false;
    if(value_sup_lid <= m_sfvg_R2_top[0]) return false;
    if(!m_down_trend) return false;

    // GAP между iFVG bottom и FVG top
    double gap = MathAbs(m_sfvg_R2_bot[0] - m_sfvg_top[0]);
    double gap_min = atr_sl * inp_fvg_min_atr;
    double gap_max = atr_sl * inp_fvg_max_atr;

    if(gap < gap_min || gap > gap_max) return false;

    // Premium/Discount filter
    if(inp_follow_trend && inp_eq_con)
    {
        if(m_sfvg_R2_top[0] < m_premium || m_sfvg_R2_top[0] > m_premium2)
            return false;
    }

    // Size filters (аналогично)
    // Mix condition (аналогично)

    return true;
}

// ============ ENTRY/SL РАСЧЁТ ============

void CalculateEntryLong(double &entry, double &sl)
{
    // Entry = верхняя граница iFVG
    entry = m_dfvg_R2_top[0];

    // SL = нижняя граница iFVG
    sl = m_dfvg_R2_bot[0];

    // Корректировка Entry по fibo_entry
    if(inp_fibo_entry > 0)
    {
        double size = entry - sl;
        entry = sl + size * (inp_fibo_entry / 100.0);
    }
}

void CalculateEntryShort(double &entry, double &sl)
{
    // Entry = нижняя граница iFVG
    entry = m_sfvg_R2_bot[0];

    // SL = верхняя граница iFVG
    sl = m_sfvg_R2_top[0];

    // Корректировка Entry по fibo_entry
    if(inp_fibo_entry > 0)
    {
        double size = sl - entry;
        entry = sl - size * (inp_fibo_entry / 100.0);
    }
}

СЛЕДУЮЩИЕ ШАГИ РЕАЛИЗАЦИИ

  1. Модуль FVG Detection - определение Demand/Supply FVG
  2. Модуль Pre-Inversion - отслеживание FVG для инверсии
  3. Модуль iFVG - создание и митигация iFVG
  4. Модуль Check Gap - проверка условий для Entry
  5. Интеграция - связь с Liquidity (value_dem_lid, con_buy) и Entry (buy_signal)