English Deutsch 日本語
preview
Разработка инструментария для анализа Price Action (Часть 48): Индекс гармонии нескольких таймфреймов с панелью взвешенного смещения

Разработка инструментария для анализа Price Action (Часть 48): Индекс гармонии нескольких таймфреймов с панелью взвешенного смещения

MetaTrader 5Примеры |
352 5
Christian Benjamin
Christian Benjamin

Содержание


Введение

Как трейдеры, работающие с ценовым движением (Price Action), мы опираемся на структурную ясность – понимание того, как рынок ведет себя на разных таймфреймах, прежде чем входить в сделку. Однако одна из постоянных проблем торговли на нескольких таймфреймах заключается в том, как добиться согласованности между этими уровнями. На H4 график может выглядеть бычьим, на H1 – показывать нерешительность, а на M15 – уже разворот, из-за чего у трейдера возникает противоречивая картина и снижается уверенность.  

В этой 48-й части серии Разработка инструментария для анализа Price Action мы рассматриваем решение этой проблемы через создание индекса гармонии нескольких таймфреймов (HI) – механизма, который математически выражает согласованность между таймфреймами в виде единого нормализованного значения. Объединяя направленность нескольких структурных сигналов в единый итоговый показатель, HI позволяет трейдерам видеть на одной панели, находится ли рынок в состоянии согласованности между таймфреймами или, наоборот, демонстрирует расхождение. 

В этой статье рассматриваются концептуальная основа Индекса гармонии, алгоритм определения на базе структурной логики трех баров, метод взвешивания и сглаживания вклада каждого таймфрейма, а также функциональные возможности, которые превращают его в практический торговый инструмент. Многоуровневая структура делает HI одновременно визуальным инструментом для дискреционных трейдеров и количественным фильтром для алгоритмических систем на платформе MetaTrader 5. К концу статьи вы поймете, как реализовать индекс гармонии и интерпретировать цветовую индикацию панели, алерты и сигнальные маркеры, чтобы принимать решения точнее и увереннее в условиях мультитаймфреймового анализа.


Концепция и алгоритм

В торговле ценовым движением на нескольких таймфреймах задача состоит в том, чтобы выявлять тренды на отдельных графиках и сводить эти сигналы в единое направленное смещение. Младшие таймфреймы, такие как M15 и H1, незаменимы для отслеживания более мелких движений и ранних сигналов входа, тогда как старшие таймфреймы, такие как H4 и D1, задают доминирующий тренд и ключевые структурные уровни. Однако на быстро меняющемся рынке эти таймфреймы часто дают противоречивые сигналы. Без системного способа количественно оценить согласованность трейдерам приходится полагаться на субъективные и трудоемкие оценки. Индекс гармонии нескольких таймфреймов (HI) решает эту проблему, сводя структурные смещения по каждому таймфрейму к единому нормализованному числовому показателю в диапазоне от -1.0 до +1.0. Этот расчет в реальном времени упрощает принятие решений, дает наглядную картину на панели и позволяет автоматически генерировать алерты и сигналы.

Логика определения смещения

Определение смещения (bias) начинается с функции GetStructureBias(), которая анализирует последние три закрытых бара на каждом включенном таймфрейме:

Правило лестницы из трех баров


Если строгое условие лестницы не выполняется, алгоритм переходит к правилу цены закрытия:

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

Расчет взвешенного индекса гармонии

Когда для каждого таймфрейма вычислено значение смещения (+1 – бычий, 0 – нейтральный, -1 – медвежий), HI объединяет их по взвешенной формуле:

Здесь weight(i) – это заданный пользователем коэффициент, который определяет важность (вес) данного таймфрейма. Результат нормализуется в диапазоне [-1.0, +1.0], что обеспечивает единую шкалу независимо от весов.

Например, рассмотрим такой пример:

  • M15: Смещение = +1, вес = 0,10, вклад = +0,10
  • H1: Смещение = +1, вес = 0,20, вклад = +0,20
  • H4: Смещение = 0, вес = 0,30, вклад = 0,00
  • D1: Смещение = +1, вес = 0,40, вклад = +0,40

WeightedSum = 0.10+0.20+0.00+0.40 = 0.70, TotalWeight = 1.0

  • Индекс гармонии (HI) = (0,70/1,0) = 0,70

Значение HI, равное 0,70, указывает на умеренно сильный бычий консенсус и находится чуть ниже значимого порога, если он установлен на уровне 0,8.

Сглаживание HI с помощью EMA

Рыночные условия, особенно на младших таймфреймах, могут вызывать резкие колебания значений HI. Чтобы снизить шум сигналов, индекс гармонии применяет сглаживание с помощью экспоненциальной скользящей средней (EMA):

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

  • короткие периоды EMA → более чувствительны, подходят для скальпинга;
  • более длинные периоды EMA → более стабильны, лучше подходят для свинг-трейдинга.

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

Классификация состояний на основе порогов

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

StrongThreshold обозначает точку, в которой согласованность между включенными таймфреймами достигает высокого уровня уверенности. Например, если StrongThreshold имеет значение 0,80, для его пересечения потребуется, чтобы большинство взвешенных таймфреймов были четко согласованы в одном направлении. Это указывает на рыночную среду, в которой согласованность нескольких таймфреймов настолько высока, что многие трейдеры сочтут оправданным более агрессивное позиционирование. Параметр ModerateThreshold с более низким значением, например 0,40, сигнализирует о промежуточном уровне консенсуса. Он показывает ситуацию, в которой согласованность смещений уже формируется, но еще не достигла высокого уровня уверенности.  

Математически логика классификации выражается так:

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

Алерты и логика сигналов

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

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

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

Математически условие срабатывания стрелки можно записать так:

Экспорт данных для системной интеграции

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

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


Обзор возможностей

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

Настраиваемые таймфреймы и веса

В основе индекса гармонии лежит возможность выбирать, какие таймфреймы включать в расчет консенсуса, и задавать их индивидуальные веса в соответствии с вашим стилем торговли. Младшим таймфреймам (M15, H1) можно придать больший вес, если активный внутридневной трейдер хочет отрабатывать внутридневные свинги. Напротив, свинг-трейдеры и позиционные трейдеры могут придавать больший вес H4 и D1, чтобы индекс отражал макротренд и игнорировал более мелкие контрдвижения. Благодаря отдельным булевым переключателям для включения каждого таймфрейма индекс гармонии адаптируется к разным стилям – от скальпинга до долгосрочного инвестирования – без навязывания жесткой структуры. Эта гибкость гарантирует, что расчет консенсуса останется осмысленным именно для вашего стиля работы с рынком.

//--- user inputs
input bool Use_M15  = true;
input bool Use_H1   = true;
input bool Use_H4   = true;
input bool Use_D1   = true;

input double Weight_M15 = 1.0;
input double Weight_H1  = 1.5;
input double Weight_H4  = 2.0;
input double Weight_D1  = 2.5;

//--- example bias retrieval for selected TF
double GetBias(string symbol, ENUM_TIMEFRAMES tf)
{
   double close_now = iClose(symbol, tf, 0);
   double close_prev= iClose(symbol, tf, 1);
   if(close_now > close_prev) return  1; // bullish
   if(close_now < close_prev) return -1; // bearish
   return 0; // neutral
}

//--- example weighted calculation
double weighted_sum = 0;
double total_weight = 0;
if(Use_M15) { weighted_sum += GetBias(_Symbol, PERIOD_M15) * Weight_M15; total_weight += Weight_M15; }
if(Use_H1)  { weighted_sum += GetBias(_Symbol, PERIOD_H1)  * Weight_H1;  total_weight += Weight_H1;  }
if(Use_H4)  { weighted_sum += GetBias(_Symbol, PERIOD_H4)  * Weight_H4;  total_weight += Weight_H4;  }
if(Use_D1)  { weighted_sum += GetBias(_Symbol, PERIOD_D1)  * Weight_D1;  total_weight += Weight_D1;  }

double harmony_index = (total_weight > 0) ? weighted_sum / total_weight : 0;

Отображение панели и гибкость интерфейса

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

  • последнее значение HI и его версия после сглаживания EMA;
  • разбивка смещения по таймфреймам с указанием статуса каждого: бычий, медвежий или нейтральный;
  • взвешенные значения вклада для каждого таймфрейма, что делает индивидуальное влияние сразу заметным.

//--- Creating a chart label for HI values
string panelName = "HI_Dashboard";
if(!ObjectCreate(0, panelName, OBJ_LABEL, 0, 0, 0))
   Print("Failed to create dashboard label");

ObjectSetInteger(0, panelName, OBJPROP_CORNER, CORNER_RIGHT_UPPER);
ObjectSetInteger(0, panelName, OBJPROP_XDISTANCE, 10);
ObjectSetInteger(0, panelName, OBJPROP_YDISTANCE, 20);

string panelText = StringFormat("HI: %.2f\nEMA: %.2f", harmony_index, harmony_index_ema);
ObjectSetString(0, panelName, OBJPROP_TEXT, panelText);
ObjectSetInteger(0, panelName, OBJPROP_FONTSIZE, 12);
ObjectSetInteger(0, panelName, OBJPROP_COLOR, clrWhite);

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

Цветовая индикация уровней уверенности

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

Ярко-зеленый → значимое бычье состояние, HI ≥ StrongThreshold
Ярко-красный → значимое медвежье состояние, HI ≤ -StrongThreshold
Светло-зеленый / светло-красный → умеренные состояния, между умеренным и сильным порогами
Желтый → слабый или нейтральный консенсус

color GetHIColor(double hi, double strongThr, double moderateThr)
{
   if(hi >= strongThr)   return clrLime;      // strong bullish
   if(hi <= -strongThr)  return clrRed;       // strong bearish
   if(hi >= moderateThr) return clrLightGreen;// moderate bullish
   if(hi <= -moderateThr)return clrLightCoral;// moderate bearish
   return clrYellow;                          // neutral
}

ObjectSetInteger(0, panelName, OBJPROP_COLOR, GetHIColor(harmony_index, 0.7, 0.3));

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

Пороговые алерты

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

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

//--- once per bar check
static datetime lastAlertTime = 0;
if(Time[0] != lastAlertTime)
{
   if(harmony_index >= strong_threshold && prev_hi < strong_threshold)
      Alert("Strong Bullish Threshold Crossed on ", _Symbol);
      
   if(harmony_index <= -strong_threshold && prev_hi > -strong_threshold)
      Alert("Strong Bearish Threshold Crossed on ", _Symbol);
   
   lastAlertTime = Time[0];
}

Алерты передаются через систему Alert() в MetaTrader 5, вывод в лог и при необходимости push-уведомления, поэтому вы получите их и при работе с графиками, и при удаленном мониторинге.  

Автоматическое нанесение сигналов Buy/Sell на график

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

void PlotSignal(bool buy)
{
   string arrowName = "HI_Signal_" + IntegerToString(Time[0]);
   ObjectCreate(0, arrowName, OBJ_ARROW, 0, Time[0], buy ? Low[0] : High[0]);
   ObjectSetInteger(0, arrowName, OBJPROP_COLOR, buy ? clrLime : clrRed);
   ObjectSetInteger(0, arrowName, OBJPROP_ARROWCODE, buy ? 241 : 242); // Wingdings up/down arrow
}

if(harmony_index >= strong_threshold && prev_hi < strong_threshold)
   PlotSignal(true);

if(harmony_index <= -strong_threshold && prev_hi > -strong_threshold)
   PlotSignal(false);

Сглаживание EMA для снижения шума

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

//--- standard EMA smoothing formula
double alpha = 2.0 / (HI_EMA_Period + 1);
harmony_index_ema = harmony_index_ema + alpha * (harmony_index - harmony_index_ema);

Экспорт данных в глобальные переменные

Индекс гармонии разработан с прицелом на совместимость с другими системами. Все ключевые выходные данные, включая исходный HI, сглаженный HI, а также смещение по каждому таймфрейму, сохраняются в разделе "Глобальные переменные" терминала MetaTrader 5. Благодаря этому они сразу доступны:  

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

//--- store outputs as global vars
GlobalVariableSet("HI_Raw_"+_Symbol, harmony_index);
GlobalVariableSet("HI_EMA_"+_Symbol, harmony_index_ema);
GlobalVariableSet("HI_Bias_M15_"+_Symbol, (double)GetBias(_Symbol, PERIOD_M15));
GlobalVariableSet("HI_Bias_H1_"+_Symbol,  (double)GetBias(_Symbol, PERIOD_H1));
GlobalVariableSet("HI_Bias_H4_"+_Symbol,  (double)GetBias(_Symbol, PERIOD_H4));
GlobalVariableSet("HI_Bias_D1_"+_Symbol,  (double)GetBias(_Symbol, PERIOD_D1));

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


Пояснение к структуре кода

Советник Multi-Timeframe Harmony Index построен по модульному принципу, с четким разделением между конфигурацией, основной логикой, отрисовкой интерфейса и вспомогательными утилитами. Такая организация делает советник легко адаптируемым и одновременно упрощает его дальнейшую поддержку. Структура построена по естественной логике торгового процесса:

Основа этой адаптивности – входные параметры, объявленные в верхней части скрипта. Для каждого поддерживаемого таймфрейма – M15, H1, H4 и D1 – предусмотрены и переключатель включения, и значение веса. Переключатель включения определяет, участвует ли данный таймфрейм в расчете индекса гармонии, а вес задает его относительный вклад. Рядом с этими настройками находятся пороги интерпретации, параметры сглаживания и переключатели, определяющие, будут ли включены алерты и сигналы на графике. Такая схема позволяет адаптировать советник и под скальперов, и под свинг-трейдеров, и под позиционных трейдеров.

input bool   Use_M15 = true;  input double Weight_M15 = 0.10;
input bool   Use_H1  = true;  input double Weight_H1  = 0.20;
input bool   Use_H4  = true;  input double Weight_H4  = 0.30;
input bool   Use_D1  = true;  input double Weight_D1  = 0.40;

input double StrongThreshold   = 0.8;
input double ModerateThreshold = 0.4;

input int    HI_EMA_Period = 8;

input bool   EnableAlerts  = true;
input bool   EnableSignals = true;

При запуске советника функция OnInit() подготавливает его рабочую среду. Включенные таймфреймы и их параметры сохраняются в едином массиве структур (tfs[]), что упрощает их дальнейшую обработку в цикле во время вычислений. Затем советник строит свою панель, сначала пытаясь создать объект прямоугольной метки, а если это не удается, для совместимости переключаясь на резервный фон на основе текстовых меток. Затем последовательно создаются заголовки, значения HI и метки по каждому таймфрейму; при этом генерируются уникальные имена объектов, чтобы несколько экземпляров не мешали друг другу. Инициализация завершается установкой таймера для периодического выполнения и немедленным вызовом UpdateHarmony(), чтобы панель сразу показывала актуальные данные.

ArrayResize(tfs,4);
tfs[0].tf = PERIOD_M15; tfs[0].enabled = Use_M15; tfs[0].weight = Weight_M15; tfs[0].name = "M15";
tfs[1].tf = PERIOD_H1;  tfs[1].enabled = Use_H1;  tfs[1].weight = Weight_H1;  tfs[1].name = "H1";
tfs[2].tf = PERIOD_H4;  tfs[2].enabled = Use_H4;  tfs[2].weight = Weight_H4;  tfs[2].name = "H4";
tfs[3].tf = PERIOD_D1;  tfs[3].enabled = Use_D1;  tfs[3].weight = Weight_D1;  tfs[3].name = "D1";

bool rect_created = TryCreateRectangle(...);
if(!rect_created) CreateBackgroundBlock(...);

EventSetTimer(MathMax(1, UpdateIntervalSec));
UpdateHarmony();

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

void OnTimer()
{
   UpdateHarmony();
}

for(int i=0; i<4; i++)
{
    if(!tfs[i].enabled || tfs[i].weight <= 0.0) { biases[i] = 0; continue; }
    int b = GetStructureBias(tfs[i].tf);
    biases[i] = b;
    sumWeighted += (double)b * tfs[i].weight;
    sumWeights += tfs[i].weight;
}

double hi = (sumWeights != 0.0) ? (sumWeighted / sumWeights) : 0.0;
double alpha = 2.0 / (HI_EMA_Period + 1.0);
if(hi_ema == 0.0) hi_ema = hi;
else hi_ema = (hi - hi_ema) * alpha + hi_ema;

Логика определения смещения в GetStructureBias() опирается на структуру Price Action, а не на данные индикаторов. Она анализирует три последних закрытых бара таймфрейма и проверяет, образуют ли максимумы и минимумы последовательную восходящую лестницу для бычьего смещения или нисходящую лестницу для медвежьего смещения. Если лестница не обнаружена, функция переходит к сравнению цен закрытия, фиксируя сдвиги импульса, которые могут не формировать строгие структурные паттерны.

int GetStructureBias(ENUM_TIMEFRAMES tf)
{
   MqlRates rates[];
   int copied = CopyRates(_Symbol, tf, 1, 4, rates);

   if(copied >= 3)
   {
      if(rates[0].high > rates[1].high && rates[1].high > rates[2].high &&
         rates[0].low  > rates[1].low  && rates[1].low  > rates[2].low)
         return +1;

      if(rates[0].high < rates[1].high && rates[1].high < rates[2].high &&
         rates[0].low  < rates[1].low  && rates[1].low  < rates[2].low)
         return -1;
   }
   return 0;
}

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

bool TryCreateRectangle(...);
bool CreateBackgroundBlock(...);
bool CreateLabel(...);

Подсистема алертов и нанесения сигналов сразу сообщает трейдерам о важных изменениях согласованности рынка. Алерты отправляются через систему Alert() терминала и, если это включено в MetaTrader 5, могут дополнительно передаваться как push-уведомления. Стрелки на графике точно отмечают места пересечения значимых бычьих или медвежьих порогов: они привязываются к максимуму или минимуму сигнального бара и слегка сдвигаются для лучшей читаемости. 

void SendAlert(string txt)
{
   Print("HarmonyIndexEA: ", txt);
   Alert(txt);
   SendNotification(txt);
}

void PlaceSignalArrow(bool isBuy, datetime barTime, double price)
{
    ObjectCreate(0, name, OBJ_ARROW, 0, barTime, price);
    ObjectSetInteger(0, name, OBJPROP_ARROWCODE, isBuy ? 233 : 234);
    ObjectSetInteger(0, name, OBJPROP_COLOR, isBuy ? clrGreen : clrRed);
}

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

void OnDeinit(const int reason)
{
   // Delete chart objects, arrows, globals
   EventKillTimer();
}

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


Пользовательские параметры и настройка

Индекс гармонии нескольких таймфреймов разработан так, чтобы адаптироваться к разным стилям торговли, рыночным условиям и предпочтениям трейдера за счет набора гибко настраиваемых входных параметров. Эти входные параметры определяют каждый аспект работы советника: от выбора таймфреймов для анализа до визуального оформления панели, правил, определяющих значимые состояния смещения, и поведения алертов и сигналов на графике. Настройка начинается с переключателей включения таймфреймов и их весов. Каждый из поддерживаемых таймфреймов – M15, H1, H4 и D1 – можно включать или отключать по отдельности. При включении таймфрейм участвует в расчете индекса гармонии (HI), внося собственное значение смещения. Вес таймфрейма определяет его относительное влияние в итоговом значении HI. Трейдеры могут сдвигать баланс HI в сторону младших таймфреймов для более чувствительных сигналов или в сторону старших таймфреймов для большей структурной устойчивости. Такая детализация делает инструмент полезным как для скальперов, которые ищут тонкую локальную согласованность, так и для свинг-трейдеров, ожидающих крупных структурных разворотов.

Пороги играют решающую роль в интерпретации исходного значения индекса гармонии. StrongThreshold определяет точку, выше которой смещение можно считать выраженно бычьим, а ниже – выраженно медвежьим, в зависимости от знака HI. Отдельный параметр ModerateThreshold задает состояния среднего диапазона и помогает замечать формирующуюся согласованность до того, как она наберет полную силу. Оба порога работают вместе со сглаженными значениями HI по EMA и определяют цветовую индикацию панели и условия срабатывания алертов. Параметр EMA Period управляет сглаживанием. Короткий период позволяет индексу гармонии быстро реагировать на новые изменения смещения, тогда как более длинный дает более медленные и стабильные сигналы за счет снижения чувствительности к шуму младших таймфреймов. Это мощный инструмент адаптации советника к разным условиям волатильности: в боковом и рваном рынке более длинный период сглаживания отсеивает ложные сигналы, а на трендовом рынке короткие периоды позволяют раньше подключаться к движению.

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

Имя параметра Тип По умолчанию Описание
Use_M15 bool true Включить анализ таймфрейма M15.
Weight_M15
double 0.10 Относительный вес M15 в расчете HI.
Use_H1
bool true Включить анализ таймфрейма H1.
Weight_H1
double 0.20 Относительный вес H1 в расчете HI.
Use_H4
bool true Включить анализ таймфрейма H4.
Weight_H4
double 0.3 Относительный вес H4 в расчете HI.
Use_D1
bool true Включить анализ таймфрейма D1.
Weight_D1
double 0.40 Относительный вес D1 в расчете HI.
StrongThreshold
double 0.8 Величина смещения, необходимая для значимого состояния.
ModerateThreshold
double 0.4 Величина смещения, необходимая для умеренного состояния.
HI_EMA_Period
int 8 Период сглаживания EMA, применяемого к HI.
EnableAlerts
bool true Включить алерты по порогам и смене смещения на таймфрейме.
EnableSignals
bool true Включить автоматические стрелки на графике при пересечении значимого порога.
UpdateIntervalSec
int 1 Число секунд между обновлениями и пересчетами панели.
MaxSignals
int 100 Максимальное количество стрелок, наносимых на график, чтобы избежать загромождения.

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


Тестирование и результаты

Чтобы оценить эффективность индекса гармонии в практических торговых сценариях, мы провели тесты как на демо-счете в реальном времени, так и в тестере стратегий на исторических данных.

Демо-тест на живом графике – индекс Volatility 75 (1s)

Первый тест проводился на демо-графике индекса Volatility 75 (1s) в реальном времени. За панелью индекса гармонии наблюдали в реальном времени, по мере появления согласованности между отслеживаемыми таймфреймами формировалось несколько сигналов.

Панель отображала:

  • текущее значение HI и его значение после сглаживания EMA;
  • значения смещения для каждого отслеживаемого таймфрейма (M15, H1, H4, D1);
  • соответствующие весовые коэффициенты;
  • итоговый взвешенный вклад в индекс гармонии.

Во время этого теста система зафиксировала несколько эпизодов согласованного медвежьего смещения. Стрелки Sell появлялись именно в тот момент, когда индекс гармонии пересекал отрицательный значимый порог, что подтверждало корректность сигнальной логики.

На рисунке выше показан демо-тест на живом графике индекса Volatility 75 (1s): несколько сигналов медвежьего смещения и вывод панели индекса гармонии.

Тестирование на исторических данных – GBPUSD, таймфрейм H1

Дополнительно было проведено тестирование на исторических данных в тестере стратегий для GBPUSD на таймфрейме H1, чтобы проверить инструмент в контексте рынка Forex. Результаты тестирования на исторических данных были положительными: система стабильно выявляла согласованность смещения между несколькими таймфреймами, а значения индекса гармонии после EMA-сглаживания оставались плавными. Эти результаты дополнительно подчеркивают высокий потенциал индекса гармонии как надежного компонента анализа Price Action на нескольких таймфреймах.

На рисунке выше показано тестирование на исторических данных GBPUSD (H1): панель индекса гармонии отслеживает состояния смещения и генерирует сигналы Buy/Sell.

И демо-тест, и тестирование на исторических данных показали точную классификацию смещения и своевременное нанесение сигналов на график. В разных рыночных условиях – на синтетическом индексе Volatility 75 и на основной валютной паре GBPUSD – индекс гармонии стабильно измерял направленную согласованность и давал полезную информацию как для дискреционных, так и для алгоритмических торговых систем.


Заключение

Индекс гармонии нескольких таймфреймов дает трейдерам Price Action удобный способ количественно оценивать и визуализировать согласованность трендов между таймфреймами. Сводя структурное смещение нескольких таймфреймов к единой взвешенной метрике и повышая наглядность за счет интуитивной цветовой индикации, пороговых состояний и EMA-сглаживания, советник превращает субъективную оценку в объективную и практически применимую информацию. Вместо разрозненных оценок по разным графикам трейдер теперь может видеть на единой панели, согласованы ли краткосрочные, среднесрочные и долгосрочные структуры или они конфликтуют. Такая ясность позволяет быстрее принимать решения, точнее фильтровать сделки и лучше интегрировать инструмент в автоматизированные стратегии. Благодаря гибкой архитектуре индекс гармонии можно адаптировать к широкому спектру торговых стилей – от высокочастотного скальпинга до позиционной торговли, просто меняя таймфреймы, веса, пороги и параметры сглаживания.

В контексте серии "Разработка инструментария для анализа Price Action" этот модуль выделяется своими аналитическими возможностями и совместимостью с другими системами. Экспорт значений индекса гармонии в "Глобальные переменные" означает, что он может служить основным фильтром тренда в более крупных торговых системах, поддерживая как алгоритмические, так и дискреционные сценарии работы. Модульная архитектура, надежная логика интерфейса и аккуратная очистка ресурсов при деинициализации делают его стабильным и удобным в работе на реальных счетах. В конечном счете сила индекса гармонии нескольких таймфреймов заключается в том, что он объединяет точность структурированного анализа Price Action с эффективностью автоматизации в реальном времени. Будь то самостоятельный инструмент поддержки принятия решений или часть более широкой торговой архитектуры, он позволяет свести сложную оценку по нескольким таймфреймам к одному понятному сигналу и действовать на его основе с уверенностью, подкрепленной количественно выраженным консенсусом.

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

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

Прикрепленные файлы |
Последние комментарии | Перейти к обсуждению на форуме трейдеров (5)
ayaghut
ayaghut | 4 нояб. 2025 в 09:46
Как должны быть настроены входы для скальпинга?
Christian Benjamin
Christian Benjamin | 4 нояб. 2025 в 10:54
ayaghut #:
Как следует настраивать входы для скальпинга?
Для скальпинга старайтесь использовать более низкие таймфреймы, например, M1 - M5, и устанавливайте более высокие веса на этих низких фреймах.
Для более быстрой реакции немного уменьшите длину сглаживания и порог смещения.
ayaghut
ayaghut | 4 нояб. 2025 в 17:39
Christian Benjamin #:
Для скальпинга старайтесь использовать более низкие таймфреймы, например M1 - M5, и устанавливайте более высокие веса на этих низких фреймах.
Для более быстрой реакции немного уменьшите длину сглаживания и порог смещения.
Не могли бы вы указать, какие пункты следует изменить, и сообщить мне точные суммы для M1?
Ing. Miguel
Ing. Miguel | 29 мая 2026 в 04:02

le hice algunas modificaciones. temporalidades por slots seleccionables y optimizacion de panel y codigo.....saludos y a probar!
[Удален] | 31 мая 2026 в 05:24
Весьма интересно, мне понравилось!!
Инжиниринг признаков для машинного обучения (Часть 1): дробное дифференцирование — стационарность без потери памяти Инжиниринг признаков для машинного обучения (Часть 1): дробное дифференцирование — стационарность без потери памяти
Целочисленное дифференцирование заставляет выбирать между стационарностью и памятью: доходности (d = 1) стационарны, но отбрасывают всю информацию об уровне цены; исходные цены (d = 0) сохраняют память, но нарушают предпосылку стационарности, важную для моделей машинного обучения. В статье реализован метод дробного дифференцирования с окном фиксированной ширины (FFD) из главы 5 AFML: get_weights_ffd — итеративная рекурсия с отсечением по порогу, frac_diff_ffd — ограниченное скалярное произведение для каждого бара, fracdiff_optimal — бинарный поиск минимального стационарного d*.
Переосмысливаем классические стратегии (Часть 16): Стратегия пробоя двойных полос Боллинджера Переосмысливаем классические стратегии (Часть 16): Стратегия пробоя двойных полос Боллинджера
Эта статья знакомит читателя с переосмысленной версией классической стратегии пробоев полос Боллинджера. В ней определены ключевые недостатки первоначального подхода, такие как его хорошо известная подверженность ложным пробоям. Цель статьи - представить возможное решение: торговую стратегию двойных полос Боллинджера (Double Bollinger Band). Этот относительно малоизвестный подход устраняет слабые места классической версии и предлагает более динамичный взгляд на финансовые рынки. Он помогает преодолеть старые ограничения, определенные первоначальными правилами, предлагая трейдерам более устойчивую и адаптивную систему.
Архитектура машинного обучения для MetaTrader 5 (Часть 13): Реализация расчета размера позиции в MQL5 Архитектура машинного обучения для MetaTrader 5 (Часть 13): Реализация расчета размера позиции в MQL5
Мы создаем набор инструментов промышленного уровня для расчета размера позиции в MQL5: утилиты, фрагменты кода и пользовательские функции, которые повторяют исходные реализации на Python. Методы охватывают преобразование вероятности в размер позиции с коррекцией перекрытия, динамический расчет размера позиции по прогнозной цене (калиброванные сигмоидальная и степенная функции с лимитной ценой), бюджетирование на основе текущей занятости портфеля и резервный метод расчета размера позиции на основе модели смеси (EF3M). Результат — размер позиции со знаком в диапазоне [−1, ..., 1] плюс диагностика, которую можно напрямую подключить к логике ордеров.
Опубликуйте код статьи в MQL5 Algo Forge за 10 минут: пошаговый гайд Опубликуйте код статьи в MQL5 Algo Forge за 10 минут: пошаговый гайд
Статья — пошаговое руководство по переносу кода из публикации в полноценный проект MQL5 Algo Forge. Вы настроите окружение и авторизацию в MetaEditor, создадите проект в Shared Projects, выберете тип, разложите файлы, добавите README.md, проверите кодировку и сборку, зафиксируете изменения в Git и откроете репозиторий публично. Материал помогает выстроить рабочую структуру и сохранить историю версий для удобства читателей.