When trend_only filter is on, zones no longer disappear/reappear
as price enters/exits the zone intra-bar.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- FVG_MAX_STORAGE=50 fixed capacity per zone type (was tied to param)
- m_qty_history → m_hist_bars: parameter now means "bars back"
- ApplyVisibility: bar-window filter (right_edge <= m_hist_bars)
- inp_qty_fvg_hist=0 shows only active zones, default changed to 500
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Добавлен динамический режим в CEquilibrium: после пробоя BOS/MSS
линия Equilibrium автоматически обновляется по новым экстремумам цены
(running max/min), пока не появится следующий BOS/MSS.
Изменения:
- Новые поля: m_dynamic_mode, m_break_dir, m_track_high/low, m_break_bar
- Calculate() принимает price_high/price_low для трекинга
- Backfill от бара пробоя до текущего при каждом обновлении экстремума
- AdjustShift корректирует m_break_bar при новом баре (AS_SERIES)
- Геттеры также обновляются в dynamic mode
- CSwingDetector передаёт high[bar]/low[bar] в Calculate()
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Корневая причина бага: уровень Equilibrium вычислялся через i_high/i_low
(неподтверждённые экстремумы), которые нестабильны и сбрасываются после
BOS/MSS (Step 9). Триггер обновления bar_eq != m_bar_eq_prev не срабатывал
когда MathMax возвращал тот же старый свинг.
Исправления:
1. Разделение расчёта: геттеры (Entry сигналы) используют динамические
i_high/i_low, буферы — только подтверждённые in_high/in_low
2. Триггер отрисовки: ch_in_h || ch_in_l вместо bar_eq != m_bar_eq_prev
3. Backfill от ИЗМЕНЁННОГО свинга (bar_in_high/bar_in_low), не от MathMax
4. Добавлен AdjustShift для синхронизации m_bar_eq_prev при новом баре
5. Удалены неиспользуемые поля m_eq_level/m_eq_level2_p/m_eq_level2_d
6. Добавлены m_fixed_eq/m_fixed_prem2/m_fixed_disc2 для фиксации уровней
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1. Input-параметры сгруппированы в 7 групп через input group:
Основные параметры — сила пивота, бары, тренд
ZigZag и Liquidity Swings — цвет/стиль/толщина ZigZag + цвет/размер точек
Structure Swings — цвет/размер точек
BOS / MSS — раздельные цвета Up/Dn, стиль, толщина для BOS и MSS
Уровни ликвидности — показать/скрыть, цвет, размер ближних/дальних
Equilibrium / Premium / Discount — %, фильтр, цвет/стиль/толщина
FVG / iFVG — раздельные цвета для объектов (inp_fvg_obj_col) и буферов (inp_fvg_buf_col)
2. OnInit() — добавлен блок PlotIndexSetInteger для всех 18 плотов, применяющий input-цвета/стили/толщины динамически.
3. FVG — цвет DRAW_FILLING буферов теперь берётся из inp_fvg_buf_col/inp_ifvg_buf_col (не clrNONE), цвет OBJ_RECTANGLE — из inp_fvg_obj_col/inp_ifvg_obj_col.
Было: 15 параметров без группировки. Стало: ~40 параметров в 7 группах.
Баг: 4 буфера INDICATOR_CALCULATIONS (calc_b_sw_high, calc_b_sw_low, calc_bar_sw_high, calc_bar_sw_low) хранили абсолютные AS_SERIES индексы баров. В инкрементальном режиме (тестер) эти индексы устаревали — ячейки буфера сдвигались с каждым новым баром, а значения внутри — нет. Через b_len баров lookback-индекс отставал на b_len позиций, что приводило к:
ZigZag на неправильных барах (хаотичные сегменты)
Каскадной порче состояния через "unexpected pivot" кейсы (строки 838-839, 932-933)
Фикс: Хранение относительных смещений (offset = absolute - bar) вместо абсолютных индексов. При чтении: lb_idx + offset корректно реконструирует текущий абсолютный индекс как в initial, так и в incremental режиме.
Изменено 8 строк в CSwingDetector.mqh (2 локации: запись строки 473-478, чтение строки 542-547).
Добавлено 12 строк в CSwingDetector.mqh:422-436 — корректировка 8 сохранённых AS_SERIES индексов баров при появлении нового бара в инкрементальной ветке Calculate().
Шаг 6 в Calculate() — после буферной логики, цикл расширяет OBJ_RECTANGLE всех активных зон (не только новейшей)
UpdateBar0() — после буферной логики, цикл расширяет все активные зоны до TimeCurrent(), независимо от тренда
Теперь:
inp_fvg_trend_only = false: все активные зоны тянутся до bar 0
inp_fvg_trend_only = true: все активные зоны тянутся до bar 0, но ApplyVisibility скрывает ненужные (не-тренд, выше/ниже цены, митигированные)
Теперь поток правильный:
FVG создан → dfvg + dfvg_R заполняются одновременно
FVG митигирован → dfvg замораживается, dfvg_R остаётся
Позже close < dfvg_R_bot → dfvg_R инвертируется в Supply iFVG
Были исправлены 3 ключевых бага по сравнению с предыдущей версией:
m_dfvg_cnt-- после заморозки — убрано. Счётчик cnt = ВСЕГО зон (активные + замороженные). FindActiveZone() сканирует весь массив и корректно находит активные зоны даже если предыдущие уже заморожены.
PruneOldZones перемещён до UnshiftZone — теперь вызывается перед вставкой новой зоны, освобождая место и очищая бары старейшей зоны в буфере. Условие изменено с > max_allowed на >= max_cnt.
Упрощён шаг митигации — убраны while + break конструкции с двойным вызовом FindActiveZone(). Заменено на чистое if.
Ind_Aleks_ICT_Entry_V2_TS_Indie.mq5 — добавления
indicator_buffers 28, indicator_plots 18
Plots 17-18: DRAW_FILLING с PLOT_EMPTY_VALUE = 0.0
Новые inputs: inp_qty_fvg_hist, inp_fvg_col, inp_ifvg_col
Буферы 24-27 с AS_SERIES = true
g_fvg.Init() в OnInit()
Отдельный цикл FVG в OnCalculate() (полный и инкрементальный)
g_fvg.UpdateBar0() вызывается каждый тик
Сделано одно изменение в Ind_Aleks_ICT_Entry_V2_TS_Indie.mq5 — переставлены блоки SetIndexBuffer:
Было (нарушение):
16-23: INDICATOR_CALCULATIONS ← посередине
24-27: INDICATOR_DATA (FVG) ← ПОСЛЕ calculations
Стало (правильно):
16-19: INDICATOR_DATA (FVG_Top, FVG_Bot, IFVG_Top, IFVG_Bot)
20-27: INDICATOR_CALCULATIONS (CalcSsHigh..CalcBarSwLow)
Теперь все 20 INDICATOR_DATA буферов (0-19) стоят перед 8 INDICATOR_CALCULATIONS (20-27). PlotIndexSetDouble/Integer и ArraySetAsSeries не требовали изменений — они работают с plot-индексами и массивами соответственно, а не с buffer-индексами.
Всё готово. Итог изменений в Ind_Aleks_ICT_Entry_V2_TS_Indie.mq5:
Место Что изменено
OnInit() строки 243-246 clrNONE вместо inp_fvg_col/inp_ifvg_col — DRAW_FILLING скрыт
OnInit() строка 305 g_fvg.Init(qty, fvg_col, ifvg_col) — цвета переданы в модуль
OnCalculate() строки 389, 397 добавлен time в оба вызова g_fvg.Calculate()
OnDeinit() g_fvg.Cleanup() — удаляет все OBJ_RECTANGLE при выгрузке
После перезагрузки индикатора на графике будут видны только OBJ_RECTANGLE прямоугольники (цвета из input), DRAW_FILLING полностью скрыт.
Перестановка z-order: Liquidity буферы (plots 4-9) теперь идут ДО BOS/MSS/Equilibrium (plots 10-16). BOS и MSS рисуются поверх точек ликвидности.
DRAW_LINE → DRAW_ARROW: Все 6 буферов ликвидности теперь рисуются точками (ромб 159). Width 2 для ближайших уровней (Up1/Dn1), width 1 для 2-го и 3-го. Больше никаких "ступенек" при смене уровня.
INDICATOR_CALCULATIONS остались на прежних индексах 16-23 — без изменений.
Создано:
CLiquidityLevels.mqh — новый модуль с кольцевым буферным хранилищем для уровней спроса/предложения, обнаружение развертки (каскадный время-loop), условия con_buy/con_sell с фильтрацией трендов
Изменено:
CSwingDetector.mqh — форвардное объявление, расширенный Calculate() с 8 новыми параметрами (время[], 6 буферов ликвидности, указатель CLiquidityLevels), обратный вызов в основном цикле после равновесия
Ind_Aleks_ICT_Entry_V2_TS_Indie.mq5 — 24 буфера / 16 участков, 4 новых буфера DRAW_LINE (Вверх2/Вверх3/Dn2/Dn3), INDICATOR_CALCULATIONS смещены на индексы 16-23, g_liquidity init с параметром inp_show_lid
Сборник: 0 ошибок, 0 предупреждений.
Индикатор готов к визуальному тестированию на графике — вы должны увидеть до 6 зеленых горизонтальных линий (3 ближайших уровня предложения выше цены, 3 ближайших уровня спроса ниже). Когда уровень подметается, линии перескакивают на следующие доступные уровни.
Изменения в CEquilibrium.mqh:
3 случая расчёта вместо одного:
Case 1 (cf_in_low && !cf_in_high): Range = i_high - In_Low → Discount + Discount2
Case 2 (cf_in_high && !cf_in_low): Range = In_High - i_low → Premium + Premium2
Case 3 (оба подтверждены): полный расчёт, выбор по тренду
Исправлен баг: MathMin → MathMax в retroactive fill (AS_SERIES: больший индекс = старший бар)
2 новых буфера: buf_premium2[] и buf_discount2[] с отдельной отрисовкой и retroactive fill
2 новых метода: IsInDiscountZone(ifvg_bottom) и IsInPremiumZone(ifvg_top) для будущих Entry условий
Трекинг уровней: m_eq_level2_p / m_eq_level2_d для корректного retroactive fill второго уровня
Изменения в CSwingDetector.mqh:
Проброс buf_premium2[] и buf_discount2[] через Calculate() в CEquilibrium
Изменения в Ind_Aleks_ICT_Entry_V2_TS_Indie.mq5:
indicator_buffers 20, indicator_plots 12
2 новых плота: Premium2 и Discount2 (clrOrchid, STYLE_DOT, width 1)
CALCULATIONS буферы сдвинуты на индексы 12-19
Полная инициализация новых буферов (FullReset, new bar, AS_SERIES)
Визуальное поведение:
При inp_eq_con=false — только Equilibrium линия (как раньше)
При inp_eq_con=true — появляются Premium2 (сверху) и Discount2 (снизу) линии orchid цвета