English
preview
Как выявлять ликвидность на круглых ценовых уровнях в MQL5

Как выявлять ликвидность на круглых ценовых уровнях в MQL5

MetaTrader 5 — Трейдинг |
86 0
Mostafa Ghanbari
Mostafa Ghanbari

Содержание


Введение — геометрия институциональной ликвидности

Цена часто тяготеет к целочисленным отметкам (психологическим круглым уровням) и разворачивается у них. На практике это создает сложности в работе. На одних таймфреймах график перегружен малозначимыми линиями, а на других сильные уровни невозможно отличить от шума. Простые проверки с помощью операции взятия по модулю также дают сбои из-за артефактов вычислений с плавающей точкой и различий в форматах котировок (Digits, TickSize) для валютных пар, металлов, индексов и криптовалют.

В этой статье представлено практическое и проверяемое решение на языке MQL5, устраняющее эти проблемы. Мы формализуем критерий качества обнаружения уровней для разных инструментов и таймфреймов. Мы вводим метрику ZeroSize как численный показатель силы уровня. Мы также описываем детерминированный алгоритм обнаружения (нормализация по размеру тика и анализ конца строки), не зависящий от артефактов IEEE‑754 и формата котировок символа. Наконец, мы предлагаем правила визуализации, позволяющие уменьшить загромождение графика. Мы также приводим рекомендации по настройке и управлению рисками, чтобы результаты можно было использовать в индикаторах, алертах и полуавтоматических системах.

AUDUSD Monthly chart showing RoundLevel Pro hierarchy and precise reversals.

Рис. 1. График AUDUSD MN1 с точными разворотами цены на крупных круглых уровнях (ZeroSize 4-5)



Теоретическая основа — психология концентрации ордеров у круглых уровней

Чтобы понять, почему эти уровни работают, необходимо проанализировать микроструктуру рынка и стакан заявок (Level 2). Круглые числа служат "магнитами ликвидности". В стаканах заявок институциональных участников используются лимитные ордера, которые для удобства размещаются на стандартизированных ценовых отметках. Интервенции центральных банков часто привязаны к круглым ценовым отметкам. Системы алгоритмической торговли группируют уровни тейк-профита и стоп-лосса вблизи этих ключевых отметок. Отображая эту невидимую сетку интереса институциональных участников, трейдеры могут лучше согласовывать свои стратегии с действиями "умных денег".

Иерархия таймфреймов и значимость уровней

Хотя круглые уровни есть на каждом таймфрейме, их значимость определяется графиками старших таймфреймов. Уровень, выявленный на месячном графике (как показано на рис. 1), хранит значительно больше "институциональной памяти", чем уровень на минутном графике. Когда круглый уровень месячного графика совпадает с уровнем дневного графика или H4, возникает "зона совпадения факторов". В таких зонах вероятность разворота на повышенном объеме достигает максимума, поскольку свинг-трейдеры и позиционные трейдеры ориентируются на одну ценовую отметку.

GBPUSD Monthly chart showing RoundLevel Pro hierarchy and precise reversals.

Рис. 2. Визуальное различение силы уровней по меткам ZeroSize на графике GBPUSD MN1

Связь между таймфреймами и ZeroSize

Один из ключевых принципов анализа круглых уровней — изменение их значимости в зависимости от таймфрейма. Уровень ZeroSize 2 (например, 1,1020) может давать возможность для скальпинга на пятиминутном графике, но на дневном или недельном часто становится "рыночным шумом".

С увеличением таймфрейма для разворота цены требуется больше ликвидности. Институциональные участники и алгоритмы высокочастотной торговли ориентируются на крупные круглые уровни (ZeroSize 3 и 4) для исполнения крупных ордеров. Поэтому для отбора сетапов с высокой вероятностью отработки параметр "Minimum ZeroSize" следует настраивать в соответствии с таймфреймом:

  • скальпинг (M1-M15) — зачастую достаточно минимального значения ZeroSize 2;
  • внутридневная торговля (M30-H4) — для отсеивания незначительных колебаний рекомендуется минимальное значение ZeroSize 3;
  • свинг-трейдинг и позиционная торговля (дневной таймфрейм и выше) — ориентируйтесь прежде всего на ZeroSize 4 (ключевые психологические уровни) для выявления значимых разворотов тренда.
Стиль торговли
Таймфреймы
Рекомендуемое минимальное значение ZeroSize
Скальпинг
M1-M15
2 (например, 1,1020)
Внутридневная торговля
M30-H4
3 (например, 1,1000)
Свинг-трейдинг и инвестирование
Дневной и недельный
4+ (например, 1,0000)


Пользовательский алгоритм — больше, чем простая проверка по модулю

Простая проверка по модулю (price % step == 0) позволяет определить, является ли число круглым, но не показывает, насколько оно "круглое" по сравнению с другими. Чтобы преодолеть это ограничение, я разработал новый алгоритм разбора строк.

Зачем преобразовывать в строку?

Вычисления с плавающей точкой в языке MQL5 иногда могут приводить к погрешностям (например, 1,1000 может храниться как 1,100000000001). Преобразование цены в строку позволяет рассматривать ее как уникальную "метку" и напрямую анализировать конец строки именно в том виде, в каком цену видит трейдер на экране. Этот подход обеспечивает надежную и точную количественную оценку силы уровня.

BTCUSD Weekly chart showing RoundLevel Pro hierarchy and precise reversals.

Рис. 3. Реакции цены BTCUSD институционального масштаба у крупных круглых уровней (ZeroSize 4-5)


Техническая реализация — основная логика на языке MQL5

В основе этого индикатора лежит функция GetZeroCount. Она просматривает строку цены с конца и подсчитывает последовательные конечные нули. Это значение напрямую связано с психологической значимостью уровня и его значимостью для институциональных участников.

Вычислительное преимущество анализа строк

В стандартных математических подходах часто используется оператор % (взятие по модулю). Однако в языке MQL5 арифметика с плавающей точкой может быть недетерминированной из-за особенностей стандарта IEEE-754. Например, цена 1,2000 может во внутреннем представлении иметь вид 1,19999999999. Проверка этого значения по модулю не распознала бы его как круглое число. С помощью DoubleToString() и StringSubstr() индикатор анализирует цену в том виде, в каком она отображается в интерфейсе терминала, сокращая число ложноотрицательных результатов при обнаружении уровней.

Визуализация и удобство использования (UX)

Чтобы уменьшить загромождение графика, индикатор использует динамическое масштабирование. Крупные уровни (ZeroSize 4) отображаются выше в порядке наложения и более толстыми линиями, поэтому остаются видимыми при уменьшении масштаба. Линии второстепенных уровней автоматически становятся менее яркими или пунктирными, чтобы трейдер сосредоточился на наиболее важных пулах ликвидности. Такая иерархическая визуализация необходима для сохранения "ритма торговли" и снижения когнитивной нагрузки во время сессий с высокой волатильностью.

Почему разбор строк лучше арифметики по модулю

В языке MQL5 точность представления чисел с плавающей точкой может вызывать сложности. При вычислении, например MathMod(price, 0.01), результат может не совпасть с точным нулем из-за особенностей хранения десятичных чисел в компьютере. Это приводит к пропуску уровней. Сначала преобразовав цену в строку (DoubleToString), мы, по сути, "замораживаем" цену в виде метки. Анализ конца строки обеспечивает единообразное обнаружение отображаемых конечных нулей — именно тех, которые трейдер видит на экране. Это подход к техническому анализу по принципу "что видишь, то и получаешь" (WYSIWYG).

Логика алгоритма (пошагово):

  1. нормализация — привести исходную цену к шагу SYMBOL_TRADE_TICK_SIZE, чтобы анализировать цену, по которой действительно можно торговать;
  2. преобразование в строку — преобразовать значение double с помощью DoubleToString, чтобы обойти неточности вычислений с плавающей точкой IEEE-754;
  3. извлечение цифр — удалить десятичный разделитель, чтобы рассматривать цену как непрерывную последовательность цифр;
  4. анализ конечных нулей — просмотреть строку с конца и подсчитать последовательные нули (метрика ZeroSize);
  5. фильтрация — применить порог minZero, чтобы определить, следует ли отображать уровень на графике.

    Входные параметры:

    input int      InpMinZeroCount = 3;         // Minimum Zeros (Strength) input color    InpMajorColor   = clrRed;    // Major Level Color input color    InpMinorColor   = clrGray;   // Minor Level Color

    Отрисовка уровня:

    void CreateRoundLevel(string name, double price, int strength)   {    if(ObjectFind(0, name) < 0)      {       ObjectCreate(0, name, OBJ_HLINE, 0, 0, price);       ObjectSetInteger(0, name, OBJPROP_COLOR, (strength >= 4) ? InpMajorColor : InpMinorColor);       ObjectSetInteger(0, name, OBJPROP_WIDTH, (strength >= 4) ? 2 : 1);       ObjectSetString(0, name, OBJPROP_TEXT, "ZeroSize: " + (string)strength);      }   }

    Для получения максимальной и минимальной цены:

    // Example of limiting the range to avoid CPU overhead double topPrice = ChartGetDouble(0, CHART_PRICE_MAX); double bottomPrice = ChartGetDouble(0, CHART_PRICE_MIN); //logic to loop between these two prices only

    Основная функция:

    //+------------------------------------------------------------------+ //| GetZeroCount: Analyzes price to determine institutional strength | //+------------------------------------------------------------------+ int GetZeroCount(double price)   { // 1. Align the price with the symbol's tick size to handle precision artifacts    double tickSize = SymbolInfoDouble(_Symbol, SYMBOL_TRADE_TICK_SIZE);    if(tickSize > 0)       price = MathRound(price / tickSize) * tickSize; // 2. Convert to string with the symbol's specific digits    string priceStr = DoubleToString(price, _Digits); // 3. Remove decimal point to analyze the sequence of digits    StringReplace(priceStr, ".", "");    StringReplace(priceStr, ",", "");    int zeroCount = 0;    int len = StringLen(priceStr); // 4. Count trailing zeros from right to left    for(int i = len - 1; i >= 0; i--)      {       if(StringSubstr(priceStr, i, 1) == "0")          zeroCount++;       else          break;      }    return zeroCount;   }

    Фрагмент OnCalculate:

    //+------------------------------------------------------------------+ //| Custom indicator iteration function                              | //+------------------------------------------------------------------+ int OnCalculate(const int rates_total,                 const int prev_calculated,                 const datetime &time[],                 const double &open[],                 const double &high[],                 const double &low[],                 const double &close[],                 const long &tick_volume[],                 const long &volume[],                 const int &spread[])   { //--- For educational purposes, we check only the last known price    double currentPrice = iClose(_Symbol, _Period, 0);    int rank = GetZeroCount(currentPrice);    if(rank >= InpMinZeroCount)      {       //--- Drawing the level on the chart       CreateRoundLevel("Level_" + (string)currentPrice, currentPrice, rank);       Print("Price is near an institutional level of strength: ", rank);      }    return(rates_total);   }

    Примеры результатов GetZeroCount:

    • GetZeroCount(1.10000) -> returns 4
    • GetZeroCount(1.10500) -> returns 2
    • GetZeroCount(70000) -> returns 4

    Полученное целочисленное значение силы используется для динамического выбора правил отображения на графике MetaTrader 5:

    ZeroSize 4+ — толстые сплошные линии (крупные институциональные уровни);

    ZeroSize 3 — линии средней толщины (ликвидность банковского уровня);

    ZeroSize 2 — тонкие или пунктирные линии (зоны ценового скопления для внутридневной торговли).

    Настройка и параметры индикатора: чтобы обеспечить максимальную гибкость для разных стилей торговли, в индикаторе круглых уровней предусмотрены настраиваемые параметры. В таблице ниже подробно описаны входные параметры, доступные в версии для MetaTrader 5.

    Параметр
    Тип
    Описание
    InpMinZeroCount
    int
    Минимальное значение ZeroSize для отображения (0-5)
    InpMajorColor
    color
    Цвет крупного уровня
    InpMinorColor
    color
    Цвет второстепенного уровня


    Примеры из практики — универсальное применение для разных активов

    По-настоящему устойчивый алгоритм должен работать согласованно с разными классами активов, подтверждая универсальный характер психологического ценообразования.

    Чувствительность золота

    Золото по своей природе чувствительно к круглым уровням. Обратите внимание на рис. 4: крупные максимумы и минимумы формируются точно на линиях круглых уровней (например, 2 000,00 или 2 500,00). При этом часто возникают четкие отбои с тенями свечей, указывающие на сильное предложение или спрос институциональных участников в этих точках.

    XAUUSD Weekly chart showing RoundLevel Pro hierarchy and precise reversals.

    Рис. 4. Чувствительность золота к круглым уровням (ZeroSize 2 и 3)

    Валютные пары рынка Forex и второстепенные кросс-пары

    Как видно на предыдущих изображениях (рис. 1-3), цена основных и второстепенных валютных пар устойчиво реагирует на эти зоны. Это подтверждает применимость индикатора круглых уровней для всех валютных трейдеров.

    Обработка граничных случаев — от золота до биткоина

    Одна из главных сложностей обнаружения круглых уровней — различия в представлении цен разных активов. Устойчивый алгоритм должен без сбоев обрабатывать разные конфигурации Digits и TickSize:

    • активы с высокой ценой (биткоин и индексы) — у такого актива, как BTCUSD с ценой 70 000, конечные нули находятся слева от десятичного разделителя; наш алгоритм разбора строк рассматривает все строковое представление цены как последовательность и распознает 70 000 как уровень ZeroSize 4;

    • драгоценные металлы и пары с JPY — символы с двумя или тремя знаками после запятой (например, GOLD или USDJPY) обрабатываются с помощью функции DoubleToString(price, _Digits); это обеспечивает распознавание уровня вроде 150,00 с силой 2, психологически эквивалентной ZeroSize 4 на валютной паре с пятизначными котировками (например, 1,1000);

    • артефакты вычислений с плавающей точкой — нормализуя цену по SYMBOL_TRADE_TICK_SIZE перед преобразованием, мы устраняем погрешности IEEE-754 (когда 1,2000 может храниться как 1,19999...), благодаря чему индикатор анализирует именно то, что трейдер видит в интерфейсе терминала.


    Разработка торговой стратегии — ключевая роль совпадения факторов

    Индикатор круглых уровней — это не просто наглядное пособие, а полноценная система принятия решений. Он показывает зоны с высокой вероятностью отработки, но не определяет момент входа. Для полноценной стратегии нужно сочетать эти ценовые зоны с сигналами перекупленности и перепроданности таких индикаторов, как RSI или стохастический осциллятор (осцилляторы с ограниченным диапазоном).

    Стратегия торговли на ослаблении моментума

    Эта стратегия нацелена на развороты тренда: она выявляет моменты "насыщения" моментума (перепроданности или перекупленности), совпадающие с пересечением ценой важного институционального круглого уровня (ZeroSize 3+).

    Профессиональные советы по торговле на круглых уровнях

    • Буферная зона — не размещайте ордера точно на линии. Институциональные участники часто создают "буферную зону" шириной 5-10 пипсов вокруг важного уровня, чтобы заманить в ловушку трейдеров, входящих слишком рано.

    • Новостные события — при выходе важных новостей (например, NFP) круглые уровни часто становятся конечной целью "охоты за стопами" перед началом основного движения.

    • Особенности валютных пар: для пар с JPY (три знака после запятой) ZeroSize 2 по силе эквивалентен ZeroSize 4 на парах с пятизначными котировками. Индикатор автоматически учитывает эти особенности символов.

    XAUUSD M1 chart showing RoundLevel Pro hierarchy and precise reversals.

    Рис. 5. Отбой цены от важного круглого уровня на рынке золота — идеальная ситуация для стратегии торговли на ослаблении моментума

    На этом графике золота M1 цена приблизилась к уровню ZeroSize 3 во время сессии с высокой волатильностью и отскочила, сформировав четкий пин-бар, что подтвердило нашу теорию.

    Правила совершения сделок:

    1. выявление зоны — цена должна приближаться к уровню ZeroSize 3 или 4;
    2. проверка моментума — осциллятор с ограниченным диапазоном (например, RSI) должен достигнуть экстремальных значений (например, >70 при приближении цены к сопротивлению);
    3. свечное подтверждение — ищите отбой с тенью свечи (пин-бар) непосредственно на линии (рис. 5);
    4. вход — открывайте позицию при закрытии подтверждающей свечи.

      Обоснование: экстремальный моментум в сочетании с институциональной ликвидностью на круглом уровне повышает вероятность быстрого разворота.


      Часто задаваемые вопросы (FAQ)

      Вопрос 1 — почему круглые уровни эффективнее на старших таймфреймах?

      Ответ: старшие таймфреймы, например дневной и месячный, отражают решения долгосрочных институциональных инвесторов. Круглый уровень на минутном графике может вызвать отскок на два пипса, а на месячном графике он представляет важную структурную опорную точку, способную привести к движению на сотни пипсов.

      Вопрос 2 — работает ли логика ZeroSize для пар с японской иеной?

      Ответ: да. Алгоритм разработан так, чтобы не зависеть от конкретного символа. На парах с иеной (три знака после запятой) цена вроде 150,00 будет распознана как ZeroSize 2, психологически эквивалентный ZeroSize 4 на парах с пятизначными котировками. Индикатор выполняет эти преобразования автоматически.

      Вопрос 3 — можно ли использовать круглые уровни при торговле криптовалютами?

      Ответ: конечно. На самом деле биткоин (BTCUSD) чрезвычайно чувствителен к крупным круглым уровням, например 40 000, 50 000 и 100 000. Алгоритм разбора строк подсчитывает нули независимо от масштаба цены актива.

      Вопрос 4 — как избежать ложных пробоев на этих уровнях?

      Ответ: никогда не торгуйте от уровня без дополнительных подтверждений. Всегда ищите совпадение факторов (как обсуждалось в разделе 1). Если круглый уровень совпадает с уровнем коррекции Фибоначчи или предыдущим дневным максимумом, вероятность ложного пробоя значительно снижается.

      Вопрос 5 — требует ли этот индикатор значительных ресурсов процессора?

      Ответ: нет. Цикл обрабатывает только текущую цену на текущем графике, поэтому задержка индикатора близка к нулю и он подходит для VPS с небольшими вычислительными ресурсами.


      Управление рисками и расчет размера позиции

      Торговля вблизи зон высокой ликвидности требует дисциплинированного подхода к управлению рисками. Поскольку институциональные участники часто охотятся за ликвидностью сразу за крупными круглыми уровнями, мы рекомендуем следующее:

      • Отступ в 10 пипсов: размещайте стоп-лосс на расстоянии не менее 10-15 пипсов от уровней ZeroSize 4, учитывая возможные всплески волатильности и охоту за ликвидностью вблизи ключевых психологических отметок.
      • Постепенный набор позиции: рассмотрите возможность открыть половину позиции при первом касании уровня, а вторую половину — после успешного ретеста.
      • Трейлинг-стопы: после отхода цены от крупного круглого уровня ее движение часто усиливается. Используйте трейлинг-стоп, чтобы захватить все движение, вызванное активностью институциональных участников.


      Заключение — основа для профессиональной торговли по уровням поддержки и сопротивления

      Мы превратили наблюдение о реакции цены на круглые уровни в воспроизводимый план технической реализации и торговли. Мы объяснили, почему проверки по модулю дают сбои и как значимость уровня меняется в зависимости от таймфрейма. Затем мы ввели ZeroSize как формальную меру силы на основе нормализованной цены и количества конечных нулей в ее строковом представлении, чтобы обеспечить детерминированное обнаружение в языке MQL5.

      К числу практических результатов относятся:

      • функция GetZeroCount, сокращающая число ложноотрицательных результатов из-за вычислений с плавающей точкой с помощью нормализации по SYMBOL_TRADE_TICK_SIZE и использования DoubleToString;
      • настраиваемые фильтры (minZero и связанные входные параметры), согласованные со стилями торговли и таймфреймами;
      • правила визуализации крупных и второстепенных уровней;
      • базовая проверяемая торговая система, объединяющая ценовой уровень, моментум и подтверждение, а также правила управления рисками (отступ, постепенный набор позиции, трейлинг-стопы).

      Этот набор можно интегрировать в индикаторы, системы алертов или советники и проверить на разных символах и конфигурациях Digits/TickSize. В дальнейшем будут добавлены сканирование нескольких символов и алерты в реальном времени. Но текущая реализация уже дает надежный и проверяемый метод обнаружения институциональных скоплений ликвидности и торговли по ним без ошибок вычислений с плавающей точкой и форматирования, характерных для упрощенных подходов.

      Для дальнейшего изучения и взаимодействия с сообществом:

      • исходный код (MQL5) — основная логика реализации приведена в приложенном к статье файле (RoundLevel_Base.mq5) для учебных целей;
      • дальнейшее развитие — в будущих обновлениях я планирую усовершенствовать алгоритм, добавив сканирование нескольких символов и систему алертов в реальном времени.

      Перевод с английского произведен MetaQuotes Ltd.
      Оригинальная статья: https://www.mql5.com/en/articles/21876

      Прикрепленные файлы |
      Нейросети в трейдинге: Habi — быстрое принятие решений без сложного планирования Нейросети в трейдинге: Habi — быстрое принятие решений без сложного планирования
      Адаптируем фреймворк Habi для алгоритмической торговли на финансовых рынках. Его основной принцип — перенос опыта сложного планирования в генеративную политику для быстрого принятия решений. Модель учитывает рыночные данные и состояние счёта, формирует варианты управления торговой позицией, а Critic оценивает их потенциальные результаты. Для обучения используются эталонные действия Oracul. Рассматриваем архитектуру торговой адаптации и реализацию OpenCL-кернелов пакетного семплирования и обратного распространения градиентов.
      Создание системы торговой аналитики (Часть 1): Основы и архитектура системы Создание системы торговой аналитики (Часть 1): Основы и архитектура системы
      Мы проектируем простой внешний пайплайн аналитики торговых операций для MetaTrader 5 и реализуем его бэкенд на Python с использованием Flask и SQLite. В статье определяются архитектура, модель данных и API с поддержкой версий, а также показано, как настроить среду, инициализировать базу данных и локально запустить сервер. В результате вы получаете понятную основу для сбора записей о закрытых торговых операциях из MetaTrader 5 и их хранения для последующего анализа.
      Создание традиционного индикатора Ренко с наложением на график в MQL5 Создание традиционного индикатора Ренко с наложением на график в MQL5
      Создайте в MQL5 традиционный индикатор Ренко, который преобразует цены закрытия свечей в кирпичи фиксированного размера и отображает их на основном графике. Мы рассчитываем движение от цены закрытия последнего кирпича, создаем новые кирпичи заданного пользователем размера, подтверждаем развороты с помощью правила двух кирпичей, храним цены закрытия кирпичей в динамическом массиве и отображаем прямоугольники для визуализации тренда в режиме реального времени.
      Алгоритм оптимизации, вдохновлённый охотой лисы —  Fox-inspired Optimization Algorithm (FOX) Алгоритм оптимизации, вдохновлённый охотой лисы — Fox-inspired Optimization Algorithm (FOX)
      Разбираем FOX (Fox-inspired Optimization Algorithm): реализуем алгоритм в MQL5, детально проверяем ветви "прыжка" и "блуждания" и показываем, как притяжение к нулю и фиксированный масштаб шага мешают поиску в торговых диапазонах. Пошагово измеряем вклад каждого механизма на тестовом стенде и объясняем расхождения формул и кода. В конце — готовый к использованию класс C_AO_FOX и исправленная версия с шагом в долях диапазона.