144 lines
4.5 KiB
Markdown
144 lines
4.5 KiB
Markdown
|
|
# 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)"
|
||
|
|
```
|