Midpoint Magnet — как FVG и фрактальный экстремум создают динамический уровень-магнит
Большинство трейдеров работает со статичными горизонтальными уровнями. Провёл линию — и ждёшь. Иногда цена к ней приходит, иногда нет. Проблема не в концепции уровней — проблема в том что рынок не стоит на месте, а уровень стоит.
Эта мысль стала отправной точкой для разработки 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%)
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%
// В основном цикле на каждой свече: if(ep.bull) { if(high[k] > ep.p100) ep.p100 = high[k]; // обновляем потолок ep.p50 = (ep.p0 + ep.p100) * 0.5; // пересчитываем магнит }
Простая формула, но именно в этой динамике вся суть. Уровень не фиксируется — он следует за рынком.
Лестница: визуализация динамики
Самый интересный технический момент — отображение. Динамический уровень нельзя показать одной горизонтальной линией: она была бы размытой кашей из разных значений.
Решение — ступенчатая лестница. Каждый раз когда уровень 50% меняется, рисуется:
- Горизонтальный сегмент на новом значении
- Вертикальный коннектор от предыдущего значения к новому
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-структуре. Это даёт точность входа при сохранении контекста старшего ТФ.
// Загрузка данных нужного ТФ 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 — подписывайтесь, планирую серию материалов по алготрейдингу.



