Ind_Aleks_ICT_Entry_V2_TS_I.../docs/plans/2026-03-06-fvg-hist-bars-plan.md
Alexandr Nikolaev c13e7e6180 docs: implementation plan for fvg-hist-bars
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-06 13:54:29 +03:00

4.5 KiB

inp_qty_fvg_hist Bar-Window Implementation Plan

For Claude: REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.

Goal: Изменить семантику inp_qty_fvg_hist с «количество зон» на «количество баров назад», чтобы параметр контролировал глубину видимой истории.

Architecture: Хранение зон отвязывается от параметра — фиксированная ёмкость 50 на тип. Параметр используется только в ApplyVisibility() как фильтр по правому краю зоны.

Tech Stack: MQL5, CFVGModule.mqh, Ind_Aleks_ICT_Entry_V2_TS_Indie.mq5

Design doc: docs/plans/2026-03-06-fvg-hist-bars-design.md


Task 1: Константа + переименование поля + Init()

Files:

  • Modify: CFVGModule.mqh:7 (добавить define после include guard)
  • Modify: CFVGModule.mqh:97 (поле m_qty_history → m_hist_bars)
  • Modify: CFVGModule.mqh:160 (конструктор)
  • Modify: CFVGModule.mqh:191-217 (Init)

Step 1: Добавить константу после #define CFVG_MODULE_MQH

#define FVG_MAX_STORAGE 50

Step 2: Переименовать поле

Строка 97: m_qty_historym_hist_bars

Step 3: Обновить конструктор

Строка 160: m_qty_history = 4;m_hist_bars = 0;

Step 4: Обновить Init()

Строка 191:

m_hist_bars = (qty_history >= 0) ? qty_history : 0;

Строка 201:

int max_zones = FVG_MAX_STORAGE + 1;

Удалить строку 202: int max_preinv = 20; — оставить как есть (pre-inv массивы не связаны с qty).


Task 2: Обновить Calculate()

Files:

  • Modify: CFVGModule.mqh:438 (max_zones в Calculate)

Step 1: Заменить вычисление max_zones

Строка 438: int max_zones = m_qty_history + 1;int max_zones = FVG_MAX_STORAGE + 1;


Task 3: Обновить ApplyVisibility() — добавить фильтр по барам

Files:

  • Modify: CFVGModule.mqh:726-783 (ApplyVisibility)

Step 1: Добавить проверку окна по барам в каждый из 4 циклов

В каждом цикле (Demand FVG, Supply FVG, Demand iFVG, Supply iFVG) после строки bool show = m_show_*; добавить:

if(show)
{
   int right_edge = (zones[i].end_bar == -1) ? 0 : zones[i].end_bar;
   show = (m_hist_bars == 0)
          ? (zones[i].end_bar == -1)
          : (right_edge <= m_hist_bars);
}

Конкретно для Demand FVG (строки 733-743) результат будет:

for(int i = 0; i < m_dfvg_cnt; i++)
{
   if(m_dfvg_zones[i].obj_name == "") continue;
   bool show = m_show_fvg;
   if(show)
   {
      int right_edge = (m_dfvg_zones[i].end_bar == -1) ? 0 : m_dfvg_zones[i].end_bar;
      show = (m_hist_bars == 0)
             ? (m_dfvg_zones[i].end_bar == -1)
             : (right_edge <= m_hist_bars);
   }
   if(show && m_trend_only)
      show = (in_dir_big == 1) && (m_dfvg_zones[i].end_bar == -1) && (m_dfvg_zones[i].top < current_price);
   if(show && m_eq_filter)
      show = PassesEqFilter(m_dfvg_zones[i].top, m_dfvg_zones[i].bot, in_dir_big, true, eq_lvl);
   ObjectSetInteger(0, m_dfvg_zones[i].obj_name, OBJPROP_TIMEFRAMES,
                    show ? OBJ_ALL_PERIODS : OBJ_NO_PERIODS);
}

Аналогично для Supply FVG (m_sfvg_zones), Demand iFVG (m_ifvg_d_zones), Supply iFVG (m_ifvg_s_zones).


Task 4: Обновить .mq5 — комментарий и дефолт

Files:

  • Modify: Ind_Aleks_ICT_Entry_V2_TS_Indie.mq5:179

Step 1: Изменить input

input int              inp_qty_fvg_hist  = 500;             // Глубина истории FVG (бары, 0=только активные)

Task 5: Валидация компиляции

Step 1: Запустить validate_mql_code

validate_mql_code(mq_file_path="<full_path>\Ind_Aleks_ICT_Entry_V2_TS_Indie.mq5")

Expected: success: true, 0 ошибок.

Step 2: Если есть ошибки — исправить и перевалидировать


Task 6: Коммит

Step 1: Закоммитить

git add CFVGModule.mqh Ind_Aleks_ICT_Entry_V2_TS_Indie.mq5
git commit -m "feat: inp_qty_fvg_hist bar-window semantics (was zone count)"