English Deutsch
preview
プライスアクション分析ツールキットの開発(第22回):Correlation Dashboard

プライスアクション分析ツールキットの開発(第22回):Correlation Dashboard

MetaTrader 5インディケータ |
14 2
Christian Benjamin
Christian Benjamin

内容


はじめに

相関とは、2つの変数がどのように関連して動くかを示す統計的な指標です。金融市場では、2つの金融商品が一緒に上昇・下落する(正の相関)か、逆に動く(負の相関)かを示します。重要なのは、相関は関係性を表すものであり因果関係を意味しないという点です。
前回の記事では、Pythonライブラリを使ってEURUSD–GBPUSDの相関をプロットする方法を紹介しました。今回は、MetaTrader 5上で直接相関分析をおこなえるカスタムエキスパートアドバイザー(EA)を作成し、実用的なオンチャート可視化を実現する方法を解説します。 このツールは、選択した時間軸で通貨、コモディティなど複数の金融商品にわたる相関値をライブで表示するダッシュボードを生成します。
このダッシュボードを使うことで、トレーダーは異なる市場間の価格変動がどのように相互作用しているかをより深く理解できます。金融商品同士が連動して動くのか、大きく乖離するのか、あるいは独立して動くのかを把握できるため、次のようなメリットが得られます。
  • 相関の高い取引を避けることでポートフォリオリスクを管理
  • ヘッジやペアトレードの可能性を特定
  • 分散投資の強化
  • 相関の変化による市場ダイナミクスの転換を発見

図1:ペアの関係性

最初の図は、EURUSDとGBPUSDが同じ方向に動く傾向を示しています。つまり、EURUSDが上昇するとGBPUSDも上昇します。これは強い正の相関(順比例)と呼ばれます。2番目の図は、EURUSDとUSDCHFが逆方向に動く様子を示しています。EURUSDが上昇するとUSDCHFは下落します。これは強い負の相関(反比例)です。2つのペアが同じ方向にも逆方向にも動かない場合、それらは無相関または独立していると言います。


戦略の概要

Correlation Dashboard EAは、リスト内の各ペアについて直近N本の終値を継続的に取得し、それらを単純リターンに変換します。その後、すべてのユニークな銘柄ペアに対してピアソンの積率相関係数rを計算し、チャート上のヒートマップとしてプロットします。セルの色で相関の強弱と符号を表し、各r値を重ねて表示し、それを強い正相関、中程度の相関、無相関、中程度の負相関、強い負相関として分類します。また、EAは解釈を出力し、「ヘッジ」「確認」「分散」「スプレッド」といった具体的なアドバイスを提示し、相関が指定した閾値を超えたときにはアラートを発します。

これにより、一目でどの市場が同じ方向に動き、どの市場が逆に動き、どの市場が独立しているのかを把握でき、自信を持ってポジションを調整することができます。ピアソンの積率相関係数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によって実質的に補強されるため、これらを1つのクラスターとして扱い、相殺するポジションを避け、一方をもう一方のヘッジとして利用することを検討します。
  • 強い負の相関(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/ja/users/lynnchris|
//+------------------------------------------------------------------+
#property copyright "Copyright 2025, MetaQuotes Ltd."
#property link      "https://www.mql5.com/ja/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関数は2つの特定の金融商品間で観察された相関に基づき、実践的なコメントや潜在的な取引への示唆を提供します。これにより、統計分析から導かれた実行可能なインサイトが得られます。

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

Correlation Dashboardをさまざまな取引スタイルや分析ニーズに適応させるために、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は、計算されたペアごとの相関係数を保持する専用の配列であり、任意の2つの金融商品間の相関に簡単にアクセスできるように整理されています。単純な整数型のInstrumentCountは、分析対象となる銘柄の数を追跡します。

EAがチャートにアタッチされると、最初にOnInit関数が実行され、動作に必要なコンポーネントをセットアップします。まずInstrumentsListを解析してInstruments配列を埋め、相関分析には少なくとも2つの銘柄が必要であることを確認します。

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

初期化のいずれかのステップが失敗した場合(たとえば、銘柄が2つ未満しか提供されなかった場合)、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();

その後、各ユニークな金融商品のペアを順に処理し、それぞれの相関を取得します。さらに、ユーティリティ関数を使って解釈用のテキストや取引アドバイスを生成し、それを[エキスパート]タブにログとして出力します。

// 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];
  }
これらの正規化された価格変化を用いて、2つの時系列間の線形関係を定量化するためにピアソンの積率相関係数を計算します。
 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:Correlation Board

NZDUSDとAUDUSDは強い正の相関を示しており、ほぼ同一の価格変動で同じ方向に動きます。以下では、それぞれのリアルタイムの価格動向を並べて比較し、ダッシュボード上の相関値が市場で実際に起きている動きと正確に一致していることを確認します。

図4:強い正の相関

上の図は、これらの通貨ペア間に強い正の相関があることを示しており、ほぼ同時に売買がおこなわれる直接的な関係を表しています。5月6日から7日にかけて、両ペアは最初は下落傾向で動きましたが、その後反転して上昇トレンドに入りました。下図では、中程度の負の相関を示しています。ほとんどの場合、一方のペアが売っている間にもう一方が買うという逆相関の構造が形成されていることが確認できます。

図5:中程度の負の相関


結論

Correlation Dashboard EAは、チャートを切り替えることなく、通貨ペア間の価格動向に関する貴重な洞察を提供します。リアルタイムで相関関係を表示することで、複数の金融商品間の市場変動を予測し、より情報に基づいた取引判断を下すのに役立ちます。チャート上のパネルや[エキスパート]タブのログは見た目はシンプルですが、コア機能を明確に示しています。:カラーコード付きの相関係数と解釈メッセージを備えた自己更新型ダッシュボードです。UIを簡単にカスタマイズしたり拡張したりすることも可能ですが、基本的な分析機能はすでに整っています。質問や提案があれば、ぜひお気軽にお問い合わせください。

日付 ツール名  詳細 バージョン  アップデート  備考
01/10/24 ChartProjector 前日のプライスアクションをゴースト効果でオーバーレイするスクリプト 1.0 初回リリース ツール番号1
18/11/24 Analytical Comment 前日の情報を表形式で提供し、市場の将来の方向性を予測する 1.0 初回リリース ツール番号2
27/11/24 Analytics Master 2時間ごとに市場指標を定期的に更新  1.01 v.2 ツール番号3
02/12/24 Analytics Forecaster  Telegram統合により、2時間ごとに市場指標を定期的に更新 1.1 v.3 ツール番号4
09/12/24 Volatility Navigator ボリンジャーバンド、RSI、ATR指標を使用して市場の状況を分析するEA 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  ジグザグインジケーターを使ったトレンドラインの描画  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

添付されたファイル |
最後のコメント | ディスカッションに移動 (2)
ELLIOT KAMANGA
ELLIOT KAMANGA | 14 5月 2025 において 16:52
Nkpanam Emmanuel
Nkpanam Emmanuel | 16 5月 2025 において 13:08
ELLIOT KAMANGA #:
これはいい
良い実装
データサイエンスとML(第38回):外国為替市場におけるAI転移学習 データサイエンスとML(第38回):外国為替市場におけるAI転移学習
AIの画期的な進歩、たとえばChatGPTや自動運転車などは、単独のモデルから生まれたわけではなく、複数のモデルや共通の分野から得られた累積的な知識を活用することで実現しています。この「一度学習した知識を他に応用する」というアプローチは、アルゴリズム取引におけるAIモデルの変革にも応用可能です。本記事では、異なる金融商品の情報を活用し、他の銘柄における予測精度向上に役立てる方法として、転移学習の活用方法について解説します。
MQL5開発用のカスタムデバッグおよびプロファイリングツール(第1回):高度なロギング MQL5開発用のカスタムデバッグおよびプロファイリングツール(第1回):高度なロギング
MQL5で、単なるPrint文を超えた強力なカスタムロギングフレームワークを実装する方法を学びましょう。このフレームワークは、ログの重要度レベル、複数の出力ハンドラ、自動ファイルローテーションをサポートし、実行中にすべて設定可能です。シングルトン設計のCLoggerをConsoleLogHandlerとFileLogHandlerに統合することで、[エキスパート]タブと永続ファイルの両方に、文脈情報やタイムスタンプ付きのログを記録できます。明確でカスタマイズ可能なログ形式と集中管理により、エキスパートアドバイザー(EA)のデバッグとパフォーマンストレースを効率化します。
MQL5での取引戦略の自動化(第17回):ダイナミックダッシュボードで実践するグリッドマーチンゲールスキャルピング戦略 MQL5での取引戦略の自動化(第17回):ダイナミックダッシュボードで実践するグリッドマーチンゲールスキャルピング戦略
本記事では、グリッドマーチンゲールスキャルピング戦略(Grid-Mart Scalping Strategy)を探究し、MQL5による自動化と、リアルタイム取引インサイトを提供するダイナミックダッシュボードの構築をおこないます。本戦略のグリッド型マーチンゲールロジックとリスク管理機能を詳述し、さらに堅牢なパフォーマンスのためのバックテストおよび実運用展開についても案内します。
MQL5で取引管理者パネルを作成する(第11回):最新機能通信インターフェース(I) MQL5で取引管理者パネルを作成する(第11回):最新機能通信インターフェース(I)
本日は、コミュニケーションパネルのメッセージングインターフェースを、現代の高性能なコミュニケーションアプリの標準に合わせて強化することに焦点を当てます。この改善は、CommunicationsDialogクラスの更新によって実現されます。この記事とディスカッションでは、主要な知見を紹介しつつ、MQL5を用いたインターフェースプログラミングの次のステップを整理していきます。