Ind_Aleks_ICT_Entry_V2_TS_I.../docs/plans/2026-03-06-fvg-hist-bars-plan.md

144 lines
4.5 KiB
Markdown
Raw Permalink Normal View History

# inp_qty_fvg_hist Bar-Window Implementation Plan
> **For Claude:** REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.
**Goal:** Изменить семантику `inp_qty_fvg_hist` с «количество зон» на «количество баров назад», чтобы параметр контролировал глубину видимой истории.
**Architecture:** Хранение зон отвязывается от параметра — фиксированная ёмкость 50 на тип. Параметр используется только в ApplyVisibility() как фильтр по правому краю зоны.
**Tech Stack:** MQL5, CFVGModule.mqh, Ind_Aleks_ICT_Entry_V2_TS_Indie.mq5
**Design doc:** `docs/plans/2026-03-06-fvg-hist-bars-design.md`
---
### Task 1: Константа + переименование поля + Init()
**Files:**
- Modify: `CFVGModule.mqh:7` (добавить define после include guard)
- Modify: `CFVGModule.mqh:97` (поле m_qty_history → m_hist_bars)
- Modify: `CFVGModule.mqh:160` (конструктор)
- Modify: `CFVGModule.mqh:191-217` (Init)
**Step 1: Добавить константу после `#define CFVG_MODULE_MQH`**
```cpp
#define FVG_MAX_STORAGE 50
```
**Step 2: Переименовать поле**
Строка 97: `m_qty_history``m_hist_bars`
**Step 3: Обновить конструктор**
Строка 160: `m_qty_history = 4;``m_hist_bars = 0;`
**Step 4: Обновить Init()**
Строка 191:
```cpp
m_hist_bars = (qty_history >= 0) ? qty_history : 0;
```
Строка 201:
```cpp
int max_zones = FVG_MAX_STORAGE + 1;
```
Удалить строку 202: `int max_preinv = 20;` — оставить как есть (pre-inv массивы не связаны с qty).
---
### Task 2: Обновить Calculate()
**Files:**
- Modify: `CFVGModule.mqh:438` (max_zones в Calculate)
**Step 1: Заменить вычисление max_zones**
Строка 438: `int max_zones = m_qty_history + 1;``int max_zones = FVG_MAX_STORAGE + 1;`
---
### Task 3: Обновить ApplyVisibility() — добавить фильтр по барам
**Files:**
- Modify: `CFVGModule.mqh:726-783` (ApplyVisibility)
**Step 1: Добавить проверку окна по барам в каждый из 4 циклов**
В каждом цикле (Demand FVG, Supply FVG, Demand iFVG, Supply iFVG) после строки `bool show = m_show_*;` добавить:
```cpp
if(show)
{
int right_edge = (zones[i].end_bar == -1) ? 0 : zones[i].end_bar;
show = (m_hist_bars == 0)
? (zones[i].end_bar == -1)
: (right_edge <= m_hist_bars);
}
```
Конкретно для Demand FVG (строки 733-743) результат будет:
```cpp
for(int i = 0; i < m_dfvg_cnt; i++)
{
if(m_dfvg_zones[i].obj_name == "") continue;
bool show = m_show_fvg;
if(show)
{
int right_edge = (m_dfvg_zones[i].end_bar == -1) ? 0 : m_dfvg_zones[i].end_bar;
show = (m_hist_bars == 0)
? (m_dfvg_zones[i].end_bar == -1)
: (right_edge <= m_hist_bars);
}
if(show && m_trend_only)
show = (in_dir_big == 1) && (m_dfvg_zones[i].end_bar == -1) && (m_dfvg_zones[i].top < current_price);
if(show && m_eq_filter)
show = PassesEqFilter(m_dfvg_zones[i].top, m_dfvg_zones[i].bot, in_dir_big, true, eq_lvl);
ObjectSetInteger(0, m_dfvg_zones[i].obj_name, OBJPROP_TIMEFRAMES,
show ? OBJ_ALL_PERIODS : OBJ_NO_PERIODS);
}
```
Аналогично для Supply FVG (m_sfvg_zones), Demand iFVG (m_ifvg_d_zones), Supply iFVG (m_ifvg_s_zones).
---
### Task 4: Обновить .mq5 — комментарий и дефолт
**Files:**
- Modify: `Ind_Aleks_ICT_Entry_V2_TS_Indie.mq5:179`
**Step 1: Изменить input**
```cpp
input int inp_qty_fvg_hist = 500; // Глубина истории FVG (бары, 0=только активные)
```
---
### Task 5: Валидация компиляции
**Step 1: Запустить validate_mql_code**
```
validate_mql_code(mq_file_path="<full_path>\Ind_Aleks_ICT_Entry_V2_TS_Indie.mq5")
```
Expected: `success: true`, 0 ошибок.
**Step 2: Если есть ошибки — исправить и перевалидировать**
---
### Task 6: Коммит
**Step 1: Закоммитить**
```bash
git add CFVGModule.mqh Ind_Aleks_ICT_Entry_V2_TS_Indie.mq5
git commit -m "feat: inp_qty_fvg_hist bar-window semantics (was zone count)"
```