705 lines
36 KiB
Markdown
705 lines
36 KiB
Markdown
|
|
# Архитектура: 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:**
|
||
|
|
```pine
|
||
|
|
// Условие: 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:**
|
||
|
|
```pine
|
||
|
|
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]`
|
||
|
|
```pine
|
||
|
|
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 Частичная митигация (изменение цвета)
|
||
|
|
|
||
|
|
```pine
|
||
|
|
// 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)
|
||
|
|
|
||
|
|
```pine
|
||
|
|
// Условие: 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)
|
||
|
|
|
||
|
|
```pine
|
||
|
|
// Условие: 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)
|
||
|
|
|
||
|
|
```pine
|
||
|
|
// Условие: 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 (аналогично)
|
||
|
|
|
||
|
|
```pine
|
||
|
|
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:**
|
||
|
|
```pine
|
||
|
|
sl_cal_long = array.get(dfvg_R2_bot, 0) // SL = нижняя граница iFVG
|
||
|
|
entry_b = array.get(dfvg_R2_top, 0) // Entry = верхняя граница iFVG
|
||
|
|
```
|
||
|
|
|
||
|
|
**Для Sell:**
|
||
|
|
```pine
|
||
|
|
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
|
||
|
|
|
||
|
|
```cpp
|
||
|
|
// ============ СТРУКТУРЫ ДАННЫХ 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)
|