Ind_Aleks_ICT_Entry_V2_TS_I.../docs/plans/2026-03-06-fvg-hist-bars-design.md
Alexandr Nikolaev 21cbc1504f docs: design for inp_qty_fvg_hist bar-window semantics
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 13:52:53 +03:00

2.8 KiB

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 вызывается при вытеснении старой зоны (утечки объектов нет)