Разработка инструментария для анализа движения цен (Часть 22): Панель корреляции
Содержание
Введение
Корреляция – это статистическая мера того, как две переменные движутся относительно друг друга. На финансовых рынках она показывает, в какой степени два инструмента растут и падают вместе (положительная корреляция) или движутся в противоположных направлениях (отрицательная корреляция). Важно понимать, что корреляция описывает взаимосвязь, а не причинно-следственную связь.В моей предыдущей статье я показал, как визуализировать корреляцию EURUSD и GBPUSD с помощью библиотек Python. Теперь я покажу, как создать пользовательский советник, который выводит анализ корреляции прямо в MetaTrader 5 в виде наглядной панели на графике. Этот инструмент создает панель, работающую в реальном времени, где отображаются значения корреляции между различными инструментами – валютами, товарами и не только – на выбранном таймфрейме.
Используя эту панель, трейдер получает более глубокое понимание того, как связаны движения цен на разных рынках. Независимо от того, движутся ли инструменты в тандеме, расходятся или ведут себя независимо, это помогает в следующем:
- управление рисками портфеля (за счет избегания избыточной экспозиции в коррелирующих сделках);
- поиск потенциальных хеджей или парных сделок;
- повышение диверсификации;
- выявление изменений рыночной динамики при изменении корреляций.

Рис. 1. Взаимосвязь между парами
Первая диаграмма показывает, что EURUSD и GBPUSD обычно движутся вместе: когда EURUSD растет, GBPUSD тоже растет. Это называется сильной положительной корреляцией (прямой зависимостью). Вторая диаграмма показывает, как EURUSD и USDCHF движутся в противоположных направлениях: когда EURUSD растет, USDCHF падает. Это сильная отрицательная корреляция (обратная зависимость). Когда две пары не движутся ни вместе, ни в противоположных направлениях, их считают некоррелированными или независимыми.
Обзор стратегии
Советник Correlation Dashboard постоянно получает последние N значений цен закрытия для каждой пары из списка и преобразует их в простые доходности. Затем он вычисляет коэффициент Пирсона r для каждой уникальной пары инструментов и выводит эти значения на график в виде матрицы (тепловой карты), где цвет ячеек показывает силу и знак корреляции. Советник выводит каждое значение r и классифицирует его как сильную положительную, умеренную, отсутствующую, умеренную отрицательную или сильную отрицательную корреляцию. Он также выводит интерпретацию с практическими рекомендациями – хеджировать, подтверждать сигнал, диверсифицировать или использовать спред – и отправляет алерты, когда какая-либо корреляция превышает заданный порог.
Одного взгляда достаточно, чтобы увидеть, какие рынки движутся вместе, какие – врозь, а какие остаются независимыми, и затем уверенно корректировать позиции. Коэффициент корреляции Пирсона (r) рассчитывается следующим образом. Ниже приведен код MQL5, который выполняет этот расчет:
//+------------------------------------------------------------------+ //| Pearson correlation | //+------------------------------------------------------------------+ double CalcCorrelation(const string s1, const string s2) { double a1[], a2[]; // Fetch closing prices if(CopyClose(s1, TimeFrame, 0, LookbackBars, a1) < LookbackBars || CopyClose(s2, TimeFrame, 0, LookbackBars, a2) < LookbackBars) return(0); int n = LookbackBars - 1; double r1[], r2[]; ArrayResize(r1, n); ArrayResize(r2, n); // Compute simple returns for(int k = 1; k < LookbackBars; k++) { r1[k-1] = (a1[k] - a1[k-1]) / a1[k-1]; r2[k-1] = (a2[k] - a2[k-1]) / a2[k-1]; } // Calculate means double m1 = AverageArray(r1); double m2 = AverageArray(r2); // Build covariance numerator and variances double num = 0, d1 = 0, d2 = 0; for(int i = 0; i < n; i++) { double da = r1[i] - m1; double db = r2[i] - m2; num += da * db; // covariance sum d1 += da * da; // variance of series 1 d2 += db * db; // variance of series 2 } // Return r (or 0 if division by zero) return (d1 > 0 && d2 > 0) ? num / MathSqrt(d1 * d2) : 0; }
- Сильная положительная корреляция (r >= 0.8)
Интерпретация: Когда EURUSD растет на 1%, GBPUSD в среднем тоже растет примерно на 0,85%. Если по EURUSD появляется сигнал на покупку, его обычно подтверждает GBPUSD, поэтому эти пары стоит рассматривать как единый кластер, избегать взаимно компенсирующих позиций и при необходимости использовать одну как хедж для другой.
- Сильная отрицательная корреляция (r <= -0.8)
Интерпретация: Рост EURUSD на 1% совпадает с падением USDCHF на 0,92%. Вы можете использовать межрыночные спреды (покупка EURUSD и продажа USDCHF), чтобы отрабатывать относительное движение и при этом нейтрализовать общий направленный риск, либо отслеживать дивергенции как предупреждение об ослаблении текущего импульса.
- Отсутствие корреляции (модуль r < 0.5)
Интерпретация: Изменения AUDUSD почти не дают никакой прогностической информации для USDJPY, и наоборот. Такие "независимые" пары хорошо подходят для диверсификации: добавление их в корзину сглаживает волатильность портфеля без скрытого направленного смещения.

Рис. 2. Панель корреляций
На рисунке 2 выше показан интерфейс, который мы собираемся создать: таблица со значениями корреляции, обозначаемыми как "x", в диапазоне от -1 до +1.
Разбор кода MQL5
Мы начинаем, как обычно в разработке на MQL5, с задания базовых характеристик программы через начальные директивы и подключения необходимых библиотек. Эти строки задают стандартные директивы #property для идентификации и контроля версий, добавляя необходимые метаданные, которые видны в терминале MetaTrader 5.//+------------------------------------------------------------------+ //| Correlation Dashboard.mq5| //| Copyright 2025, MetaQuotes Ltd.| //| https://www.mql5.com/ru/users/lynnchris| //+------------------------------------------------------------------+ #property copyright "Copyright 2025, MetaQuotes Ltd." #property link "https://www.mql5.com/ru/users/lynnchris" #property version "1.0" #property strictВажный элемент здесь – директива #property strict, которая включает более строгие правила компиляции. Такой подход настоятельно рекомендуется, потому что помогает выявлять потенциальные ошибки на ранних этапах разработки и в итоге делает код более надежным и устойчивым. После этих директив подключается библиотека <Trade\Trade.mqh>:
#include <Trade\Trade.mqh>
Хотя этот советник предназначен прежде всего для анализа, а не для автоматической торговли, подключение этой библиотеки дает доступ к широкому набору функций и классов для управления торговлей. Это оставляет возможности для будущих доработок или интеграции в более крупную торговую систему.
Прежде чем рассчитывать и интерпретировать корреляции, нам нужны базовые вспомогательные элементы. Здесь в дело и вступают наши вспомогательные функции. Функция AverageArray нужна для вычисления среднего значения набора данных – это один из шагов в формуле корреляции.
//+------------------------------------------------------------------+ //| Utility: average of an array | //+------------------------------------------------------------------+ double AverageArray(const double &arr[]) { int sz = ArraySize(arr); if(sz == 0) return(0); double sum = 0; for(int i = 0; i < sz; i++) sum += arr[i]; return(sum / sz); }
Выходя за рамки чисел, функция InterpretCorrelation берет рассчитанный коэффициент корреляции и превращает его в более понятное описание. На основе заданных порогов она классифицирует силу и направление связи, используя формулировки вроде "strong positive" или "weak or no correlation".
//+------------------------------------------------------------------+ //| Interpret raw correlation | //+------------------------------------------------------------------+ string InterpretCorrelation(double r) { if(r >= 0.8) return("strong positive correlation"); if(r >= 0.5) return("moderate positive correlation"); if(r > -0.5) return("weak or no correlation"); if(r > -0.8) return("moderate negative correlation"); return("strong negative correlation"); }
Опираясь на эту интерпретацию, функция RecommendAction дает практические комментарии и подсказывает возможные торговые выводы на основе наблюдаемой корреляции между двумя конкретными инструментами. Иными словами, она превращает статистику в прикладные рекомендации.
//+------------------------------------------------------------------+ //| Recommend trading action based on r | //+------------------------------------------------------------------+ string RecommendAction(double r, const string s1, const string s2) { if(r >= 0.8) return("They move almost in lock-step. Avoid opposite positions; use one as hedge."); if(r >= 0.5) return("Tendency to move together. Be cautious opening offset trades—seek confirmation."); if(r > -0.5) return("Little to no relation: ideal for diversification."); if(r > -0.8) return("Often move in opposition. Consider small inter-market spreads."); return("Very strong inverse relationship—candidate for statistical arbitrage."); }
Чтобы панель корреляций можно было настроить под разные торговые предпочтения и аналитические задачи, предусмотрен набор входных параметров, которые пользователь настраивает в окне свойств советника.
//+------------------------------------------------------------------+ //| Inputs | //+------------------------------------------------------------------+ input string InstrumentsList = "EURUSD,GBPUSD,USDJPY,USDCHF,AUDUSD,NZDUSD,XAUUSD"; input ENUM_TIMEFRAMES TimeFrame = PERIOD_H1; input int LookbackBars = 100; // bars for correlation input double AlertThreshold = 0.8; // threshold for alerts input int UpdateSeconds = 5; // timer interval // Notifications input bool UsePushNotifications = true; input bool UseEmailAlerts = false;
Сначала через InstrumentsList пользователь задает набор активов для анализа – простой строкой с символами, разделенными запятыми. Затем выбирается TimeFrame для анализа, который определяет детализацию используемых исторических данных. Параметр LookbackBars позволяет задать длину исторического периода, который будет учитываться при расчете корреляции. Параметр AlertThreshold позволяет задать уровень значимости корреляции, при превышении которого будет отправляться уведомление. Наконец, UpdateSeconds задает, как часто советник пересчитывает значения и обновляет панель, а UsePushNotifications и UseEmailAlerts позволяют выбрать предпочтительные способы получения алертов.
Чтобы важные данные были доступны из разных частей советника, мы объявляем несколько глобальных переменных.
//+------------------------------------------------------------------+ //| Globals | //+------------------------------------------------------------------+ string Instruments[]; double CorrArray[]; int InstrumentCount;
Массив Instruments будет хранить отдельные имена символов после их разбора из пользовательского списка. Массив CorrArray хранит рассчитанные попарные коэффициенты корреляции и организован так, чтобы к корреляции любой пары инструментов можно было легко обратиться. Простая целочисленная переменная InstrumentCount отслеживает, сколько символов участвует в анализе.
Когда советник прикрепляется к графику, первой выполняется функция OnInit, которая подготавливает все необходимое для работы. Сначала она разбирает InstrumentsList, чтобы заполнить массив Instruments, а затем проверяет, что задано не менее двух символов, поскольку для корреляции нужна пара.
//+------------------------------------------------------------------+ //| Expert initialization | //+------------------------------------------------------------------+ int OnInit() { // parse & select instruments InstrumentCount = StringSplit(InstrumentsList, ',', Instruments); if(InstrumentCount < 2) { Print("Error: need at least two symbols."); return(INIT_FAILED); } for(int i = 0; i < InstrumentCount; i++) SymbolSelect(Instruments[i], true);
Затем с помощью SymbolSelect она проверяет, что в MetaTrader доступны данные по всем указанным символам. Затем массив CorrArray получает нужный размер для хранения всех попарных корреляций.
// allocate storage ArrayResize(CorrArray, InstrumentCount * InstrumentCount);
Ключевой шаг здесь – вызов DrawDashboard, который отрисовывает на графике начальное представление матрицы корреляции.
// draw dashboard & start timer
DrawDashboard(); Чтобы панель оставалась динамичной, используется EventSetTimer, который планирует периодические вызовы функции OnTimer и тем самым запускает цикл обновления.
EventSetTimer(UpdateSeconds); return(INIT_SUCCEEDED); }
Если какой-либо из этапов инициализации не удается, например если задано меньше двух символов, OnInit возвращает INIT_FAILED и не позволяет советнику запуститься.
Когда советник удаляют с графика или закрывают терминал, выполняется функция OnDeinit, которая отвечает за очистку.
//+------------------------------------------------------------------+ //| Expert deinitialization | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { EventKillTimer(); ClearObjects(); }
Ее основные задачи – остановить периодический таймер через EventKillTimer(), чтобы прекратить дальнейшее выполнение логики обновления, и удалить с графика все графические объекты, созданные советником, с помощью ClearObjects(). После этого график остается в чистом состоянии.
Функция OnTimer является основой динамического поведения советника и автоматически срабатывает с интервалом, заданным пользователем. При срабатывании сначала вызывается UpdateCorrelations(), чтобы обновить все расчеты корреляции по последним данным.
//+------------------------------------------------------------------+ //| Timer: update, interpret, display, alert | //+------------------------------------------------------------------+ void OnTimer() { UpdateCorrelations();
После этого функция проходит по каждой уникальной паре инструментов, получает их корреляцию и с помощью вспомогательных функций формирует интерпретацию и торговые рекомендации, которые затем выводятся во вкладку "Эксперты".
// interpret & advise for each unique pair for(int i = 0; i < InstrumentCount; i++) for(int j = i + 1; j < InstrumentCount; j++) { double r = CorrArray[i * InstrumentCount + j]; string cat = InterpretCorrelation(r); string tip = RecommendAction(r, Instruments[i], Instruments[j]); PrintFormat( "%s vs %s \xBB r=%.2f: %s; Advice: %s", Instruments[i], Instruments[j], r, cat, tip ); }
После обработки данных вызывается RefreshValues(), чтобы обновить визуальную панель на графике: отобразить новые коэффициенты корреляции и скорректировать цветовую кодировку.
RefreshValues();
Наконец, вызовом CheckAlerts() проверяется, не пересекла ли какая-либо из корреляций заданный порог AlertThreshold(). Если это так, отправляются уведомления.
CheckAlerts(); }
Основная аналитическая работа выполняется функциями расчета корреляции. UpdateCorrelations() выступает координатором: она проходит по всем возможным парам инструментов, вызывает для каждой пары CalcCorrelation и сохраняет полученный коэффициент в CorrArray.
//+------------------------------------------------------------------+ //| Compute pairwise correlations | //+------------------------------------------------------------------+ void UpdateCorrelations() { for(int i = 0; i < InstrumentCount; i++) for(int j = 0; j < InstrumentCount; j++) CorrArray[i * InstrumentCount + j] = CalcCorrelation(Instruments[i], Instruments[j]); }
Функция CalcCorrelation (const string s1, const string s2) выполняет основное статистическое вычисление. Она получает исторические данные по ценам закрытия для обоих инструментов за период LookbackBars с помощью CopyClose.
//+------------------------------------------------------------------+ //| Pearson correlation | //+------------------------------------------------------------------+ double CalcCorrelation(const string s1, const string s2) { double a1[], a2[]; if(CopyClose(s1, TimeFrame, 0, LookbackBars, a1) < LookbackBars || CopyClose(s2, TimeFrame, 0, LookbackBars, a2) < LookbackBars) return(0);Чтобы получить показатель, более подходящий для финансовых данных, функция рассчитывает процентное изменение цены между соседними барами.
int n = LookbackBars - 1; double r1[], r2[]; ArrayResize(r1, n); ArrayResize(r2, n); for(int k = 1; k < LookbackBars; k++) { r1[k-1] = (a1[k] - a1[k-1]) / a1[k-1]; r2[k-1] = (a2[k] - a2[k-1]) / a2[k-1]; }Используя эти нормализованные изменения цены, функция вычисляет коэффициент корреляции Пирсона, тем самым количественно оценивая линейную зависимость между двумя временными рядами.
double m1 = AverageArray(r1), m2 = AverageArray(r2); double num = 0, d1 = 0, d2 = 0; for(int k = 0; k < n; k++) { double da = r1[k] - m1; double db = r2[k] - m2; num += da * db; d1 += da * da; d2 += db * db; } return (d1 > 0 && d2 > 0) ? num / MathSqrt(d1 * d2) : 0; }
Здесь также предусмотрена проверка на случай отсутствия изменения цены, чтобы избежать деления на ноль.
За работу визуальной панели отвечает несколько функций. DrawDashboard отвечает за первоначальное построение графического макета во время инициализации: создает структуру матрицы с метками символов и областями-заполнителями для значений корреляции.//+------------------------------------------------------------------+ //| Draw static dashboard | //+------------------------------------------------------------------+ void DrawDashboard() { ClearObjects(); const int x0 = 20, y0 = 40, dx = 100, dy = 25; CreateLabel("hdr", x0, y0-30, "Correlation Dashboard", clrWhite, 14); // column headers for(int j = 0; j < InstrumentCount; j++) CreateLabel( StringFormat("col_%d", j), x0 + (j+1)*dx, y0, Instruments[j], clrYellow, 10 ); // row headers & cells for(int i = 0; i < InstrumentCount; i++) { CreateLabel( StringFormat("row_%d", i), x0, y0 + (i+1)*dy, Instruments[i], clrYellow, 10 ); for(int j = 0; j < InstrumentCount; j++) { string rect = StringFormat("r_%d_%d", i, j); ObjectCreate(0, rect, OBJ_RECTANGLE_LABEL, 0, 0, 0); ObjectSetInteger(0, rect, OBJPROP_XDISTANCE, x0 + (j+1)*dx - 5); ObjectSetInteger(0, rect, OBJPROP_YDISTANCE, y0 + (i+1)*dy - 12); ObjectSetInteger(0, rect, OBJPROP_XSIZE, dx); ObjectSetInteger(0, rect, OBJPROP_YSIZE, dy); CreateLabel( StringFormat("val_%d_%d", i, j), x0 + (j+1)*dx, y0 + (i+1)*dy, "--", clrWhite, 9 ); } } }ClearObjects() – это вспомогательная функция, которая удаляет с графика все объекты, созданные советником. Она используется при деинициализации и, при необходимости, перед повторной отрисовкой.
//+------------------------------------------------------------------+ //| Clear all chart objects | //+------------------------------------------------------------------+ void ClearObjects() { for(int i = ObjectsTotal(0)-1; i >= 0; i--) ObjectDelete(0, ObjectName(0, i)); }
RefreshValues() – это функция, которую OnTimer периодически вызывает для обновления отображения. Она получает последние значения корреляции и динамически меняет цвет фона и текста в ячейках панели, формируя тепловую карту, по которой можно быстро определить сильные положительные и отрицательные корреляции.
//+------------------------------------------------------------------+ //| Refresh heat-map values & colors | //+------------------------------------------------------------------+ void RefreshValues() { for(int i = 0; i < InstrumentCount; i++) for(int j = 0; j < InstrumentCount; j++) { double v = CorrArray[i * InstrumentCount + j]; color bg = (v > 0.8 ? clrGreen : v > 0.5 ? clrLightGreen : v < -0.5 ? clrRed : clrLightCoral); color fg = (v >= 0 ? clrLime : clrRed); string rect = StringFormat("r_%d_%d", i, j); if(ObjectFind(0, rect) != -1) ObjectSetInteger(0, rect, OBJPROP_COLOR, bg); string lbl = StringFormat("val_%d_%d", i, j); if(ObjectFind(0, lbl) != -1) { ObjectSetString(0, lbl, OBJPROP_TEXT, DoubleToString(v, 2)); ObjectSetInteger(0, lbl, OBJPROP_COLOR, fg); } } }
Чтобы пользователь не пропускал важные изменения в рыночных взаимосвязях, в функции CheckAlerts реализован механизм алертов.
//+------------------------------------------------------------------+ //| Alert on threshold & notify | //+------------------------------------------------------------------+ void CheckAlerts() { for(int i = 1; i < InstrumentCount; i++) { double v = CorrArray[i]; // Potential issue here, likely intended CorrArray[0 * InstrumentCount + i] if(v >= AlertThreshold) // Only checks for positive correlation >= threshold { string msg = StringFormat( "High correlation: %s vs %s = %.2f", Instruments[0], Instruments[i], v ); Alert(msg); Print(msg); if(UsePushNotifications) SendNotification(msg); if(UseEmailAlerts) SendMail("Correlation Alert", msg); } } }
Эта функция отслеживает корреляцию между первым символом из пользовательского списка и всеми остальными инструментами. Если корреляция достигает или превышает AlertThreshold (в текущей реализации – только выше положительного порога, хотя логику легко расширить и на сильные отрицательные корреляции, если проверять абсолютное значение), функция запускает уведомление. Для этого формируется понятное сообщение с указанием пары и значения корреляции, выводится стандартный алерт MetaTrader 5, сообщение печатается во вкладку "Эксперты" и, при необходимости, отправляются push-уведомления или письма на электронную почту в соответствии с настройками пользователя.
Примечание: Как отмечено в комментарии к коду, в этой функции, похоже, есть потенциальная проблема с индексацией в CorrArray[i]: вероятно, здесь предполагался доступ к корреляции между Instruments[0] и Instruments[i]. Кроме того, сейчас функция отправляет алерты только по положительным корреляциям, превышающим порог; для оповещений о сильных отрицательных корреляциях нужно проверять абсолютное значение.
Результат
При запуске на реальных данных советник сразу отрисовывает панель. Он начинает показывать актуальные значения корреляции: зеленым – для положительных связей, красным – для обратных. Отображение обновляется через заданный интервал. Во вкладке "Эксперты" фиксируется каждый коэффициент. Для каждого значения также выводилась краткая интерпретация. Такой подход позволяет сразу видеть и сами числа, и их практический смысл, ничего не упуская.2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) EURUSD vs USDJPY → r=-0.79: moderate negative correlation; Advice: Often move in opposition. Consider small inter-market spreads. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) EURUSD vs USDCHF → r=-0.80: moderate negative correlation; Advice: Often move in opposition. Consider small inter-market spreads. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) EURUSD vs AUDUSD → r=0.48: weak or no correlation; Advice: Little to no relation: ideal for diversification. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) EURUSD vs NZDUSD → r=0.57: moderate positive correlation; Advice: Tendency to move together. Be cautious opening offset trades—seek confirmation. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) EURUSD vs XAUUSD → r=0.11: weak or no correlation; Advice: Little to no relation: ideal for diversification. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) GBPUSD vs USDJPY → r=-0.71: moderate negative correlation; Advice: Often move in opposition. Consider small inter-market spreads. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) GBPUSD vs USDCHF → r=-0.63: moderate negative correlation; Advice: Often move in opposition. Consider small inter-market spreads. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) GBPUSD vs AUDUSD → r=0.54: moderate positive correlation; Advice: Tendency to move together. Be cautious opening offset trades—seek confirmation. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) GBPUSD vs NZDUSD → r=0.63: moderate positive correlation; Advice: Tendency to move together. Be cautious opening offset trades—seek confirmation. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) GBPUSD vs XAUUSD → r=0.11: weak or no correlation; Advice: Little to no relation: ideal for diversification. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) USDJPY vs USDCHF → r=0.75: moderate positive correlation; Advice: Tendency to move together. Be cautious opening offset trades—seek confirmation. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) USDJPY vs AUDUSD → r=-0.33: weak or no correlation; Advice: Little to no relation: ideal for diversification. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) USDJPY vs NZDUSD → r=-0.47: weak or no correlation; Advice: Little to no relation: ideal for diversification. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) USDJPY vs XAUUSD → r=-0.04: weak or no correlation; Advice: Little to no relation: ideal for diversification. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) USDCHF vs AUDUSD → r=-0.24: weak or no correlation; Advice: Little to no relation: ideal for diversification. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) USDCHF vs NZDUSD → r=-0.32: weak or no correlation; Advice: Little to no relation: ideal for diversification. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) USDCHF vs XAUUSD → r=0.05: weak or no correlation; Advice: Little to no relation: ideal for diversification. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) AUDUSD vs NZDUSD → r=0.87: strong positive correlation; Advice: They move almost in lock-step. Avoid opposite positions; use one as hedge. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) AUDUSD vs XAUUSD → r=0.08: weak or no correlation; Advice: Little to no relation: ideal for diversification. 2025.05.08 02:05:03.019 Correlation Dashboard (GBPUSD,M30) NZDUSD vs XAUUSD → r=0.11: weak or no correlation; Advice: Little to no relation: ideal for diversification.
Приведенная выше информация взята из лога вкладки "Эксперты", где фиксируется каждая вновь обнаруженная корреляция. Я выделил самые сильные связи – те, у которых r ≤ –0.8 (сильная отрицательная) и r ≥ +0.8 (сильная положительная). Ниже для наглядности показана панель на графике.

Рисунок 3. Панель корреляций
NZDUSD и AUDUSD демонстрируют сильную положительную корреляцию, то есть движутся в тандеме с почти одинаковой ценовой динамикой. Ниже мы сравним их движение цены в реальном времени бок о бок, чтобы убедиться, что показания панели корреляций точно отражают происходящее на рынке.

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

Рисунок 5. Умеренная отрицательная корреляция
Заключение
Советник Correlation Dashboard дает ценное представление о движении цен между разными парами, без необходимости переключаться между графиками. Показывая взаимосвязи в реальном времени, он помогает заранее замечать изменения на рынке между разными инструментами и принимать более взвешенные торговые решения. Панель на графике и логи во вкладке "Эксперты" могут выглядеть довольно просто, но они ясно показывают основную функциональность: автоматически обновляющуюся панель с цветовой маркировкой коэффициентов и поясняющими сообщениями. Внешний вид интерфейса легко изменить или расширить, но ключевая аналитика уже реализована. Буду рад вопросам и предложениям!
| Дата | Название инструмента | Описание | Версия | Обновления | Примечания |
|---|---|---|---|---|---|
| 01/10/24 | Chart Projector | Скрипт для наложения эффекта призрака на движение цены за предыдущий день | 1.0 | Первоначальная версия | Инструмент номер 1 |
| 18/11/24 | Analytical Comment | Предоставляет информацию за предыдущий день в табличном формате, а также прогнозирует будущее направление рынка | 1.0 | Первоначальная версия | Инструмент номер 2 |
| 27/11/24 | Analytics Master | Регулярное обновление рыночных показателей каждые два часа | 1.01 | Вторая версия | Инструмент номер 3 |
| 02/12/24 | Analytics Forecaster | Регулярное обновление рыночных показателей каждые два часа с интеграцией с Telegram | 1.1 | Третья версия | Инструмент номер 4 |
| 09/12/24 | Volatility Navigator | Советник анализирует рыночные условия с помощью полос Боллинджера, RSI и ATR | 1.0 | Первоначальная версия | Инструмент номер 5 |
| 19/12/24 | Mean Reversion Signal Reaper | Анализирует рынок и генерирует сигналы, используя стратегию возврата к среднему | 1.0 | Первоначальная версия | Инструмент номер 6 |
| 9/01/25 | Signal Pulse | Анализирует несколько таймфреймов | 1.0 | Первоначальная версия | Инструмент номер 7 |
| 17/01/25 | Metrics Board | Панель с кнопками для анализа | 1.0 | Первоначальная версия | Инструмент номер 8 |
| 21/01/25 | External Flow | Аналитика с помощью внешних библиотек | 1.0 | Первоначальная версия | Инструмент номер 9 |
| 27/01/25 | VWAP | Взвешенная по объему средняя цена | 1.3 | Первоначальная версия | Инструмент номер 10 |
| 02/02/25 | Heikin Ashi | Сглаживание тренда и идентификация сигналов разворота | 1.0 | Первоначальная версия | Инструмент номер 11 |
| 04/02/25 | FibVWAP | Генерация сигналов с помощью анализа Python | 1.0 | Первоначальная версия | Инструмент номер 12 |
| 14/02/25 | RSI DIVERGENCE | Дивергенция цены и RSI | 1.0 | Первоначальная версия | Инструмент номер 13 |
| 17/02/25 | Parabolic Stop and Reverse (PSAR) | Автоматизация стратегии PSAR | 1.0 | Первоначальная версия | Инструмент номер 14 |
| 20/02/25 | Скрипт Quarters Drawer | Нанесение уровней четвертей на график | 1.0 | Первоначальная версия | Инструмент номер 15 |
| 27/02/25 | Intrusion Detector | Обнаружение и оповещение о достижении ценой уровней четвертей | 1.0 | Первоначальная версия | Инструмент номер 16 |
| 27/02/25 | TrendLoom Tool | Панель мультитаймфреймового анализа | 1.0 | Первоначальная версия | Инструмент номер 17 |
| 11/03/25 | Quarters Board | Панель с кнопками для включения/отключения уровней четвертей | 1.0 | Первоначальная версия | Инструмент номер 18 |
| 26/03/25 | ZigZag Analyzer | Построение линий тренда с помощью индикатора ZigZag | 1.0 | Первоначальная версия | Инструмент номер 19 |
| 10/04/25 | Correlation Pathfinder | Построение графиков корреляции валютных курсов с использованием библиотек Python. | 1.0 | Первоначальная версия | Инструмент номер 20 |
| 23/04/25 | Market Structure Flip Detector Tool | Поиск разворотов рыночной структуры | 1.0 | Первоначальная версия | Инструмент номер 21 |
| 08/05/25 | Correlation Dashboard | Корреляции между разными парами | 1.0 | Первоначальная версия | Инструмент номер 22 |
Перевод с английского произведен MetaQuotes Ltd.
Оригинальная статья: https://www.mql5.com/en/articles/18052
Предупреждение: все права на данные материалы принадлежат MetaQuotes Ltd. Полная или частичная перепечатка запрещена.
Данная статья написана пользователем сайта и отражает его личную точку зрения. Компания MetaQuotes Ltd не несет ответственности за достоверность представленной информации, а также за возможные последствия использования описанных решений, стратегий или рекомендаций.
Неопределенность как модель (Часть 4): Случайные процессы — динамика неопределённости
Создание самооптимизирующихся советников на MQL5 (Часть 9): Двойное пересечение скользящих средних
Реализация LLM-агента с SQL-памятью в MetaTrader 5
Преодоление проблем доступности в торговых инструментах на MQL5 (Часть I): Как добавить контекстные голосовые оповещения в индикаторы MQL5
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Ознакомьтесь с новой статьей: Разработка инструментария для анализа Price Action (часть 22): панель корреляции.
Автор: Кристиан Бенджамин
Это хорошо, как много