English Deutsch 日本語
preview
价格行为分析工具包开发(第 22 部分):相关性仪表盘

价格行为分析工具包开发(第 22 部分):相关性仪表盘

MetaTrader 5指标 |
47 2
Christian Benjamin
Christian Benjamin

内容


引言

相关性是衡量两个变量如何相对变动的统计量。在金融市场中,其反映了两种金融工具一起上涨或下跌(正相关)或朝相反方向运动(负相关)的程度。值得一提的是,相关性描述的是相互关系,而非因果关系。
在我之前的文章中,我展示了如何使用Python库绘制EURUSD–GBPUSD的相关性。现在,我将指导您创建一个自定义EA,它可以直接在MetaTrader 5中提供相关性分析,并具有实用的图表可视化功能。该工具会创建一个实时仪表盘,显示选定时间范围内各种金融工具(货币、大宗商品等)之间的相关系数。
通过使用此仪表盘,交易者可以更深入地理解不同市场价格走势之间的相互作用。无论这些金融工具是同步显著分化还是独立运行,这些特性都有助于:
  • 管理投资组合风险(通过避免对相关交易过度敞口)
  • 识别潜在的对冲或配对交易机会
  • 增强分散化投资
  • 在相关性发生变化时发现市场动态的转移。

图 1. 货币对关系

第一张图展示了EURUSD和GBPUSD倾向于一起运动:当EURUSD上涨时,GBPUSD也会上涨。这被称为强正相关或正比例关系。第二张图展示了EURUSD和USDCHF朝相反方向运动:随着EURUSD上涨,USDCHF下跌。这是强负相关(反比例关系)。当两个货币对既不一起运动也不相互对立时,我们称它们为不相关或独立。


策略概览

相关性仪表盘EA可持续提取列表中每个货币对最近的N个收盘价,并将它们转换为简单收益率。然后,它分别计算每个货币对的皮尔逊 r 值,并将这些值绘制为图表上的热力图矩阵,用彩色单元格显示强度和符号。EA覆盖每个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 和 GBPUSD,r = 0.85
解读:当 EURUSD 上涨 1% 时,GBPUSD 往往平均也会上涨 0.85%。EURUSD 的买入信号实际上被 GBPUSD 强化,因此你可以将它们视为一类集合,避免持有相反的头寸,并考虑用其中一个对另一个进行对冲。
  • 强负相关 (r ≤ –0.8)
示例:EURUSD 和 USDCHF,r = –0.92
解读:EURUSD 上涨 1% 通常伴随着 USDCHF 下跌 0.92%。你可以运行跨市场价差(买入 EURUSD,卖出 USDCHF)以捕捉相对波动,同时中和单纯的方向性敞口,或者密切关注背离情况,以此作为市场信心减弱的预警。
  • 不相关 (|r| < 0.5)
示例:AUDUSD 和 USDJPY,r = 0.10

解读:AUDUSD 的变化几乎无法预测 USDJPY 的走势,反之亦然。这些“独立”货币对是理想的分散化投资候选者——将它们加入你的投资组合可以在不引入潜在方向性偏好的情况下,平滑投资组合的波动性。

图 2. 仪表盘

上图 2 展示了我们旨在构建的界面:一个显示相关系数的表格,用“x”表示,其范围从 -1 到 +1。



MQL5 代码剖析

按照 MQL5 开发的惯例,我们首先通过初始指令定义程序的基本特征,并包含必要的库。这些代码行建立了标准的 #property 指令,用于标识和版本控制,提供了在 MetaTrader 5 终端中可见的基本元数据。
//+------------------------------------------------------------------+
//|                                         Correlation Dashboard.mq5|
//|                                   Copyright 2025, MetaQuotes Ltd.|
//|                           https://www.mql5.com/en/users/lynnchris|
//+------------------------------------------------------------------+
#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link      "https://www.mql5.com/en/users/lynnchris"
#property version   "1.0"
#property strict
这里的关键元素是 property strict,包含它是为了强制执行严格的编译规则。强烈建议采用这种做法,因为它有助于在开发过程的早期捕捉潜在的编码错误,从而生成更健壮、更可靠的代码。在这些指令之后,我们包含了 <Trade\Trade.mqh> 库:
#include <Trade\Trade.mqh>

虽然该特定 EA 专注于分析而非自动交易,但包含该库可以访问与交易管理相关的全面函数和类套件,为未来的增强或集成到更大的交易系统保留了可能性。

在能够有效计算和解释相关性之前,我们需要一些基础构建块。这正是我们的实用函数发挥作用的地方。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 函数获取计算出的相关系数,并将其转换为更直观的描述,根据预定义的阈值,用“强正相关”或“弱或不相关”等术语来分类关系的强度和方向。

//+------------------------------------------------------------------+
//| 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.");
  }

为了使相关性仪表盘能够适应各种交易偏好和分析需求,我们提供了一组输入参数,用户可以通过 EA 的属性窗口进行配置。

//+------------------------------------------------------------------+
//| 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 设置 EA 重新计算和更新仪表盘的频率,而 UsePushNotificationsUseEmailAlerts 提供对首选警报接收方法的控制。

为了确保关键数据可以在 EA 的不同部分访问,我们声明了一些全局变量。

//+------------------------------------------------------------------+
//| Globals                                                          |
//+------------------------------------------------------------------+
string Instruments[];
double CorrArray[];
int    InstrumentCount;

Instruments 数组将在从用户输入列表解析后存储单个交易对象名称。CorrArray 是一个专用数组,用于保存计算出的成对相关系数,其组织方式便于访问任何两个工具之间的相关性。一个简单的整数 InstrumentCount 跟踪正在分析的符号数量。

当EA附加到图表时,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,从而阻止 EA 运行。

当不再需要 EA 并将其从图表中删除或关闭终端时,将执行 OnDeinit 函数以执行必要的清理工作。

//+------------------------------------------------------------------+
//| Expert deinitialization                                          |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   EventKillTimer();
   ClearObjects();
  }

其主要任务是使用 EventKillTimer() 停止定期计时器,以防止进一步执行更新逻辑,并使用 ClearObjects() 从图表中删除 EA 创建的所有图形对象,使图表保持干净状态。

OnTimer 函数作为 EA 动态行为的引擎,会按照用户指定的时间间隔自动触发。执行时,它首先调用 UpdateCorrelations() 以使用最新数据刷新所有相关性计算。

//+------------------------------------------------------------------+
//| Timer: update, interpret, display, alert                         |
//+------------------------------------------------------------------+
void OnTimer()
  {
   UpdateCorrelations();

随后,它遍历每一对唯一的品种,获取它们的相关性,并利用实用函数生成解释性文本和交易建议,然后将这些内容记录到“专家(Experts)”选项卡中。

// 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) 函数是进行统计计算的地方。它使用 CopyClose 检索两个品种在指定 LookbackBars(回溯柱数)内的历史收盘价数据。

//+------------------------------------------------------------------+
//| 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() 是一个实用函数,用于高效地从图表中删除 EA 创建的所有对象,在反初始化期间以及可能在重新绘图之前使用。
//+------------------------------------------------------------------+
//| 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 警报,将消息打印到“专家”选项卡,并根据用户配置选择性地发送推送通知或电子邮件。

注意:正如代码注释中所强调的,此函数中的 CorrArray[i] 似乎存在潜在的索引问题,其意图可能是访问 Instruments[0] 和 Instruments[i] 之间的相关性。此外,它目前仅对超过阈值的正相关发出警报;要对强负相关发出警报,需要检查绝对值。


结果

当部署在实时数据上时,EA 立即渲染了仪表盘。它开始以绿色显示正相关系数的最新读数,以红色显示负相关系数。在每个设定的时间间隔进行刷新。“专家”选项卡记录了每个系数。它提供了对每个值的简明解释。这种设置让您可以查看原始数字及其实际意义,而不会错过任何信息。
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. 强正相关

上图展示了这些货币对之间强正相关的关系,这是一种直接关系,它们几乎同时进行买卖操作。从5月6日到7日,两个货币对最初都呈现下跌走势,随后反转进入上涨趋势。下面,我展示了一个中等负相关:你可以观察到反向结构的形成,大多数情况下,当一个货币对卖出时,买入另一个货币对,反之亦然。

图 5. 中等负相关


结论

相关性仪表盘 EA 为您提供了关于货币对间价格行为的宝贵信息,而无需您切换图表。通过显示实时关系,它帮助您预测跨工具的市场变化,并做出更明智的交易决策。图表面板和“专家”选项卡的日志虽然外观简约,但清晰地展示了核心功能:即一个能够自动更新、采用颜色编码显示相关系数并提供解读信息的仪表板。您可以轻松地重新设计或扩展UI,但核心的分析功能已经到位。欢迎您提出任何问题或建议!

日期 工具名称  说明 版本  更新  提示
01/10/24 图表投影仪 用于叠加前一天价格走势(带“幽灵”效果)的脚本。 1.0 首次发布 工具1
18/11/24 分析评论 它以表格形式提供前一日的市场信息,并预测市场的未来走向。 1.0 首次发布 工具2
27/11/24 分析大师 市场指标每两小时定期更新  1.01 第二版 工具3
02/12/24 分析预测器  每两小时定期更新市场指标,并集成Telegram推送功能。 1.1 第三版 工具4
09/12/24 波动性导航工具 该EA使用布林带、RSI和ATR指标分析市场状况。 1.0 首次发布 工具5
19/12/24 均值回归信号收割器  使用均值回归策略分析市场并提供信号  1.0  首次发布  工具6 
9/01/25  信号脉冲  多时间框架分析器 1.0  首次发布  工具7 
17/01/25  指标看板  带按钮的分析面板  1.0  首次发布 工具8 
21/01/25 外部资金流 通过外部库进行分析 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 背离  价格走势与 RSI 背离的对比  1.0  首次发布  工具13 
17/02/25  抛物线转向与反转 (PSAR)  自动化PSAR策略 1.0 首次发布  工具14
20/02/25  四分位绘制脚本  在图表上绘制四分位水平线  1.0  首次发布  工具15 
27/02/25  侵入检测器 当价格触及四分位水平时进行检测和警报 1.0   首次发布 工具16 
27/02/25  TrendLoom工具 多时间周期分析面板 1.0 首次发布 工具17
11/03/25  四分位看板  带有可激活或禁用四分位的面板  1.0  首次发布 工具18
26/03/25  ZigZag 分析器  使用ZigZag指标绘制趋势线  1.0  首次发布  工具19 
10/04/25  相关性检测器 使用Python库绘制货币对的相关性。 1.0 首次发布  工具20 
23/04/25 市场结构反转检测工具 市场结构反转检测 1.0  首次发布  工具21
08/05/25  相关性仪表盘  不同货币对之间的相关性 1.0 首次发布 工具22 

本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/18052

附加的文件 |
最近评论 | 前往讨论 (2)
ELLIOT KAMANGA
ELLIOT KAMANGA | 14 5月 2025 在 16:52
这是多好的
Nkpanam Emmanuel
Nkpanam Emmanuel | 16 5月 2025 在 13:08
ELLIOT KAMANGA #:
多好啊
良好的实施
利用 MQL5 经济日历进行交易(第 8 部分):通过智能事件过滤和有针对性的日志来优化新闻驱动策略的回测 利用 MQL5 经济日历进行交易(第 8 部分):通过智能事件过滤和有针对性的日志来优化新闻驱动策略的回测
在本文中,我们利用智能事件过滤和有针对性的日志来优化我们的经济日历,以便在实时和离线模式下实现更快、更清晰的回测。我们简化了事件处理程序,并将日志集中在关键交易和仪表盘事件上,从而增强了策略的可视化效果。这些改进使得对新闻驱动型交易策略进行顺畅的测试和优化成为可能。
您应当知道的 MQL5 向导技术(第 57 部分):搭配移动平均和随机振荡器的监督训练 您应当知道的 MQL5 向导技术(第 57 部分):搭配移动平均和随机振荡器的监督训练
移动平均线和随机振荡器是十分常用的指标,因其滞后性质,一些交易者或许较少使用。在一个三部分的“迷你序列”中,研究机器学习的三大主要形式,我们会考证对这些指标的偏见是否合理,或者它们可能占据优势。我们经由向导汇编的智能系统来进行实证。
市场模拟(第八部分):套接字(二) 市场模拟(第八部分):套接字(二)
用套接字实现一些实用功能怎么样?在今天的文章中,我们将开始创建一个迷你聊天室。让我们一起来看看这是怎么做到的 —— 这会非常有趣。请注意,此处提供的代码仅用于教育目的。它不应用于商业目的或现成的应用程序,因为它不提供数据传输安全性,并且可以访问通过套接字传输的内容。
MQL5交易策略自动化(第十七部分):借助动态仪表盘精通网格马丁格尔(Grid-Mart)短线交易策略 MQL5交易策略自动化(第十七部分):借助动态仪表盘精通网格马丁格尔(Grid-Mart)短线交易策略
在本文中,我们将探讨网格马丁格尔(Grid-Mart)短线交易策略,并阐述如何在MQL5中实现该策略的自动化,同时配备一个动态仪表盘以提供实时交易分析。我们将详细介绍该策略基于网格的马丁格尔逻辑以及风险管理功能。此外,我们还将指导如何进行回测和部署,以确保策略的稳健表现。