Midpoint Magnet — как FVG и фрактальный экстремум создают динамический уровень-магнит

Midpoint Magnet — как FVG и фрактальный экстремум создают динамический уровень-магнит

13 июня 2026, 14:49
Alexey Nazarov
0
10

Большинство трейдеров работает со статичными горизонтальными уровнями. Провёл линию — и ждёшь. Иногда цена к ней приходит, иногда нет. Проблема не в концепции уровней — проблема в том что рынок не стоит на месте, а уровень стоит.

Эта мысль стала отправной точкой для разработки Midpoint Magnet.

Идея: почему 50% — это магнит

В основе индикатора лежит простая, но нетривиальная идея. После появления FVG (Fair Value Gap — ценового дисбаланса) рынок начинает направленное движение. У этого движения есть две точки:

  • Нижняя граница — фрактальный экстремум перед FVG (минимум для бычьего, максимум для медвежьего). Это якорь — ноль процентов.
  • Верхняя граница — текущий экстремум движения. Он постоянно обновляется. Это сто процентов.

Ровно посередине — 50%. Это точка равновесия активного движения. Цена стремится к ней как магнит — возвращается, тестирует, и либо отбивается, либо пробивает и закрывает эпизод.

Ключевое отличие от статичного уровня: 50% пересчитывается на каждой свече по мере того как цена обновляет экстремум. Уровень живёт вместе с рынком.


Три компонента логики

FVG (Fair Value Gap)

Бычий FVG: Low[i+1] > High[i+3] — разрыв между свечами где рынок прошёл слишком быстро вверх. Медвежий FVG: Low[i+3] > High[i+1] — то же самое вниз.

Минимальный размер FVG фильтруется параметром InpFVGMinPct — процент от цены актива. Это убирает микро-дисбалансы которые не несут торгового смысла.

Фрактальный экстремум (0%)

mql5

bool IsSwingLow(const double &l[], int i, int fl, int total) { for(int j = 1; j <= fl; j++) if(l[i] >= l[i+j] || l[i] >= l[i-j]) return false; return true; }

Функция проверяет что бар i является локальным минимумом — все fl баров слева и справа выше него. Параметр InpFracLen задаёт длину плеча. Чем больше — тем надёжнее экстремум, но тем позже он подтверждается.

Динамический уровень 50%

mql5
        // В основном цикле на каждой свече:
if(ep.bull)
{
    if(high[k] > ep.p100) ep.p100 = high[k];  // обновляем потолок
    ep.p50 = (ep.p0 + ep.p100) * 0.5;          // пересчитываем магнит
}

Простая формула, но именно в этой динамике вся суть. Уровень не фиксируется — он следует за рынком.


Лестница: визуализация динамики

Самый интересный технический момент — отображение. Динамический уровень нельзя показать одной горизонтальной линией: она была бы размытой кашей из разных значений.

Решение — ступенчатая лестница. Каждый раз когда уровень 50% меняется, рисуется:

  • Горизонтальный сегмент на новом значении
  • Вертикальный коннектор от предыдущего значения к новому
mql5

void DrawStaircaseStep(int e, int k, double prev_p50, datetime bar_time) { // Горизонтальный сегмент на текущем p50 ObjectCreate(0, h_name, OBJ_TREND, 0, bar_time, g_ep[e].p50, end_time, g_ep[e].p50); // Вертикальный коннектор если p50 изменился if(MathAbs(g_ep[e].p50 - prev_p50) > 0.000001) ObjectCreate(0, v_name, OBJ_TREND, 0, bar_time, prev_p50, bar_time, g_ep[e].p50); }

Визуально это выглядит как лестница которая поднимается (бычий эпизод) или опускается (медвежий) — и именно она показывает куда движется магнит.


Жизненный цикл эпизода

Индикатор ведёт не более одного бычьего и одного медвежьего эпизода одновременно. Это принципиальное решение — избегает перегруза графика и даёт чёткий сигнал.

Событие Действие
Обнаружен FVG нужного типа Старт эпизода, начинается лестница
Low ≤ 50% (бычий) Эпизод закрыт — цена достигла магнита
High ≥ 50% (медвежий) Эпизод закрыт — цена достигла магнита
Истёк InpMaxDays Принудительное закрытие + вертикальная метка

При закрытии лестница переходит в пунктир — архивный уровень. Активная линия всегда сплошная и тянется вправо.


Примеры на графике



MTF режим

Параметр InpCalcTF позволяет анализировать фракталы и FVG на старшем таймфрейме оставаясь на младшем графике. Например: смотришь на M15, а уровни строятся по H4-структуре. Это даёт точность входа при сохранении контекста старшего ТФ.

mql5
        // Загрузка данных нужного ТФ
CopyTime(Symbol(), InpCalcTF, 0, InpHistLen, mtf_time);
CopyHigh(Symbol(), InpCalcTF, 0, copied, mtf_h);
CopyLow(Symbol(), InpCalcTF,  0, copied, mtf_l);

Рекомендованные настройки

Таймфрейм FracLen Lkb FVGMin% MaxDays
M1 – M5 1 5 0.05 1
M15 – M30 2 8 0.08 1
H1 2 10 0.10 2
H4 3 10 0.15 5
D1 3 7 0.20 14

Где попробовать

Индикатор опубликован на MQL5 Market: 👉 https://www.mql5.com/ru/market/product/178000

Доступна бесплатно. Файл .ex5 и PDF-инструкция со всеми параметрами — в Telegram-канале: 👉 t.me/MrFractalAlex


Буду рад вопросам и обратной связи в комментариях. Если интересна тема разработки индикаторов на MQL5 — подписывайтесь, планирую серию материалов по алготрейдингу.