# Design: inp_qty_fvg_hist — окно по барам вместо количества зон **Дата:** 2026-03-06 **Подход:** A (фильтр по барам в ApplyVisibility) ## Проблема `inp_qty_fvg_hist` ограничивает общее число зон в массиве (включая скрытые фильтрами и митигированные). Пользователь ожидает видеть N зон, но видит меньше, т.к. скрытые занимают слоты. При значении 0 молча ставится дефолт 4. ## Решение Параметр меняет семантику: **было** «количество зон», **стало** «количество баров назад». Зона видима, если её правый край (end_bar для митигированных, 0 для активных) попадает в окно `[0..N]`. | inp_qty_fvg_hist | Поведение | |---|---| | 0 | Только активные (немитигированные) зоны | | 100 | Зоны с правым краем в последних 100 барах | | 1000 | Практически вся расчётная история | ## Изменения в CFVGModule.mqh ### 1. Константа и поле ``` #define FVG_MAX_STORAGE 50 m_qty_history → m_hist_bars ``` ### 2. Init() - `m_hist_bars = (qty_history >= 0) ? qty_history : 0` - `ArrayResize` на `FVG_MAX_STORAGE + 1` (фиксированный) ### 3. Calculate() - `max_zones` = `FVG_MAX_STORAGE + 1` (вместо `m_qty_history + 1`) - Остальная логика без изменений ### 4. ApplyVisibility() — ключевое изменение Для каждой зоны добавляется проверка окна по барам: ``` int right_edge = (zone.end_bar == -1) ? 0 : zone.end_bar; bool in_window = (m_hist_bars == 0) ? (zone.end_bar == -1) // 0 = только активные : (right_edge <= m_hist_bars); ``` Проверка добавляется к существующим фильтрам (trend_only, eq_filter). ### 5. UpdateBar0() Без изменений — работает только с активными зонами (всегда в окне). ## Изменения в .mq5 - Комментарий инпута: `"Кол-во исторических зон"` → `"Глубина истории FVG (бары, 0=только активные)"` ## Хранение - Фиксированная ёмкость `FVG_MAX_STORAGE = 50` на каждый из 4 типов зон - PruneOldZones обрезает по ёмкости хранилища (50), не по параметру - ObjectDelete вызывается при вытеснении старой зоны (утечки объектов нет)