English Deutsch 日本語
preview
Разработка инструментария для анализа Price Action (Часть 54): Фильтрация трендов с помощью EMA и сглаженных ценовых данных

Разработка инструментария для анализа Price Action (Часть 54): Фильтрация трендов с помощью EMA и сглаженных ценовых данных

MetaTrader 5Тестер |
65 0
Christian Benjamin
Christian Benjamin

Содержание



Введение

На протяжении десятилетий трейдеры искали способы отфильтровать рыночный шум и сосредоточиться на реальном движении цены. Метод Heikin-Ashi особенно выделяется тем, что сглаживает свечи, делая тренды более наглядными, а краткосрочную волатильность – менее отвлекающей. Проще говоря, Heikin-Ashi работает как четкая дорожная карта от точки A к точке B, сглаживая ценовой шум и облегчая отслеживание общего направления. В одной из предыдущих работ я рассмотрел систему анализа Price Action, полностью построенную на Heikin‑Ashi, которая давала чистые входы и узнаваемые паттерны. Однако опыт показал, что такой подход сам по себе уязвим в определенных рыночных условиях, когда сильные бычьи или медвежьи свечи искажают реальную картину тренда.  

Чтобы устранить это ограничение, я добавил экспоненциальные скользящие средние (EMA), чтобы повысить надежность сигналов. EMA20, рассчитанные по максимумам и минимумам, формируют краткосрочные верхнюю и нижнюю границы рынка, тогда как EMA50 по ценам закрытия выступает более широким фильтром направления. Когда сигналы Heikin-Ashi согласуются с этими EMA-фильтрами, число ложных срабатываний заметно снижается, а входы в сделки становятся более дисциплинированными. Такое сочетание сохраняет визуальную ясность, за которую ценят Heikin-Ashi, и одновременно добавляет четкую количественную структуру, создавая сбалансированный подход, который улучшает принятие решений и подтверждает направление тренда.

  

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



Механика стратегии

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

Эта система была разработана, чтобы предотвратить такие ложные срабатывания. Она сочетает сглаживание Heikin-Ashi с фильтрацией по экспоненциальным скользящим средним, поэтому система учитывает только те визуально сильные свечи, которые согласуются с измеримым импульсом. Модуль Heikin-Ashi пересчитывает каждую свечу на основе усредненных значений OHLC, формируя график, на котором цвета следуют устойчивым трендам и меняются только при реальных разворотах. Это дает более чистую картину направления, чем обычные свечи, и облегчает определение преобладающей направленности.

Чтобы защититься от ситуаций, в которых Heikin-Ashi может вводить в заблуждение, например когда посреди нисходящего тренда появляется одиночная бычья свеча, стратегия добавляет второй уровень проверки. EMA50, рассчитанная по ценам закрытия, задает общий контекст направления, а ее наклон дает быструю числовую оценку силы тренда. Пара линий EMA20, рассчитанных по максимумам и минимумам, задает границы недавних ценовых экстремумов. Прежде чем сигнал Heikin-Ashi будет принят, он должен выйти за пределы этих границ EMA20 и согласоваться с наклоном EMA50. Если хотя бы одно из условий не выполняется, сетап игнорируется.

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

Подробный расчет Heikin‑Ashi

Метод Heikin-Ashi изменяет стандартный расчет свечей OHLC, чтобы получить сглаженные значения, отфильтровывающие небольшие колебания. Вместо построения по исходным значениям открытия, максимума, минимума и закрытия каждого периода система использует усредненные значения.

Ниже приведена стандартная формула Heikin-Ashi.

Цена закрытия Heikin-Ashi

Цена открытия Heikin-Ashi

Цена максимума Heikin-Ashi


Цена минимума Heikin-Ashi

  • HA_Close рассчитывается как среднее значение цены открытия, цены максимума, цены минимума и цены закрытия реальной свечи, давая усредненный уровень закрытия за этот период.
  • HA_Open рассчитывается как среднее между ценой открытия и ценой закрытия предыдущей свечи Heikin-Ashi, связывая каждое новое открытие с усредненными значениями последней свечи.
  • HA_High / HA_Low отражают наибольшее и наименьшее значения между сглаженными значениями открытия/закрытия и фактическими максимумом/минимумом реальной свечи.

Логика цвета (направление тренда)

Бычья свеча HA: (HA Close > HA Open)
  • Отображается в зеленом цвете (или другом бычьем цвете, выбранном трейдером).  
Медвежья свеча HA: (HA Close < HA Open)
  • Отображается в красном цвете (или другом медвежьем цвете, выбранном трейдером).  

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

Хотя эта особенность помогает трейдерам увереннее следовать трендам, она также вносит небольшое запаздывание. Поскольку значения каждой свечи усредняются, развороты обычно подтверждаются позже, чем на обычном свечном графике. В сильных трендах такое запаздывание полезно, потому что позволяет дольше удерживать прибыльные позиции. Однако на сложных или боковых рынках сглаживание может скрывать ранние признаки изменений, что приводит к немного запоздалым входам и выходам. Здесь и становится необходимым дополнительный аналитический слой – нечто, что может подтвердить или опровергнуть то, на что, как кажется, указывает график Heikin-Ashi. Именно поэтому здесь мы добавили экспоненциальные скользящие средние. 

Настройки расчета EMA

Экспоненциальные скользящие средние (EMA) отражают среднюю цену за определенный период, придавая больший вес последним данным, что дает чувствительный, но при этом устойчивый показатель. При расчете применяется множитель, который дает приоритет новым ценам и формирует линию, способную отслеживать меняющийся баланс между краткосрочным импульсом и более долгосрочными трендами. Трейдеры обычно используют EMA для определения динамических уровней поддержки и сопротивления, оценки текущего направления тренда и поиска точек, где импульс ускоряется или ослабевает. Сравнение EMA с разными периодами позволяет оценить силу и устойчивость тренда: например, растущая EMA50 указывает на устойчивый бычий импульс, а снижающаяся – на обратную картину. В этой стратегии используются три экспоненциальные скользящие средние.

  • EMA50 по ценам закрытия как фильтр долгосрочного тренда

ema50 = iMA(_Symbol, WorkTF, 50, 0, MODE_EMA, PRICE_CLOSE);

Оценивает направленность тренда по собственному наклону. Достаточно гладкая, чтобы игнорировать небольшие колебания, и достаточно чувствительная, чтобы улавливать дневные и краткосрочные сдвиги тренда. Вместо того чтобы полагаться только на пересечение цены с EMA50, система измеряет наклон (направленное изменение) между текущим значением EMA50 и значением EMA50 предыдущей свечи.

trendBull = (ema50_current > ema50_previous);
trendBear = (ema50_current < ema50_previous);

  • 1) Если текущее значение EMA50 больше предыдущего значения EMA50средняя растет, а направленность рынка – бычья.
  • 2) Если текущее значение EMA50 меньше предыдущего значения EMA50, средняя снижается, а направленность рынка – медвежья.

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

  • EMA20 по максимумам как верхняя краткосрочная граница


ema20_high = iMA(_Symbol, WorkTF, 20, 0, MODE_EMA, PRICE_HIGH);

Отражает усредненный экстремум максимумов последних свечей; закрытие HA выше этого уровня указывает на заметное восходящее давление.

  • EMA20 по минимумам как нижняя краткосрочная граница


ema20_low = iMA(_Symbol, WorkTF, 20, 0, MODE_EMA, PRICE_LOW);

Отражает усредненный экстремум минимумов; закрытие HA ниже этого уровня указывает на заметное нисходящее давление.

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

Правила формирования сигналов

Сигналы на покупку

1) Закрытие сглаженной свечи выше EMA20 High

  • (HA Close > EMA20 High) – цена пробивает верхнюю краткосрочную границу.

2) Свеча HA является бычьей

  • (HA Close > HA Open) – тело свечи направлено вверх.

3) Закрытие сглаженной свечи выше EMA50

  • (HA Close > EMA50 Close) – цена находится выше фильтра долгосрочного тренда.

4) Наклон EMA50 положительный

  • (Текущее значение EMA50 > предыдущее значение EMA50) – долгосрочная линия тренда направлена вверх.

5) Предыдущее закрытие HA было ниже EMA50 – пробой подтверждается (цена пересекла линию тренда снизу вверх).

Сигналы на продажу

1) Закрытие сглаженной свечи ниже EMA20 Low
  • (HA Close < EMA20 Low): цена опускается ниже краткосрочной нижней границы.
2) Свеча HA является медвежьей
  • (HA Close < HA Open) – тело свечи направлено вниз.
3) Закрытие сглаженной свечи ниже EMA50
  • (HA Close < EMA50 Close) – цена находится ниже фильтра долгосрочного тренда.
4) Наклон EMA50 отрицательный
  • (Текущее значение EMA50 < предыдущее значение EMA50) – долгосрочная линия тренда направлена вниз.
5) Предыдущее закрытие HA было выше EMA50 – пробой подтверждается (цена пересекла линию тренда сверху вниз).

    Принятый сигнал на покупку

    • Бычья свеча Heikin-Ashi закрывается выше EMA20 High, а EMA50 направлена вверх. Предыдущее закрытие HA было ниже EMA50, а текущая свеча пробила ее вверх, подтверждая восходящий импульс.  

    Отклоненный сигнал на покупку

    • Бычья свеча HA закрывается выше EMA20 High, но наклон EMA50 нулевой или отрицательный. Отсутствие согласования с общим трендом приводит к отклонению сигнала.  

    Принятый сигнал на продажу

    • Медвежья свеча Heikin-Ashi закрывается ниже EMA20 Low, а EMA50 направлена вниз. Предыдущее закрытие HA было выше EMA50, а текущая свеча пробила ее вниз, подтверждая нисходящий импульс.  

    Отклоненный сигнал на продажу

    • Медвежья свеча HA закрывается ниже EMA20 Low, но наклон EMA50 положительный. Поскольку старший тренд направлен вверх, сигнал отбрасывается.  

    Визуальные сигналы и алерты

    BuyСтрелки Buy отображаются в зеленом или лаймовом цвете и размещаются ниже минимума сигнальной свечи на расстоянии отступа, задаваемом ArrowOffsetPoints, тогда как стрелки Sell отображаются в красном цвете и располагаются выше максимума свечи на таком же расстоянии отступа. Такое размещение предотвращает наложение на свечи и сохраняет читаемость графика. Каждой стрелке присваивается определенный префикс, например "EMA20HA_BUY_", а также временная метка, что позволяет избежать дублирования сигналов на одной и той же свече. При появлении подтвержденного сигнала советник формирует алерт с символом и типом сигнала; при необходимости уведомления можно дополнительно отправлять через push или по электронной почте в соответствии с предпочтениями трейдера.



    Реализация

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

    На диаграмме ниже показан рабочий процесс советника: от инициализации через расчет Heikin-Ashi, EMA-фильтрацию и проверку сигналов до построения стрелок и отправки алертов.  

    Инициализация индикаторов

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

    handleEMA50  = iMA(_Symbol, WorkTF, 50, 0, MODE_EMA, PRICE_CLOSE);
    handleEMA20H = iMA(_Symbol, WorkTF, 20, 0, MODE_EMA, PRICE_HIGH);
    handleEMA20L = iMA(_Symbol, WorkTF, 20, 0, MODE_EMA, PRICE_LOW);

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

    • Проверяется корректность всех хэндлов.

    if(handleEMA50 == INVALID_HANDLE || handleEMA20H == INVALID_HANDLE || handleEMA20L == INVALID_HANDLE)
       return(INIT_FAILED);

    • При выходе хэндлы освобождаются.

    IndicatorRelease(handleEMA50);
    IndicatorRelease(handleEMA20H);
    IndicatorRelease(handleEMA20L);

    Двухрежимная обработка свечей

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

    double haOpen = (prevHAopen + prevHAclose) / 2.0;
    double haClose = (open[i] + high[i] + low[i] + close[i]) / 4.0;
    double haHigh = MathMax(high[i], MathMax(haOpen, haClose));
    double haLow  = MathMin(low[i],  MathMin(haOpen, haClose));

    Если это не удается или обнаруживается режим тестера, пользовательская функция вручную строит каждую свечу по формулам Heikin-Ashi. Затем они отрисовываются на графике с помощью прямоугольных объектов, цвет которых соответствует направленности свечи. Такой двухрежимный подход гарантирует, что в обеих средах будет отображаться одинаковая визуальная информация и одинаковые аналитические результаты.

    ObjectCreate(0, name, OBJ_RECTANGLE, 0, t1, haHigh, t2, haLow);
    ObjectSetInteger(0, name, OBJPROP_COLOR, (haClose > haOpen) ? clrLime : clrRed);

    Управление графическими объектами

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

    string arrowName = "EMA20HA_BUY_" + IntegerToString(TimeCurrent());

    Функции вроде DeleteObjectsByPrefix() позволяют точечно удалять устаревшие или лишние объекты, не затрагивая остальные элементы графика.

    DeleteObjectsByPrefix("EMA20HA_", OBJ_ARROW);

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

    Контроль сигналов и устранение дубликатов

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

    if(lastSignalTime == Time[0] && lastSignalType == currentSignal)
       return; // skip duplicate

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

    Проверка тренда

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

    • оценка наклона EMA50 – определение контекста тренда;
    • получение данных HA и EMA20 – оценка краткосрочного давления;
    • проверка комбинации – подтверждение сигнала или его отклонение.

    bool trendBull = ema50_current > ema50_previous;
    bool trendBear = ema50_current < ema50_previous;

    Такая многоуровневая проверка повторяет логику, описанную в разделе "Механика", и обеспечивает как согласованность, так и вычислительную эффективность.

    Управление визуальными элементами

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

    double arrowPrice = High[0] + (ArrowOffsetPoints * _Point);
    ObjectCreate(0, arrowName, OBJ_ARROW, 0, Time[0], arrowPrice);
    ObjectSetInteger(0, arrowName, OBJPROP_COLOR, clrLime);

    Если используются вручную рассчитанные свечи Heikin-Ashi, они обновляются только на новых свечах, чтобы снизить нагрузку на процессор. Баланс между отзывчивостью и эффективностью сохраняет интерфейс аккуратным даже при одновременном мониторинге нескольких инструментов.

    DeleteObjectsByPrefix("EMA20HA_", OBJ_ARROW);

    Работа с ресурсами и завершение

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

    IndicatorRelease(handleEMA50);
    IndicatorRelease(handleEMA20H);
    IndicatorRelease(handleEMA20L);
    DeleteObjectsByPrefix("EMA20HA_", OBJ_ARROW);
    DeleteObjectsByPrefix("EMA20HA_", OBJ_RECTANGLE);



    Разбор ключевых функций

     

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

    OnInit() – процедура инициализации

    Функция инициализации отвечает за настройку основных индикаторов и подготовку графика к работе. При загрузке советник создает три хэндла индикаторов – один для EMA50, рассчитанной по ценам закрытия, и два для EMA20, рассчитанных отдельно по максимумам и минимумам. Затем каждый хэндл проверяется, чтобы убедиться в его корректном создании; некорректные хэндлы могут привести к ошибкам расчетов или исключениям во время выполнения. Перед возвратом статуса успешного выполнения функция также очищает все оставшиеся графические объекты от предыдущих запусков, чтобы сигналы и визуальные элементы отображались без артефактов от предыдущих запусков.

    int OnInit()
    {
       // Load EMA indicators
       handleEMA50  = iMA(_Symbol, WorkTF, 50, 0, MODE_EMA, PRICE_CLOSE);
       handleEMA20H = iMA(_Symbol, WorkTF, 20, 0, MODE_EMA, PRICE_HIGH);
       handleEMA20L = iMA(_Symbol, WorkTF, 20, 0, MODE_EMA, PRICE_LOW);
    
       // Check handles
       if(handleEMA50 == INVALID_HANDLE || handleEMA20H == INVALID_HANDLE || handleEMA20L == INVALID_HANDLE)
       {
          Print("Failed to create EMA handles");
          return(INIT_FAILED);
       }
    
       // Remove any old objects from chart
       DeleteObjectsByPrefix("EMA20HA_", OBJ_ARROW);
       DeleteObjectsByPrefix("EMA20HA_", OBJ_RECTANGLE);
    
       return(INIT_SUCCEEDED);
    }

    OnTick() – основной цикл выполнения

    Эта функция выполняется на каждом рыночном тике: обновляет данные, проверяет торговые условия и выводит сигналы. Сначала она получает текущее и предыдущее значения EMA50, а также последние значения EMA20 High и EMA20 Low. На основе этих данных функция формирует текущую структуру свечи Heikin-Ashi и определяет преобладающее направление тренда по наклону EMA50. Наконец, функция оценивает сигналы Buy и Sell с помощью отдельных функций условий и при их выполнении создает визуальные сигналы.

    void OnTick()
    {
       // Get latest indicator values
       double ema50_current = CopyBufferValue(handleEMA50, 0);
       double ema50_previous = CopyBufferValue(handleEMA50, 1);
       double ema20_high = CopyBufferValue(handleEMA20H, 0);
       double ema20_low  = CopyBufferValue(handleEMA20L, 0);
    
       // Compute current Heikin-Ashi candle
       HA_Candle ha = GetHeikinAshiCandle(0);
    
       // Validate trends
       bool trendBull = ema50_current > ema50_previous;
       bool trendBear = ema50_current < ema50_previous;
    
       // Signal detection
       if(IsBuySignal(ha, ema20_high, ema50_current, trendBull))
          PlaceSignalArrow(true);
       
       if(IsSellSignal(ha, ema20_low, ema50_current, trendBear))
          PlaceSignalArrow(false);
    }

    GetHeikinAshiCandle() – утилита расчета HA

    Эта вспомогательная функция формирует сглаженные данные свечи для заданного сдвига в истории. Сначала она вычисляет HA Close как среднее исходных значений OHLC, а затем HA Open как среднее предыдущих значений HA Open и HA Close. Значения максимума и минимума определяются путем сравнения сглаженных значений с исходными максимумами и минимумами. Булев флаг показывает, является ли свеча бычьей или медвежьей, исходя из соотношения между HA Close и HA Open.

    HA_Candle GetHeikinAshiCandle(int shift)
    {
       HA_Candle ha;
       ha.close = (Open[shift] + High[shift] + Low[shift] + Close[shift]) / 4.0;
       double prev_ha_open = (Open[shift+1] + Close[shift+1]) / 2.0;
       ha.open  = (prev_ha_open + ha.close) / 2.0;
       ha.high  = MathMax(High[shift], MathMax(ha.open, ha.close));
       ha.low   = MathMin(Low[shift], MathMin(ha.open, ha.close));
       ha.isBull = ha.close > ha.open;
       return(ha);
    }

    IsBuySignal() – проверка условия покупки

    Функция сигнала Buy проверяет, соответствует ли текущая свеча HA всем критериям для длинной позиции. Она проверяет наличие бычьей свечи, закрытие выше EMA20 High, закрытие выше EMA50 и положительный наклон EMA50. Если хотя бы одно из этих условий не выполняется, функция возвращает false; в противном случае возвращается true, что указывает на корректный сетап для покупки.

    bool IsBuySignal(HA_Candle ha, double ema20_high, double ema50, bool trendBull)
    {
       if(!ha.isBull) return(false);
       if(ha.close <= ema20_high) return(false);
       if(ha.close <= ema50) return(false);
       if(!trendBull) return(false);
       return(true);
    }

    PlaceSignalArrow() – вывод графического сигнала

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

    void PlaceSignalArrow(bool isBuy)
    {
       double price = isBuy ? (High[0] + ArrowOffsetPoints * _Point) : (Low[0] - ArrowOffsetPoints * _Point);
       string name  = isBuy ? "EMA20HA_BUY_" + IntegerToString(Time[0]) : "EMA20HA_SELL_" + IntegerToString(Time[0]);
       int color    = isBuy ? clrLime : clrRed;
    
       ObjectCreate(0, name, OBJ_ARROW, 0, Time[0], price);
       ObjectSetInteger(0, name, OBJPROP_COLOR, color);
    }

    DeleteObjectsByPrefix() – очистка графика

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

    void DeleteObjectsByPrefix(string prefix, ENUM_OBJECT type)
    {
       for(int i = ObjectsTotal()-1; i >= 0; i--)
       {
          string name = ObjectName(i);
          if(StringFind(name, prefix) == 0 && ObjectType(name) == type)
             ObjectDelete(0, name);
       }
    }


    Руководство по запуску

    Чтобы применить стратегию, скопируйте исходный файл .mq5 в папку Experts терминала и скомпилируйте его в MetaEditor клавишей F7. После успешной компиляции откройте график нужного символа и таймфрейма, затем из папки "Expert Advisors" на панели "Навигатор – Советники" перетащите советник на график . Убедитесь, что включен Algo Trading, чтобы сигналы могли обрабатываться на новых свечах.

    GIF-анимация ниже демонстрирует создание советника в MetaEditor и его успешную компиляцию для дальнейшего использования в MetaTrader. 

    Перед запуском убедитесь, что в терминале есть исторические данные по выбранному таймфрейму; расчеты Heikin-Ashi и EMA требуют полной серии данных. После подключения проверьте вкладку "Эксперты"; сообщение об успешной инициализации подтвердит готовность к работе.

    Типичные параметры:

    input ENUM_TIMEFRAMES WorkTF = PERIOD_M15;
    input int ArrowOffsetPoints  = 50;
    input bool EnableAlerts      = true;

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

    После компиляции и подключения советника его можно протестировать на реальных графиках или в Тестере стратегий. Если вы обычно используете встроенный в MetaTrader индикатор Heikin-Ashi, имейте в виду: при тестировании на исторических данных подключать его не нужно. Во время тестирования советник сам рассчитывает и строит на графике собственные сглаженные свечи HA. Благодаря этому вы увидите одну и ту же структуру HA независимо от того, включен встроенный индикатор или нет. Для наглядности можно провести два быстрых визуальных теста.  

    • При тестировании на исторических данных с отключенным встроенным индикатором HA вы все равно увидите свечи HA, которые строит советник.
    input bool UseBuiltInHA = false; 
    • При тестировании на исторических данных с включенным встроенным индикатором HA на графике будут отображаться оба варианта, но для сигналов используется версия советника.
    input bool UseBuiltInHA = true;   

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



    Тестирование

    Первичное тестирование на исторических данных и наблюдения на демо- или реальном счете показывают, что наш инструмент, объединяющий Heikin-Ashi и EMA, ведет себя устойчиво в разных рыночных условиях. Многоуровневая структура фильтра давала более избирательные сигналы, которые в целом лучше соответствовали устойчивому движению цены, чем краткосрочной волатильности. Визуальное отображение упрощает проверку условий сигнала на графике.

    Пример результата на демо-счете в реальном времени

    В режиме визуального тестирования на исторических данных советник CandleSmoothing EMA Engine.mq5 строит на графике собственные сглаженные свечи Heikin-Ashi. Он не зависит от встроенного в платформу индикатора Heikin-Ashi. Эти свечи отображаются вместе с верхней и нижней границами EMA20 и линией фильтра тренда EMA50. Благодаря этому общую структуру рынка легче оценить с первого взгляда.

    Когда торговый сигнал подтверждается, инструмент размещает стрелку на графике. Зеленые стрелки обозначают сигналы Buy, а красные – сигналы Sell. Стрелки размещаются немного выше или ниже свечи, чтобы их было легко заметить. Каждый сигнал также записывается на вкладку "Эксперты" с указанием символа, времени и направления сделки. Это позволяет трейдерам сверять сигналы на графике с фактической логикой расчета. Ниже представлен пример тестирования на истории на H1, который показывает, как многоуровневый фильтр отсеивает множество ложных сигналов. В результате сигналов становится меньше, но точки входа оказываются надежнее и лучше соответствуют текущему рыночному импульсу.

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



    Заключение

    Разработка и раннее тестирование  советника Candle Smoothing EMA Signal показывают, что использование нескольких фильтров помогает устранить многие слабые места стратегий, основанных только на Heikin-Ashi. В моих тестах сочетание верхней и нижней границ EMA20 с проверкой тренда по EMA50 давало меньше сигналов, но сами они были чище и лучше согласовывались с общим направлением рынка.

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

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

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

    Прикрепленные файлы |
    Переосмысливаем классические стратегии (Часть 17): Моделирование технических индикаторов Переосмысливаем классические стратегии (Часть 17): Моделирование технических индикаторов
    В этом обсуждении мы сосредоточимся на том, как можно преодолеть "стеклянный потолок", создаваемый классическими методами машинного обучения в сфере финансов. Похоже, что самое главное ограничение ценности, которую можно извлечь из статистических моделей, заключается не в самих моделях — ни в данных, ни в сложности алгоритмов, — а скорее в методологии, которую мы используем для их применения. Другими словами, истинным узким местом может быть то, как мы используем модель, а не ее собственный потенциал.
    Разработка динамического мультивалютного советника (Часть 6): Адаптивная чувствительность к спреду при высокочастотном переключении символов Разработка динамического мультивалютного советника (Часть 6): Адаптивная чувствительность к спреду при высокочастотном переключении символов
    В этой части мы сосредоточимся на разработке слоя интеллектуального управления исполнением, который непрерывно отслеживает и оценивает спреды в реальном времени по нескольким символам. Советник динамически адаптирует выбор символов, включая или отключая торговлю по отдельным символам в зависимости от эффективности спреда, а не по фиксированным правилам. Этот подход позволяет высокочастотным мультивалютным системам отдавать приоритет символам с наименьшими торговыми издержками.
    Особенности написания экспертов Особенности написания экспертов
    Написание и тестирование экспертов в торговой системе MetaTrader 4.
    Разработка инструментария для анализа Price Action (Часть 53): Тепловая карта плотности паттернов для выявления зон поддержки и сопротивления Разработка инструментария для анализа Price Action (Часть 53): Тепловая карта плотности паттернов для выявления зон поддержки и сопротивления
    В этой статье представлен советник Pattern Density Heatmap – инструмент картирования ценовой динамики, который преобразует повторяющиеся обнаружения свечных паттернов в статистически значимые зоны поддержки и сопротивления. Вместо того чтобы рассматривать каждый сигнал по отдельности, советник агрегирует обнаружения в фиксированные ценовые зоны (бины), оценивает их плотность с опциональным взвешиванием по давности и подтверждает уровни по данным старшего таймфрейма. Полученная тепловая карта показывает уровни, на которые рынок исторически реагировал, и помогает заранее выбирать момент входа, управлять риском и повышать уверенность в стратегии независимо от стиля торговли.