От новичка до эксперта: Разработка стратегии торговли по зонам ликвидности
Содержание
Введение
Сегодня мы сосредоточимся на моделировании советника (EA), основанного на зонах ликвидности. В ходе предыдущих обсуждений мы сосредоточились на выявлении и проверке этих зон, и результаты были как обнадеживающими, так и многообещающими. Однако остается одна важная проблема: автоматизация торгового процесса. Этого можно достичь, только переведя стратегию в исполняемую логику с использованием MQL5, включая надежные правила исполнения сделок и управления рисками.
Чтобы сделать это эффективно, мы сначала выработаем четкое концептуальное понимание стратегии. Как только логика будет четко определена, мы приступим к ее реализации в коде.
Понимание стратегии
В ходе нашего анализа мы установили, что зона ликвидности часто может быть представлена одной свечой. Такая свеча обычно появляется после периода ценовой паузы или консолидации и отражает ликвидность, которая формировалась с течением времени или на более младших таймфреймах. Именно такое поведение и создает структурную модель, с которой мы работаем в настоящем исследовании.
Для обеспечения ясности и доступности мы намеренно применяем упрощенный подход. Вместо того чтобы полагаться на сложные многобарные образования, мы определяем наши условия, используя минимальную информацию о ценах. Это позволяет сосредоточиться на основных механизмах стратегии, одновременно упрощая первоначальную реализацию в коде и облегчая проверку.
Цель этой стратегии состоит в том, чтобы вернуть цену к определенной структуре ликвидности (см. рис. 1 ниже) и сформировать позиции из этой области, в конечном счете нацелившись на самый последний максимум или минимум колебаний, в зависимости от того, является ли установка бычьей или медвежьей. Хотя концепция повторного тестирования занимает центральное место в этой модели, важно также признать, что она стала общепринятой и широко изучаемой идеей. В результате такие уровни становятся все более уязвимыми для манипуляций. Участники рынка со значительно большим капиталом могут подтолкнуть цены за пределы очевидных границ, активируя стоп-лоссы и вытесняя более слабые позиции с рынка до того, как произойдет запланированное движение.

Рис.1. Возврат колебания B-C для тестирования зоны ликвидности
По этой причине к управлению рисками нельзя относиться как к чему-то второстепенному. Оно должно быть неотъемлемой частью как разработки стратегии, так и ее алгоритмического исполнения. То, как советник определяет риск, устанавливает стоп-лоссы и управляет рисками, так же важно, как и то, как он определяет допустимые торговые настройки.
Также важно понимать, что не каждая настройка будет успешной. Ни одна сделка не гарантирует прибыльного исхода. Вместо этого эффективность повышается с течением времени за счет агрегирования результатов. Именно этот совокупный результат, измеряемый по достаточно большой выборке сделок, в конечном счете определяет, является ли стратегия прибыльной или убыточной.
После создания этой основы следующий раздел будет посвящен переводу стратегии в код на MQL5. После реализации приступим к тестированию и оценке его поведения в реальных рыночных условиях.
Реализация
Прежде чем реализовать торговую логику, создадим новый проект советника в MetaEditor с помощью мастера MQL5 Wizard. Этот мастер автоматически создает шаблон по умолчанию, включающий в себя обработчики событий и код-заполнитель. Для целей настоящей статьи мы удаляем всю автоматически генерируемую логику и оставляем только раздел метаданных, как показано ниже.
Код:
//+------------------------------------------------------------------+ //| Single_Candle_Liquidity_Trader.mq5 | //| Copyright 2025, Clemence Benjamin | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright "Copyright 2025, Clemence Benjamin" #property link "https://www.mql5.com" #property version "1.00"
Это позволяет сосредоточиться на понимании и поэтапном построении стратегии по мере ее реализации, описанной в следующих разделах. Целесообразно ввести код вручную, чтобы ознакомиться со структурой, однако для удобства тех, кто предпочитает не вводить все вручную, во вложениях в конце статьи приведен полный исходный файл.
Как только метаданные и входные данные советника будут определены, мы включим торговую библиотеку, отвечающую за исполнение всех ордеров. Вместо того чтобы работать с низкоуровневыми торговыми функциями, мы полагаемся на класс CTrade, который обеспечивает более безопасный и структурированный интерфейс.
Код:
#include <Trade/Trade.mqh> CTrade trade;
Объявив единый глобальный объект CTrade, мы централизуем все торговые операции — отложенные ордера, стоп—лоссы, тейк-профиты и назначение магических чисел, - что делает код более понятным и простым в обслуживании.
Объявление вводных данных и элементов управления стратегией
Прежде чем реализовать какую-либо логику исполнения, сначала объявим вводные данные. Это осознанный шаг. Вводные данные определяют внешнее поведение советника и позволяют трейдерам адаптировать стратегию, не обращаясь к исходному коду. Раскрывая эти параметры, мы отделяем логику стратегии от пользовательского контроля, что является ключевым принципом в разработке профессиональных советников.
Код:
input double LotSize = 0.10; input int MaxSpreadPoints = 30; input bool AllowBuy = true; input bool AllowSell = true; input double RatioMultiplier = 3.0; input double SL_Offset_Points = 20; input int PendingExpiryHours = 24; input ulong MagicNumber = 777333;
Здесь мы объявляем каждый параметр с четким функциональным назначением:
- Мы объявляем LotSize для контроля за фиксированным объемом сделки по каждому отложенному ордеру. Это позволяет прогнозировать размер риска и избежать динамического расчета лота на данном этапе.
- Внедряем MaxSpreadPoints, чтобы предотвратить размещение ордеров в неблагоприятных условиях ликвидности, таких как всплески новостей или колебания рынка.
- Используем AllowBuy и AllowSell в качестве фильтров направления, предоставляя трейдеру возможность отключить одну сторону рынка без изменения логики.
- Аналогичным образом, определяем RatioMultiplier как основной структурный элемент управления стратегией. Эти вводные данные определяют, насколько больше должна быть свеча на импульсе по сравнению со свечой на основе, что позволяет настроить чувствительность обнаружения сжатия ликвидности.
- Добавляем SL_Offset_Points, чтобы намеренно вывести стоп-лосс за пределы зоны ликвидности, снижая вероятность его удаления в результате краткосрочных манипуляций или ложных пробоев.
- Включаем PendingExpiryHours в качестве временного средства контроля рисков. Если цена не возвращается в зону ликвидности в течение этого периода времени, установка становится недействительной.
- Наконец, объявляем, что MagicNumber будет уникально помечать все ордера и позиции, открытые этим советником, обеспечивая четкое разделение от других стратегий, работающих на том же счете.
Структурируя вводные данные таким образом, мы делаем советник гибким, тестируемым и удобным в использовании, сохраняя при этом внутреннюю логику.
Объявление глобальных переменных
Далее объявляем глобальные переменные, которые должны сохраняться на всех тиках. В данной стратегии мы намеренно сводим к минимуму глобальное состояние.
Код:
datetime lastBarTime = 0;
Эта переменная используется исключительно для определения открытия новой свечи. Контроль частоты исполнения имеет решающее значение в автоматизированных системах для предотвращения дублирования сделок и несогласованных результатов тестирования на истории.
Определение открытия новой свечи
Прежде чем оценивать какую-либо торговую логику, мы применяем правило "одна свеча - одно исполнение". Это гарантирует, что советник реагирует только один раз на каждую завершенную свечу, независимо от частоты тиков.
Код:
bool IsNewBar() { datetime currentBar = iTime(_Symbol, _Period, 0); if(currentBar != lastBarTime) { lastBarTime = currentBar; return true; } return false; }
Здесь мы сравниваем временную метку текущей свечи с последней обработанной. Когда формируется новая свеча, обновляем сохраненное время и разрешаем продолжить исполнение.
Этот механизм гарантирует:
- Логика без перекраски
- Стабильное поведение тестировщика стратегий
- Предсказуемые сроки расположения ордеров
Измерение диапазона свечей
В основе этой стратегии лежит сравнение по диапазону, а не по телам свечей или индикаторам. Для этого мы вводим вспомогательную функцию, возвращающую полный диапазон максимума и минимума свечи.
Код:
double CandleRange(int index) { return MathAbs(iHigh(_Symbol,_Period,index) - iLow(_Symbol,_Period,index)); }
Инкапсуляция этого расчета улучшает читаемость и позволяет последовательно использовать логику во всем советнике.
Многоуровневый ввод ликвидности для настроек сделок на покупку
Вместо того чтобы выполнять вход по единой цене, мы распределяем лимитные ордера по всему базовому диапазону свечей. Так моделируется типичный процесс поглощения ликвидности рынком.
Код:
void PlaceBuyLimits(double highB, double lowB, double sl, double tp, datetime expiry) { double mid = (highB + lowB) / 2.0; trade.BuyLimit(LotSize, highB, _Symbol, sl, tp, ORDER_TIME_SPECIFIED, expiry); trade.BuyLimit(LotSize, mid, _Symbol, sl, tp, ORDER_TIME_SPECIFIED, expiry); trade.BuyLimit(LotSize, lowB, _Symbol, sl, tp, ORDER_TIME_SPECIFIED, expiry); }
Размещая ордера на максимуме, середине и минимуме свечи ликвидности, мы:
- Улучшаем среднюю цену входа
- Уменьшаем зависимость от точного тайминга
- Фиксируем частичные заполнения даже при небольших откатах
Многоуровневый ввод ликвидности для настроек сделок на продажу
Для медвежьих условий применяем ту же логику симметрично.
Код:
void PlaceSellLimits(double highB, double lowB, double sl, double tp, datetime expiry) { double mid = (highB + lowB) / 2.0; trade.SellLimit(LotSize, highB, _Symbol, sl, tp, ORDER_TIME_SPECIFIED, expiry); trade.SellLimit(LotSize, mid, _Symbol, sl, tp, ORDER_TIME_SPECIFIED, expiry); trade.SellLimit(LotSize, lowB, _Symbol, sl, tp, ORDER_TIME_SPECIFIED, expiry); }
Такая симметрия обеспечивает согласованное поведение в обоих направлениях рынка и упрощает проверку и оптимизацию.
Основной цикл исполнения: OnTick()
Вся логика стратегии согласована внутри функции OnTick(). Именно здесь оцениваются условия, проверяется риск и размещаются ордера.
Код:
void OnTick() { if(!IsNewBar()) return;
Немедленно приводим в исполнение новый бар. Если новая свеча не сформировалась, советник завершает работу без дальнейшей обработки.
Защита от спредов и идентификация сделок
Прежде чем оценить структуру рынка, проверяем торговые условия.
Код:
if(SymbolInfoInteger(_Symbol, SYMBOL_SPREAD) > MaxSpreadPoints) return; trade.SetExpertMagicNumber(MagicNumber);
Это предотвращает входы при неблагоприятных спредах и гарантирует уникальную идентификацию всех сделок.
Определение ролей свечей
Теперь явно определяем, какие свечи участвуют в модели.
Код:
int A = 1; // Impulse candle (closed) int B = 2; // Base candle
- Свеча B представляет собой сжатие ликвидности.
- Свеча А представляет собой импульсное расширение.
Формирующаяся в настоящее время свеча (индекс 0) намеренно игнорируется.
Применение фильтра соотношения свечей
Это структурная основа стратегии.
Код:
double rangeA = CandleRange(A); double rangeB = CandleRange(B); if(rangeB > rangeA / RatioMultiplier) return;
Здесь мы следим за тем, чтобы базовая свеча была значительно меньше импульсной. Чувствительность этого условия полностью контролирует RatioMultiplier.
Подтверждение направления
Теперь подтверждаем, что обе свечи совпадают по направлению.
Код:
double openA = iOpen(_Symbol,_Period,A); double closeA = iClose(_Symbol,_Period,A); double openB = iOpen(_Symbol,_Period,B); double closeB = iClose(_Symbol,_Period,B);
Этот шаг гарантирует, что мы торгуем на продолжение, а не на истощение.
Смещение стоп-лосса и истечение срока действия ордера
Чтобы учесть манипуляции и ложные прорывы, вводим настраиваемое смещение стопа и аннулирование по времени.
Код:
double point = SymbolInfoDouble(_Symbol, SYMBOL_POINT); double offset = SL_Offset_Points * point; datetime expiry = TimeCurrent() + PendingExpiryHours * 3600;
Эти два параметра работают совместно, чтобы контролировать риск как в ценовом, так и во временном измерениях.
Исполнение бычьих настроек
Код:
if(AllowBuy && closeA > openA && closeB > openB) { double sl = lowB - offset; double tp = highA; PlaceBuyLimits(highB, lowB, sl, tp, expiry); }
Устанавливаем лимиты на покупку внутри зоны ликвидности, защищаемся за ее пределами и нацеливаемся на импульсный максимум.
Исполнение медвежьих настроек
Код:
if(AllowSell && closeA < openA && closeB < openB) { double sl = highB + offset; double tp = lowA; PlaceSellLimits(highB, lowB, sl, tp, expiry); }
Логика отражает бычий сценарий, сохраняя структурную последовательность.
На данном этапе мы полностью смоделировали стратегию ликвидности с использованием одной свечи, от определения структуры до исполнения и контроля рисков. Система намеренно избегает индикаторов и концентрируется исключительно на поведении цен, ликвидности и дисциплинированном исполнении.
В следующем разделе мы можем перейти к методологии тестирования, чувствительности к параметрам и интерпретации результатов.
Тестирование
Здесь я представляю первоначальные результаты тестирования, полученные при запуске советника в тестере стратегий MetaTrader 5. Для читателей, которые плохо знакомы с платформой, первым шагом будет поиск советника, связанного с этим проектом, в окне Navigator в каталоге Experts. Найдя советник, щелкните на нём правой кнопкой мыши и выберите в контекстном меню пункт Test. Это действие запускает тестер стратегий, в котором можно выполнять различные типы тестов.
Прежде чем рассматривать какую-либо форму оптимизации, наша основная цель - убедиться, что советник работает механически и последовательно в соответствии с предполагаемыми правилами стратегии. На данном этапе прибыльность не является нашей основной целью; вместо этого мы хотим убедиться, что логика корректно переведена из концепции в код и что ордера размещаются, управляются и срок их действия истекает точно так, как было задумано. Только после завершения этого этапа проверки, переходим к оптимизации и уточнению параметров.
Стоит отметить, что некоторые стратегии терпят неудачу на этой ранней стадии. В некоторых случаях, даже после генетической оптимизации, стратегия может оказаться структурно несостоятельной и, следовательно, непригодной для дальнейшего развития. Раннее выявление таких результатов экономит время и предотвращает ненужное переобучение.
Приведенный ниже скриншот демонстрирует стратегию в действии и подтверждает, что концептуальная модель была успешно воплощена в жизнь. Несмотря на то, что прежде чем систему можно будет классифицировать как прибыльную торговую модель, требуется дополнительная работа, представленные ниже в графическом виде результаты оптимизации уже указывают на многообещающие области эффективности. При дальнейшей фильтрации и уточнении, направленных на устранение негативных последствий, эти результаты дают обнадеживающие сигналы для дальнейшего совершенствования.

Рис. 2. Тестирование
Заключение
В этой статье мы продемонстрировали, как паттерн ликвидности с одной свечой, состоящий из базовой свечи и импульсной свечи, может быть преобразован из концептуальной торговой идеи в полностью автоматизированную торговую модель с использованием MQL5. Полученный в результате советник выполняет правила стратегии как задумано: отложенные ордера выставляются в соответствии с определенной структурой, некоторые сделки срабатывают и закрываются с прибылью, другие приводят к убыткам, а некоторые ордера остаются неисполненными.
Визуальное тестирование на протяжении длительного исторического периода (с 2005 года по настоящее время) показывает, что не все выявленные зоны ликвидности пересматриваются по цене. В некоторых случаях повторное тестирование может проводиться с большой задержкой или не проводиться вообще. Чтобы управляться с таким поведением, реализован основанный на времени механизм истечения срока действия, который автоматически удаляет отложенные ордера по истечении заданного срока действия, не позволяя устаревшим торговым идеям оставаться активными на неопределенный срок.
С образовательной точки зрения, эта работа иллюстрирует процесс преобразования абстрактных торговых концепций в точную логику исполнения, основанную на правилах. Представленный советник предназначен исключительно для учебных и исследовательских целей и должен быть протестирован на демо-счете. Несколько областей остаются открытыми для дальнейшего развития, включая торговые фильтры на основе сессий, дополнительные фильтры рыночной конъюнктуры и интеграцию с дополнительными аналитическими инструментами.
В целом, данное исследование подтверждает, что торговые стратегии могут быть автоматизированы, как только их условия четко определены и выражены программно. Надеемся, что данная статья даст практическую информацию как о разработке стратегии, так и о реализации советника.
Будем рады обратной связи и вашим дополнениям в разделе комментариев ниже.
Основные уроки и связанные с ними приложения представлены в следующих разделах.
Основные уроки
| Основные уроки | Описание: |
|---|---|
| Ликвидность по одной свече: | Ликвидность не всегда требует сложной структуры из нескольких баров; одна свеча может содержать достаточное количество ордеров на консолидацию и оставшихся ордеров для определения допустимой зоны ликвидности. |
| Приоритет диапазона над телом | Измерение полного диапазона от максимума до минимума дает более объективное представление о сжатии волатильности, чем только размер тела свечи. |
| Коэффициент импульс-основа: | Настраиваемое соотношение между импульсными и базовыми свечами превращает произвольную визуальную концепцию в точное и проверяемое условие торговли. |
| Логика закрытой свечи: | Оценка условий только на закрытых свечах исключает перерисовку и обеспечивает согласованность между тестированием на истории и реальным исполнением. |
| Входы с несколькими ограничениями: | Распределение отложенных ордеров по диапазону ликвидности повышает вероятность заполнения и среднее качество входа по сравнению с исполнением по единой цене. |
| Выравнивание направления: | Требование, чтобы как базовая свеча, так и импульсная свеча имели одинаковое смещение направления, помогает отфильтровать шум и усиливает настройки продолжения. |
| Структурные цели: | Использование экстремумов импульсных свечей в качестве целевых показателей прибыли привязывает выходы к реальной структуре рынка, а не к произвольным предположениям о прибыли. |
| Буферизация стоп-лосса: | Регулируемое смещение стоп-лосса учитывает снятия ликвидности и уменьшает преждевременные выходы, вызванные краткосрочными манипуляциями. |
| Контроль истечения срока действия ордера: | Отложенные ордера со временем теряют актуальность; применение тактики истечения срока действия гарантирует автоматическое удаление устаревших настроек с рынка. |
| Реальность размера выборки: | Прибыльность стратегии достигается только тогда, когда результаты суммируются по многим сделкам, а не по отдельным результатам. |
| Автоматизация на основе правил: | Четко определенные правила позволяют преобразовывать произвольные идеи в повторяемые модели исполнения с отсутствием эмоциональной составляющей. |
| Дисциплина исполнения: | Автоматизированное выполнение обеспечивает согласованность и предотвращает произвольное вмешательство, которое часто снижает эффективность. |
| Выборочная фильтрация: | Не каждая обнаруженная структура должна торговаться; такие фильтры, как ограничения спреда и правила сессий, повышают надежность. |
| Подтверждение стратегии: | Визуальное тестирование и оптимизация необходимы для подтверждения того, что стратегия работает механически так, как задумано. |
| Итеративная разработка: | Торговые стратегии развиваются благодаря постоянному тестированию, обратной связи и совершенствованию, а не разовой реализации. |
Вложения
| Название исходного файла | Версия | Описание: |
|---|---|---|
| Single_Candle_Liquidity_Trader.mq5 | 1.0 | Реализует советник Single Candle Liquidity Trader. Файл содержит полную логику стратегии для определения сжатия ликвидности с использованием базовой свечи, подтверждения продолжения импульса с помощью настраиваемого коэффициента диапазона и исполнения многоуровневых отложенных лимитных ордеров со встроенным управлением рисками, защитой от смещения стоп-лосса и истечением срока действия ордера. |
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/21129
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Разработка пользовательского индикатора матрицы эффективности торгового счёта
Знакомство с языком MQL5 (Часть 30): Освоение API и функции WebRequest в языке MQL5 (IV)
Знакомство с языком MQL5 (Часть 32): Освоение API и функции WebRequest в языке MQL5 (VI)
От новичка до эксперта: Подтверждение зон спроса и предложения через статистические данные
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования