Ind_Aleks_ICT_Entry_V2_TS_I.../docs/plans/2026-03-06-fvg-hist-bars-design.md

67 lines
2.8 KiB
Markdown
Raw Permalink Normal View History

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