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