English Deutsch 日本語
preview
Разработка инструментария для анализа Price Action (Часть 53): Тепловая карта плотности паттернов для выявления зон поддержки и сопротивления

Разработка инструментария для анализа Price Action (Часть 53): Тепловая карта плотности паттернов для выявления зон поддержки и сопротивления

MetaTrader 5Индикаторы |
196 2
Christian Benjamin
Christian Benjamin

Введение

В Части 51 нашей серии Разработка инструментария для анализа Price Action мы представили инструмент, который сканирует и выделяет свечные паттерны прямо на графике. Логика была простой, но мощной: введите имя паттерна, нажмите кнопку поиска, и инструмент найдет все исторические вхождения в заданном окне проверки, продолжит мониторинг и будет выдавать алерты в реальном времени всякий раз, когда паттерн сформируется снова. В то время внимание было сосредоточено исключительно на выявлении самих паттернов. Тогда я еще не понимал, что эти исторические сигналы могут служить гораздо более важной цели: показывать ценовые уровни, на которых рынок неоднократно реагировал. Со временем такие уровни часто ведут себя как поддержка (уровень, от которого цена обычно отскакивает вверх) или как сопротивление (уровень, от которого цена обычно разворачивается вниз). Знание этих уровней заранее позволяет трейдерам лучше прогнозировать поведение рынка, точнее выбирать моменты входа и выхода, стратегичнее размещать стопы и не торговать вслепую в зонах сильной реакции.

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

В этой статье мы представляем советник Pattern Density Heatmap – инструмент, который автоматически строит и визуализирует эти зоны по предыдущей свечной активности, отслеживает дальнейшее движение цены вокруг них и запускает алерты, когда цена приближается к каждой зоне. Сначала мы дадим обзор и объясним назначение инструмента, затем разберем реализацию на MQL5, рассмотрим результаты и в конце подведем итог.

Ниже приведено содержание, а далее – подробный разбор каждого раздела.



Обзор и назначение

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

Советник Pattern Density Heatmap построен именно на этой идее. Вместо того чтобы отмечать каждую формацию как отдельное событие, инструмент фиксирует и визуализирует ценовые зоны, где со временем скапливались несколько паттернов.

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

От распознавания паттернов к ценовой карте

Большинство инструментов распознавания паттернов просто отмечают отдельные свечи, на которых появился паттерн. Хотя такой подход "нашел – отметил" полезен, ему не хватает более глубокого рыночного контекста: он не показывает, как часто аналогичные реакции возникают на сопоставимых ценовых уровнях. Советник Pattern Density Heatmap устраняет этот пробел, сканируя большие массивы исторических данных – нередко тысячи баров – и записывая цену каждого обнаружения по нескольким типам паттернов. Эти исходные точки обнаружения затем агрегируются в дискретные ценовые бины и группируются в диапазоны, которые отражают уровни повторяющейся рыночной реакции.  

После группировки каждый бин оценивается по следующим критериям:

  • общее число обнаружений внутри нее;
  • давность этих обнаружений (при этом более свежие рыночные реакции получают больший вес).
Разнообразие паттернов усиливает значимость бина.

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

Почему эти зоны важны

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

  • Упреждение вместо реакции – зоны высокой плотности позволяют трейдерам готовиться заранее. Если цена приближается к такой зоне, можно заранее ожидать возможный отбой или пробой и соответственно планировать входы или выходы.  
  • Более точная постановка стоп-лосса – стоп-лоссы, размещенные за пределами сильных зон, с меньшей вероятностью будут задеты случайными всплесками волатильности, что повышает устойчивость сделки и доходность с поправкой на риск.  
  • Сочетание с другими инструментами – многие статистически сильные зоны естественно совпадают с другими аналитическими инструментами, такими как уровни коррекции Фибоначчи, скользящие средние, пивот-уровни или линии тренда. Такое совпадение, известное как "confluence", может значительно повысить вероятность того, что зона устоит.  
  • Объективность – поскольку эти зоны формируются на основе реальных исторических реакций, а не субъективно проведенных линий, они снижают предвзятость. Трейдеры с любым уровнем подготовки видят одни и те же уровни, основанные на данных.

Интеграция со старшим таймфреймом

Структура рынка многослойна, и значимые уровни, видимые на старших таймфреймах, иногда оказывают определяющее влияние на внутридневное движение. Тепловая карта может подтверждать свои зоны с помощью свечных паттернов, обнаруженных на старшем таймфрейме (HTF). Когда зона появляется и на рабочем таймфрейме, и в более широком контексте – например, когда дневной график подтверждает зону, видимую на H1, – она приобретает дополнительную значимость. Такое подтверждение по нескольким таймфреймам часто становится решающим фактором в профессиональном планировании сделок, указывая на зоны сильного скопления ордеров у разных групп участников рынка.

Применение в разных стилях торговли

Поскольку инструмент Pattern Density Heatmap гибко настраивается параметрами и не зависит от способа представления результата, он хорошо подходит для разных торговых подходов.

1. Свинг-трейдинг

  • Трейдеры, работающие на таймфреймах D1 или H4, могут просматривать широкие исторические диапазоны и выделять зоны среднесрочной рыночной реакции. Алерты могут предупреждать их за часы или даже дни до того, как цена приблизится к этим зонам, давая достаточно времени для планирования входов и выходов.

2. Скальпинг

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

3. Алгоритмическая торговля

  • Возможность инструмента экспортировать полные наборы данных об обнаружениях в виде CSV-файлов делает его особенно удобным для систематического моделирования. Разработчики количественных систем могут загружать экспортированные данные в статистические движки или модели машинного обучения, оценивать зоны, оптимизировать входы и встраивать их в логику автоматического исполнения.

Стиль Окно проверки (LookbackBars) Количество бинов (Bincount) Подтверждение на старших таймфреймах Преимущество
Swing Trader 2000 40 Да Планирование на несколько дней вперед
Scalper 500 25 Нет Внутридневные точки разворота
Algo Trader 3000 50 Да Интеграция в количественные системы

Вместо субъективности – точность, основанная на данных

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

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



Реализация на MQL5

Разработка инструмента Pattern Density Heatmap в виде советника на MQL5 начинается с последовательного проектирования: нужно определить настраиваемые пользователем параметры, подготовить среду выполнения, создать интерактивную панель управления на графике, реализовать движок сканирования паттернов и дополнить его подтверждением на старшем таймфрейме, алертами в реальном времени, точной визуализацией и опциональным экспортом данных. Исходный код отражает этот рабочий процесс в виде четко разделенных функций, которые работают как единое целое.

Процесс начинается в MetaEditor, который запускается из MetaTrader 5 с помощью клавиши F4. Мы создаем новый шаблон советника, называем его PatternDensityHeatmap.mq5, а затем задаем базовые свойства – copyright, link и version – с помощью директив #property. Эти метаданные важны для указания авторства, отслеживания версии и перехода читателей к обновлениям или странице автора на MQL5.com.

#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link      "https://www.mql5.com/ru/users/lynnchris"
#property version   "1.00"

Далее задаются входные параметры советника – именно их трейдер может изменить в окне свойств перед прикреплением советника к графику. Параметры разбиты на функциональные группы, чтобы пользователю было проще в них ориентироваться. К параметрам, связанным с обнаружением, относятся строка PatternName, которая может содержать несколько идентификаторов паттернов, разделенных запятыми (например, "hammer,doji"), целочисленный параметр LookbackBars, задающий количество исторических баров для поиска, и BinCount, определяющий, на сколько отдельных бинов по вертикали разбивается ценовой диапазон. MinHitsToShow задает пороговое число срабатываний паттерна, необходимое для того, чтобы бин считалась видимым.

input string PatternName  = "hammer,doji";
input int    LookbackBars = 2000;
input int    BinCount     = 40;
input int    MinHitsToShow= 2;

Параметры отображения и взвешивания задают внешний вид итоговых зон: от базового цвета ZoneBaseColor до ShowSeparateLayers, который позволяет выводить каждый тип паттерна отдельно. Сюда также можно отнести UseRecencyDecay и DecayHalfLife, применяющие статистическое затухающее взвешивание, при котором более свежие обнаружения получают больший приоритет.

input color ZoneBaseColor      = clrDodgerBlue;
input bool  ShowSeparateLayers = true;
input bool  UseRecencyDecay    = true;
input double DecayHalfLife     = 250.0;

Параметры старшего таймфрейма и алертов задают опциональное подтверждение по нескольким таймфреймам (HTF_Timeframe и HTF_ConfirmZones), чувствительность к приближению цены (ApproachThresholdPips) и время паузы между алертами (ZoneAlertCooldown).

input ENUM_TIMEFRAMES HTF_Timeframe = PERIOD_H1;
input bool HTF_ConfirmZones         = false;
input int  ApproachThresholdPips    = 8;
input int  ZoneAlertCooldown        = 300;

Параметры оформления маркеров, такие как ShowPatternMarkers, MarkerColor и MarkerOpacity, настраивают вид маркеров свечей, которые отображаются при обнаружении паттернов. Наконец, параметры экспорта (ExportCSV, CSVFileName, AppendCSV) позволяют советнику сохранять записи об обнаружениях для офлайн-анализа, дописывая их в существующий файл или перезаписывая его.

input bool   ShowPatternMarkers = true;
input color  MarkerColor        = clrGold;
input int    MarkerOpacity      = 30;
input bool   ExportCSV          = true;
input string CSVFileName        = "pattern_detections.csv";
input bool   AppendCSV          = true;

После объявления параметров в коде задаются рабочие переменные для хранения текущего состояния. Среди них – булевы переключатели, дублирующие входные параметры. Благодаря этому изменение сразу фиксируется, когда пользователь нажимает кнопку на графике, чтобы включить или отключить функцию, без удаления и повторного подключения советника. Объявляются массивы для хранения рыночных данных (MqlRates g_rates[]), названий обнаруженных паттернов (g_patterns[]), счетчиков срабатываний по каждому паттерну (g_pattern_hits[]) и подсчетов по бинам (g_bins_flat[]). Журнал обнаружений хранится в массиве структур Detection g_detections[], где для каждого паттерна записываются имя, время, цена и вес затухания. В массиве g_alert_sent[] также хранится история алертов, чтобы избежать повторных уведомлений по одной и той же зоне на каждом тике.

bool runtime_UseRecencyDecay;
MqlRates g_rates[];
string   g_patterns[];
int      g_pattern_hits[];
int      g_bins_flat[];
Detection g_detections[];
bool     g_alert_sent[];

Функция инициализации OnInit() вызывается при запуске советника. Сначала рабочие переключатели синхронизируются со значениями входных параметров, затем массивы отслеживания алертов подгоняются под максимальное число доступных зон, после чего вызывается ParsePatternList(), преобразующая строку паттернов, разделенных запятыми, в рабочий массив имен в нижнем регистре и присваивающая каждому паттерну свой цвет из предустановленной палитры. Затем вызывается CreateCompactUI(), которая создает панель управления на графике: вдоль края графика размещаются небольшие кнопки, позволяющие трейдеру повторно запускать сканирование, очищать зоны, переключать функции, а также по желанию показывать или скрывать легенду и маркеры. Если включена опция AutoRescanOnStart, советник делает короткую паузу (чтобы график успел подготовиться) и сразу запускает движок сканирования, чтобы результаты были видны сразу после подключения.

int OnInit()
{
   runtime_UseRecencyDecay = UseRecencyDecay;
   ArrayResize(g_alert_sent, MaxZonesToDraw);
   ParsePatternList();
   CreateCompactUI();
   if(AutoRescanOnStart) { Sleep(100); ScanAndDraw(); }
   return INIT_SUCCEEDED;
}

Интерактивность обрабатывается функцией OnChartEvent(), которая отслеживает события клика по объектам и сопоставляет их с известными именами кнопок, такими как OBJ_BTN_RESCAN или OBJ_TG_DECAY. Когда находится совпадение, соответствующий переключатель меняет состояние, текст статуса обновляется, а при включенном мгновенном повторном сканировании при изменении переключателей запускается AutoRescanIfAllowed(). Такое архитектурное решение превращает советник в работающую в реальном времени систему, управляемую пользователем: любой параметр можно изменить прямо с графика в ходе сессии, не возвращаясь в диалог свойств.

void OnChartEvent(int id, const long &lparam, const double &dparam, const string &sparam)
{
   if(sparam == OBJ_BTN_RESCAN) ScanAndDraw();
   else if(sparam == OBJ_TG_DECAY)
   {
      runtime_UseRecencyDecay = !runtime_UseRecencyDecay;
      AutoRescanIfAllowed();
   }
}

Функции создания интерфейса (CreateTinyButtonIfMissing и UpdateToggleButtons) обеспечивают наличие каждой кнопки управления, корректную метку, цветовую индикацию состояний ON/OFF и правильное размещение в координатах графика. Они также управляют окном состояния, которое по запросу показывает текущие настройки и сводку сканирования в аккуратном оверлее.

CreateTinyButtonIfMissing(OBJ_BTN_RESCAN, 8, 8, 84, 20, "Rescan");
CreateTinyButtonIfMissing(OBJ_TG_DECAY,   98, 8, 84, 20, "Decay");

Этап разбора паттернов в функции ParsePatternList() играет ключевую роль в логике сканирования. Она разбивает пользовательский ввод вида "hammer, doji" на элементы массива, удаляет пустые строки, переводит имена в нижний регистр для сопоставления, назначает им чередующиеся цвета из палитры и инициализирует все счетчики. Здесь также сбрасывается массив зон g_bins_flat из patterns_count × BinCount элементов, чтобы подготовить его к накоплению данных об обнаружениях.

int n = StringSplit(PatternName, ',', parts);
for(int p=0; p<n; p++)
{
   g_patterns[p] = ConvertToLower(parts[p]);
   g_pattern_colors[p] = palette[p % ArraySize(palette)];
}
ArrayResize(g_bins_flat, g_patterns_count * BinCount);
ArrayInitialize(g_bins_flat, 0);

Основной движок обнаружения и отрисовки ScanAndDraw() – самая крупная и важная часть советника. Сначала строка состояния обновляется до "Scanning..." и вычисляются безопасные значения по умолчанию для окна проверки и количества бинов. Затем список паттернов разбирается повторно, чтобы массивы оставались синхронизированными, предыдущие обнаружения очищаются, и выделяется память под рыночные данные. С помощью CopyRates() загружаются OHLC-данные за заданное окно проверки, определяются минимальная и максимальная цены для расчета высоты бина, после чего вычисляется размер бина.

Затем выполняется обратный проход по всем барам в окне проверки и по всем паттернам; для каждого случая вызывается IsPatternAtIndex(), чтобы проверить, соответствует ли бар критериям данного свечного паттерна. При обнаружении совпадений увеличивается число срабатываний, цена обнаружения привязывается по правилам полярности (бычьи паттерны – к минимумам свечей, медвежьи – к максимумам), после чего для соответствующей цены вычисляется индекс бина. Взвешивание по давности применяется как множитель, благодаря чему более свежие бары вносят больший вес в свои бины. После этого значения соответствующих бинов увеличиваются, а если включены экспорт в CSV или маркеры, запись об обнаружении сохраняется в g_detections[].

g_rates_copied = CopyRates(_Symbol, _Period, 0, barsToCopy, g_rates);
for(int bar=1; bar<lookback && bar<g_rates_copied; ++bar)
{
   for(int p=0; p<g_patterns_count; ++p)
   {
      if(IsPatternAtIndex(g_patterns[p], bar, g_rates))
      {
         int binIndex = (int)MathFloor((pricePoint - g_price_min) / binSize);
         g_bins_flat[p*BinCount + binIndex] += intContrib;
      }
   }
}

После обработки всех баров бины по всем паттернам объединяются в combinedBins, и каждый бин, достигший масштабированного порога минимального числа попаданий, превращается в структуру ZoneRec с индексом бина, числом попаданий, ценовым диапазоном, заготовкой под оценку, флагом подтверждения HTF и временем последнего алерта.

for(int b=0; b<BinCount; ++b)
{
   int sum = 0;
   for(int p=0; p<g_patterns_count; ++p)
      sum += g_bins_flat[p*BinCount + b];
   combinedBins[b] = sum;
   if(combinedBins[b] >= scaledMinHits)
   {
      ZoneRec z; z.bin = b; z.count = sum;
      z.low = g_price_min + b*binSize; z.high = z.low + binSize;
      zones[zoneCount++] = z;
   }
}

Если требуется подтверждение на старшем таймфрейме, советник вызывает ConfirmZonesWithHTF(), чтобы запустить аналогичный цикл обнаружения на втором наборе данных с выбранного HTF и пометить как подтвержденные те зоны, в которых на этом более широком фоне тоже обнаруживаются срабатывания паттернов.

if(IsPatternAtIndex(g_patterns[p], bar, htf_rates) &&
   pricePoint >= zones[z].low && pricePoint <= zones[z].high)
   zones[z].htf_confirmed = true;

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

double base = zones[i].count;
double factor = zones[i].htf_confirmed ? 1.4 : 1.0;
zones[i].score = (int)MathRound((base / maxRaw) * 100 * factor);

Зоны сортируются по числу попаданий в порядке убывания, ограничиваются параметром MaxZonesToDraw и отображаются на графике как полупрозрачные прямоугольники, охватывающие их ценовой диапазон; прозрачность (alpha) при этом пропорциональна силе попаданий. Рядом с каждой зоной размещается OBJ_LABEL, показывающий ее индекс, число попаданий, оценку, статус HTF и цену средней точки.

color pc = MakeColorWithAlpha(g_pattern_colors[p], alpha);
ObjectCreate(0, obj, OBJ_RECTANGLE, 0, time_left, lowP, time_right, highP);
ObjectSetInteger(0, obj, OBJPROP_COLOR, pc);

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

color pc = MakeColorWithAlpha(g_pattern_colors[p], alpha);
ObjectCreate(0, obj, OBJ_RECTANGLE, 0, time_left, lowP, time_right, highP);
ObjectSetInteger(0, obj, OBJPROP_COLOR, pc);

Для трейдеров, проверяющих результаты, функция DrawPerfectPatternMarkers() выделяет рамкой точные свечи, вызвавшие срабатывания, и при необходимости заполняет их полупрозрачным цветом.

ObjectCreate(chartId, markerName, OBJ_RECTANGLE, 0, startTime, candle.low, endTime, candle.high);

Наконец, если ShowLegend имеет значение true, функция DrawPatternLegend() выводит в левом углу наложение со списком всех паттернов и общим числом их срабатываний, а при включенном экспорте в CSV функция ExportDetectionsToCSV() записывает данные об обнаружениях в указанный файл.

ObjectSetString(0, nm, OBJPROP_TEXT, StringFormat("%s : %d", g_patterns[p], g_pattern_hits[p]));

Механизм алертов в советнике спроектирован так, чтобы работать точно и с минимальным шумом. После отрисовки зон массив g_alert_sent[] сбрасывается, и если алерты включены, советник вызывает CheckAndAlertApproachingZones() для сравнения текущей цены Bid с серединой каждой зоны. Если абсолютное расстояние меньше порога в пипсах, период ожидания уже истек и условия HTF соблюдены, срабатывает один алерт. Этот алерт содержит ID зоны, символ, таймфрейм, цену середины зоны, оценку и статус подтверждения HTF; при соответствующей настройке он воспроизводит звук и отправляет push-уведомление, если терминал это позволяет. Важно, что для этой зоны устанавливается флаг алерта, поэтому новые алерты не возникают, пока цена не выйдет за пределы порога и не вернется снова; это делает алерты детерминированными и практичными.

if(dist <= tol && !g_alert_sent[i])
{
   Alert(msg);
   g_alert_sent[i] = true;
}

Помимо ScanAndDraw() и функций алертов, в советнике реализованы вспомогательные функции для обнаружения каждого свечного паттерна. Например, CheckHammerFromArray() сравнивает размер тела свечи с общим диапазоном и пропорциями теней, чтобы точно выявлять настоящие молоты в соответствии с принятыми торговыми определениями. Эти проверки отсекают ложные срабатывания от похожих свечей, у которых нет правильной разворотной геометрии. Аналогичные функции реализованы для доджи, перевернутого молота, паттернов поглощения, утренней звезды, вечерней звезды, пинцетов, волчков и марубозу; в каждой заданы количественные правила для соотношений цен открытия и закрытия, а также пропорций теней.

return (body/range<0.35 && lowerShadow>=1.8*body && upperShadow<=0.6*body);

Объединяя строгие алгоритмы обнаружения, мониторинг в реальном времени, интерактивность на графике, наглядную визуализацию и экспорт статистики, советник Pattern Density Heatmap дает трейдерам динамическую карту на основе данных, показывающую, где в ценовой истории концентрируются ключевые свечные паттерны. Эта информация превращается в перспективные зоны поддержки и сопротивления, а алерты помогают вовремя реагировать, когда цена снова приближается к этим уровням.



Результаты

В этом разделе представлены визуальные и количественные результаты, полученные советником PatternDensityHeatmap.mq5. Ниже приводится четкое описание того, что показывает каждый рисунок, как были получены результаты, какие параметры тестирования использовались, а также практические замечания по работе с инструментом и основные выводы из тестов с одним паттерном.

Обзор

Анимация и скриншоты ниже показывают, как советник сканирует ценовую историю, обнаруживает свечные паттерны, агрегирует точки обнаружения в ценовые бины и строит зоны плотности на графике.  

  1. Толщина зоны и ее непрозрачность отражают силу обнаружения.
  2. Дополнительные слои по отдельным паттернам показывают, какие именно паттерны формируют зону.
  3. Маркеры в рамке подтверждают точные совпадения со свечами.
  4. Метки справа показывают число попаданий, оценку и подтверждение на старших таймфреймах для быстрой проверки.

Последовательность демонстрирует и то, и другое:

  • Составные сканирования по нескольким паттернам
  • Целевые тесты с одним паттерном (молот и доджи)

Анимация полного повторного сканирования (составные паттерны)

Полный проход повторного сканирования и отрисовки с PatternName = "hammer, doji". Зоны формируются на графике в реальном времени, появляются слои по отдельным паттернам, а маркеры выделяют рамкой точные свечи. Показывает, как составные тепловые карты формируются из нескольких типов паттернов и как в реальном времени обновляются переключатели интерфейса (Rescan, Layers, Decay, CSV, Polarity, Legend, Markers).

На рисунке выше показана работа советника Pattern Density Heatmap в составном режиме. Rescan преобразует обнаружения паттернов в зоны с цветовой градацией; слои по отдельным паттернам и рамочные маркеры показывают вклад каждого паттерна и точные совпадения со свечами.

Молот (тест с одним паттерном)

  • Тепловая карта, построенная при PatternName = "hammer".
  • Показывает основной кластер молотов с числом срабатываний советника (hammer: 29).
  • Этот вид позволяет проверить, совпадают ли кластеры hammer с уровнями ценовой реакции (поддержки), а также точнее настроить размер зон и порог срабатывания для более точного определения зоны.

На рисунке выше показан тест с одним паттерном – молотом (count = 29). Выделенная полоса показывает область концентрации паттернов "молот", по которой определяется зона поддержки.

Доджи (тест с одним паттерном)

  • Тепловая карта, построенная при PatternName = "doji".
  • Видны несколько узких кластеров доджи с подсчитанными советником обнаружениями (doji: 67).
  • Это помогает определить, концентрируются ли доджи вблизи уровней консолидации или распределены широко.

На рисунке выше показан тест с одним паттерном – доджи (count = 67). Узкие полосы указывают на повторяющиеся свечи неопределенности вблизи ключевых ценовых уровней.

Использованные параметры тестирования

Тест PatternName Окно проверки (LookbackBars) BinCount MinHitsToShow
GIF hammer, doji 2000 40 2
Рис. 1 hammer 500 40 2
Рис. 2 doji 500 40 2

Как были получены результаты

Для каждого запуска советник сначала загружает с графика рыночные данные за последние LookbackBars баров. Затем определяются минимальная и максимальная цены в этом диапазоне и вычисляется точный размер зоны binSize, чтобы разделить вертикальное ценовое пространство на равные сегменты. Затем цикл сканирования обрабатывает каждый бар по отдельности, применяя выбранные алгоритмы обнаружения паттернов (например CheckHammerFromArray() или CheckDojiFromArray()), чтобы определить, соответствует ли свеча одной из целевых формаций. Когда находится совпадение, вычисляется соответствующая ценовая точка (середина, минимум или максимум – в зависимости от правил привязки по полярности), после чего для нее определяется соответствующий индекс зоны. Счетчик каждой зоны увеличивается; если включено затухание по давности, дополнительно применяется взвешивание, чтобы более свежие обнаружения влияли сильнее.  

Зоны, число попаданий в которые превышает порог MinHitsToShow, преобразуются в записи ZoneRec. Затем эти зоны можно проверить на подтверждение со старшего таймфрейма, после чего оценить и отсортировать так, чтобы приоритет получали области с более сильной реакцией. Зоны с наивысшим рейтингом отображаются как заполненные наложения OBJ_RECTANGLE; при необходимости поверх них добавляются слои по отдельным паттернам, а точные прямоугольные маркеры выделяют рамкой реальные свечи, вызвавшие срабатывания. Метки рядом с каждой зоной показывают ключевые справочные данные: общее число попаданий, нормированную оценку и наличие подтверждения по данным старшего таймфрейма. Если включен экспорт в CSV, советник записывает данные по каждому обнаружению в файл для офлайн-анализа.

Практические замечания 

При экспорте данных об обнаружениях в CSV помните, что файлы записываются в рабочий каталог терминала – у MetaTrader 5 должны быть разрешения на доступ к файловой системе, иначе экспорт завершится ошибкой. Логика алертов при подходе цены в реальном времени опирается на текстовое содержимое меток зон; если эти объекты меток переименовать вручную, система алертов может потерять привязку к зонам. Все графические объекты, созданные советником, имеют префикс PDHP_, чтобы не конфликтовать с другими индикаторами и советниками. Если объект не удается создать, причиной могут быть конфликты имен или недостаточное число исторических баров для выбранного значения LookbackBars.  

Поведение затухания по давности задается параметром DecayHalfLife – меньшие значения быстрее ослабляют вес старых обнаружений и повышают значимость недавних срабатываний паттернов. Привязку по полярности стоит тестировать отдельно, поскольку она меняет ценовую точку, используемую для каждого обнаружения: бычьи паттерны привязываются к минимумам свечей, а медвежьи – к максимумам. В некоторых стратегиях это может точнее выравнивать зоны, но такой подход нужно проверять в тестах с одним паттерном.

Краткие выводы

Составное сканирование, показанное в GIF, демонстрирует, что паттерны разных типов, накладываясь друг на друга, могут образовывать сильные и хорошо различимые зоны. Такие составные зоны особенно полезны для трейдеров, которым нужна более высокая уверенность за счет совпадения нескольких сигналов по паттернам. Тест с одним паттерном "молот" выделил один плотный кластер (count = 29), напоминающий сильную зону поддержки; это показывает, как одна формация может указывать на смещение в пользу входов вблизи такого уровня. Напротив, тест с одним паттерном "доджи" дал несколько узких полос (count = 67), отражающих повторяющуюся рыночную неопределенность, распределенную по разным ценовым привязкам. Эти кластеры доджи лучше интерпретировать как сигналы консолидации, а не как непосредственные триггеры разворота.  

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



Заключение

Советник Pattern Density Heatmap стал важным этапом развития нашего инструментария для анализа Price Action. То, что в 51-й части серии начиналось как простой инструмент поиска свечных паттернов и отправки алертов, превратилось в сложную систему картирования рынка, способную выявлять, количественно оценивать и отслеживать статистически значимые ценовые зоны, сформированные на основе исторического поведения свечей. Автоматически агрегируя несколько паттернов в измеримые ценовые зоны, а затем оценивая и подтверждая эти зоны по данным старшего таймфрейма, советник переводит торговлю по паттернам из чисто визуального подхода в процесс, основанный на данных. Теперь трейдерам больше не приходится полагаться только на интуицию – они могут в реальном времени видеть, где рынок неоднократно реагировал, и получать алерты, когда цена подходит к этим зонам высокой плотности.  

Это меняет сам подход к распознаванию поддержки и сопротивления: теперь это не субъективные линии, проведенные на глаз, а эмпирически подтвержденные зоны, подкрепленные надежной статистикой обнаружений и обладающие подтвержденной вероятностью влиять на будущие движения рынка. Эти уровни отмечают точки, в которых рыночные реакции происходили регулярно, и дают трейдерам четкие, объективные ориентиры для выбора момента входа и выхода. Сочетание наглядной тепловой карты, точных свечных меток, алертов при подходе цены и экспортируемых наборов данных делает инструмент универсальным и применимым в самых разных стилях торговли – от внутридневного скальпинга до многодневного свинг-трейдинга, от дискреционных сетапов до полностью автоматизированных систем, использующих CSV-аналитику.

На практике это обеспечивает:

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

Внедряя советник Pattern Density Heatmap в свой рабочий процесс, экспериментируйте с разными списками паттернов, окнами проверки и настройками HTF, чтобы найти конфигурацию, которая лучше всего соответствует вашему торговому горизонту и выбранному рынку. Так вы сможете раскрыть весь потенциал инструмента – превратить скрытые кластеры рыночных реакций в рабочие, проверенные карты поддержки и сопротивления и стабильно оставаться на шаг впереди цены. Благодаря инструменту Pattern Density Heatmap поддержка и сопротивление больше не остаются предметом догадок – они измерены, нанесены на карту и ждут подтверждения со стороны цены.

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

Прикрепленные файлы |
Последние комментарии | Перейти к обсуждению на форуме трейдеров (2)
irabor Emmanuel
irabor Emmanuel | 28 нояб. 2025 в 12:19
Доброе утро, пожалуйста, можете ли вы использовать этот индикатор, чтобы сделать ea бот для меня
Juvenille Emperor Limited
Eleni Anna Branou | 28 нояб. 2025 в 15:10
irabor Emmanuel #:
Доброе утро, пожалуйста, можете ли вы использовать этот индикатор, чтобы сделать ea бот для меня

Опубликуйте ваши требования в качестве задания в разделе Фриланс, пожалуйста.

Разработка динамического мультивалютного советника (Часть 6): Адаптивная чувствительность к спреду при высокочастотном переключении символов Разработка динамического мультивалютного советника (Часть 6): Адаптивная чувствительность к спреду при высокочастотном переключении символов
В этой части мы сосредоточимся на разработке слоя интеллектуального управления исполнением, который непрерывно отслеживает и оценивает спреды в реальном времени по нескольким символам. Советник динамически адаптирует выбор символов, включая или отключая торговлю по отдельным символам в зависимости от эффективности спреда, а не по фиксированным правилам. Этот подход позволяет высокочастотным мультивалютным системам отдавать приоритет символам с наименьшими торговыми издержками.
Категориальная скрытая марковская модель на языке MQL5 Категориальная скрытая марковская модель на языке MQL5
В статье подробно рассматриваются теоретические основы и практическая реализация скрытой марковской модели с категориальными эмиссиями (Categorical HMM) на языке MQL5. На конкретных примерах демонстрируются процессы инференса, итерационного обучения параметров, онлайн-фильтрации, а также методология выбора оптимальной архитектуры модели по информационным критериям AIC/BIC.
Разработка инструментария для анализа Price Action (Часть 54): Фильтрация трендов с помощью EMA и сглаженных ценовых данных Разработка инструментария для анализа Price Action (Часть 54): Фильтрация трендов с помощью EMA и сглаженных ценовых данных
В этой статье рассматривается метод, сочетающий сглаживание Heikin-Ashi с границами EMA20 по максимумам и минимумам, а также фильтром тренда EMA50, чтобы сделать сигналы понятнее, а входы точнее. Статья показывает, как эти инструменты помогают трейдерам выявлять реальный импульс, отсекать шум и увереннее работать на волатильном или трендовом рынке.
Разработка инструментария для анализа Price Action (Часть 55): Индикатор CPI с мини-свечами для отображения внутрисвечного давления Разработка инструментария для анализа Price Action (Часть 55): Индикатор CPI с мини-свечами для отображения внутрисвечного давления
В этой статье рассматриваются разработка и реализация в MetaTrader 5 индикатора Candle Pressure Index (CPI) – накладываемого на график индикатора на основе CLV, который визуализирует внутрисвечное давление покупателей и продавцов прямо на ценовом графике. Основное внимание уделено структуре свечи, классификации давления, механике визуализации и системе алертов на основе переходов без перерисовки, рассчитанной на стабильное поведение на разных таймфреймах и инструментах.