4.5 KiB
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
#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:
m_hist_bars = (qty_history >= 0) ? qty_history : 0;
Строка 201:
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_*; добавить:
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) результат будет:
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
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: Закоммитить
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)"