【MQL5】Diag関数について

MQL5リファレンス
スポンサーリンク
スポンサーリンク

関数の働き・役割

Diag関数は、行列における対角要素を抽出したり、新しい対角行列を構築したりするために使用されます。この関数は、特定の対角線上の要素を操作することができるため、行列の管理や計算において役立ちます。

例えば、対角行列を作成したい場合には、指定した要素を対角線上に配置し、それ以外の部分はゼロで埋めることができます。また、既存の行列から特定の対角線上の値を取り出すことも可能です。

主な利用場面として、数値計算やデータの行列形式での表現が挙げられます。これにより、行列を使った処理が効率的に行えるようになります。

補足:対角行列について

対角行列とは、行列の中で主対角線(左上から右下にかけての線)以外の全ての要素がゼロである行列のことです。

関数の引数について

Diag関数には、対角要素を抽出する場合と、新しい対角行列を構築する場合の2つの使い方があります。それぞれに応じた引数を説明します。

対角要素を抽出する場合

vector matrix::Diag(
  const int    ndiag=0      // 対角の数
  );

この場合、以下の1つの引数を指定します。

  1. ndiag:
    対角を指定する整数値です。初期値は0で、主対角線を意味します。
    主対角線とは、行列の左上から右下にかけて一直線に並ぶ要素のことを指します。

    主対角線より上の対角を取得する場合には正の値を、主対角線より下の対角を取得する場合には負の値を指定します。

例として、ndiag = 1を指定すると主対角線の一つ上、ndiag = -1を指定すると主対角線の一つ下の対角要素が抽出されます。


新しい対角行列を構築する場合

void matrix::Diag(
  const vector  v,          // 対角ベクトル
  const int    ndiag=0      // 対角の数
  );

この場合、以下の2つの引数を指定します。

  1. v:
    対角線上に配置する要素を持つベクトルです。このベクトル要素が指定した対角線に配置されます。
  2. ndiag:
    対角を指定する整数値です。初期値は0で、主対角線に対応します。主対角線より上の対角線に配置する場合には正の値を、主対角線より下の対角線に配置する場合には負の値を指定します。

この関数では、既存の行列に対角を設定する場合でも、未割り当ての行列に対角を設定する場合でも使用できます。未割り当ての行列に設定する場合、指定されたベクトルのサイズに基づいて新しい行列が作成されます。

関数の戻り値について

対角要素を抽出する場合

この場合、Diag関数は指定された対角線上の要素ベクトルとして返します。戻り値は、指定された位置の対角要素のみを含むベクトルです。例えば、ndiag = 0の場合は主対角線上の要素が返されます。

具体例として、次のような行列がある場合を考えます:

[[1, 2, 3],
 [4, 5, 6],
 [7, 8, 9]]

この行列に対して m.Diag(0) を呼び出すと、主対角線の要素[1, 5, 9] を含むベクトルが返されます。一方、m.Diag(1) は一つ上の対角線 [2, 6] を、m.Diag(-1) は一つ下の対角線 [4, 8] を返します。


新しい対角行列を構築する場合

この場合、関数行列そのものを変更します。戻り値はありません。
具体的には、指定されたベクトル要素を対角線上に配置した行列が作成され、関数が呼び出されたインスタンスに設定されます。

例えば、次のベクトル[1, 2, 3] を指定して m.Diag(v) を呼び出すと、以下のような行列が構築されます:

[[1, 0, 0],
 [0, 2, 0],
 [0, 0, 3]]

戻り値がないため、関数が動作した結果を確認するには、対象の行列を直接確認する必要があります。

Diag関数を使ったサンプルコード

以下に、Diag関数を使用したサンプルコードを示します。対角行列の構築や、特定の対角要素の抽出を行う実例を示しています。

//+------------------------------------------------------------------+
//| スクリプトの開始ポイント                                        |
//+------------------------------------------------------------------+
void OnStart()
{
   // 対角要素を設定するためのベクトルを定義します
   vector v1 = {1, 2, 3};
   
   // 新しい行列インスタンスを作成します
   matrix m1;
   
   // ベクトルv1を使用して、m1の主対角行列を構築します
   m1.Diag(v1);
   // m1の内容をエキスパートログに出力します
   Print("主対角行列 m1:\n", m1);

   // ベクトルv1を使用して、主対角より1つ下の対角に要素を配置します
   matrix m2;
   m2.Diag(v1, -1);
   Print("対角が1つ下の行列 m2:\n", m2);

   // ベクトルv1を使用して、主対角より1つ上の対角に要素を配置します
   matrix m3;
   m3.Diag(v1, 1);
   Print("対角が1つ上の行列 m3:\n", m3);

   // 初期値が9の4行5列の行列を作成します
   matrix m4 = matrix::Full(4, 5, 9);
   // m4の主対角より1つ上にベクトルv1の値を設定します
   m4.Diag(v1, 1);
   Print("要素を設定した行列 m4:\n", m4);

   // 行列m4から各対角の要素を抽出します
   // 主対角より1つ下の対角要素を取得します
   vector diag_minus1 = m4.Diag(-1);
   Print("m4の主対角より1つ下の対角要素:\n", diag_minus1);

   // 主対角の要素を取得します
   vector diag_0 = m4.Diag();
   Print("m4の主対角要素:\n", diag_0);

   // 主対角より1つ上の対角要素を取得します
   vector diag_1 = m4.Diag(1);
   Print("m4の主対角より1つ上の対角要素:\n", diag_1);
}

サンプルコードに使われた関数や文法要素の解説


vector と matrix の定義

vector v1 = {1, 2, 3};

この行では、vector型の変数v1 を定義しています。vectorMQL5で使用されるデータ型で、1次元の配列に似た構造を持っています。この場合、v1 には {1, 2, 3} という3つの値が順に格納されています。

ポイント:

  • 中括弧 {} を使用することで、複数の値を一度に設定できます。
  • vectorは、行列操作で頻繁に使用されます。

行列 matrix の作成と操作

matrix m1;

matrix 型の変数m1 を定義しています。matrixMQL5で使用されるデータ型で、2次元配列に似た構造を持ち、行列としての操作が可能です。この時点では、まだ m1 に具体的なデータは設定されていません。


主対角行列の作成

m1.Diag(v1);

この部分では、matrix型のインスタンス m1 に対してDiag関数を呼び出しています。


主対角以外の対角線への設定

m2.Diag(v1, -1);

この行では、行列m2主対角線の1つ下に v1 の値を配置しています。

  • 第2引数-1: 主対角線より1つ下を指定します。
  • 結果: 行列の2行目の1列目に 1、3行目の2列目に 2、4行目の3列目に 3 が設定されます。

m3.Diag(v1, 1);

ここでは、行列m3主対角線の1つ上に v1 の値を配置しています。

  • 第2引数 1: 主対角線より1つ上を指定します。
  • 結果: 行列の1行目の2列目に 1、2行目の3列目に 2、3行目の4列目に 3 が設定されます。

初期値を持つ行列の作成と対角設定

matrix m4 = matrix::Full(4, 5, 9);

この部分では、matrix::Full関数を使用して初期値がすべて 9行列m4 を作成しています。

m4.Diag(v1, 1);

ここでは、行列m4主対角線の1つ上に v1 の値を設定しています。m4 の既存の要素はそのまま残り、指定した対角線だけが変更されます。


対角要素の抽出

vector diag_minus1 = m4.Diag(-1);

この行では、行列m4主対角線の1つ下にある要素を取得し、ベクトルdiag_minus1 に格納しています。

vector diag_0 = m4.Diag();

この行では、行列m4主対角線の要素を取得しています。

vector diag_1 = m4.Diag(1);

ここでは、行列m4主対角線の1つ上の要素を取得しています。


Print 関数での出力

Print(“主対角行列 m1:\n”, m1);

この行では、Print関数を使用して行列m1 の内容をエキスパートログに出力しています。

  • Print関数: 引数として渡された内容をエキスパートログに表示します。
  • \n の使用: 表示を見やすくするために、行末に改行コードを追加しています。

Diag関数を使ってEAを作る際のアイディア

1. データ分析の可視化

Diag関数を使用して、金融データの分析結果を行列形式で視覚的に整理することができます。例えば、各通貨ペアの相関係数を対角行列として表現し、主対角線に自己相関、上下の対角線に他の通貨ペアとの相関を配置することで、視覚的に相関を把握しやすくなります。

実例:

  • 通貨ペア間の相関行列を作成し、どのペアが強い相関を持つかを分析する。
  • 主対角線に自己相関、その他の対角線に通貨ペア間の相関値を格納。

2. リスク管理のシミュレーション

リスク計算の一環として、ポートフォリオの分散や共分散行列を計算する場合にも使用できます。Diag関数を用いて、主対角線上に分散を配置し、ポートフォリオ全体のリスクを視覚化できます。

実例:

  • 分散・共分散行列を構築し、各資産のリスクと相関を数値で確認。
  • 主対角線を使ってポートフォリオの総リスクを計算。

3. テクニカル指標のカスタマイズ

複数の時間枠や通貨ペアのテクニカル指標を対角行列として整理できます。例えば、RSI移動平均線などの値を対角行列の特定の位置に配置し、複数の通貨ペアや時間枠での指標値を比較できます。

実例:

  • 各通貨ペアのRSI主対角線に配置し、隣接する対角線にその通貨ペアの移動平均値を設定。
  • 主対角線に直近のデータ、上下の対角線に過去のデータを配置することで、時間の変化を視覚化。

4. 最適化アルゴリズムへの応用

EAのパラメータ最適化では、複数のパラメータ組み合わせを行列として管理することがよくあります。

Diag関数を用いて、特定のパラメータが他のパラメータに与える影響を対角線上に整理できます。

実例:

  • パラメータ間の関連性を行列で可視化し、主対角線に重要なパラメータ値を配置。
  • 他の対角線に関連するパラメータの効果を配置し、組み合わせの最適化を視覚化。

5. トレード履歴の整理

トレード結果を行列形式で記録し、Diag関数を使って特定のデータを抽出できます。たとえば、主対角線に利益や損失を配置し、上下の対角線にスリッページスプレッド情報を記録することで、トレード履歴を分析しやすくなります。

実例:


6. 特定のパターン検出

行列を使って特定の価格パターン(トレンドラインやチャートパターン)を整理し、Diag関数で特定の特徴を抽出できます。主対角線にパターンの開始点や終点を格納し、他の要素にそれに対応する価格を記録する方法が考えられます。

実例:

  • 主対角線に特定のローソク足の始値や終値を記録。
  • 上下の対角線に高値や安値を格納し、パターンの詳細を視覚化。

これらのアイディアを活用することで、Diag関数をトレード戦略やデータ分析、リスク管理において効果的に使用できるEAを設計できます。

タイトルとURLをコピーしました