【MQL5】Hsplit関数について

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

Hsplit関数の働き・役割

Hsplit関数は、行列を水平方向(横方向)に複数の部分行列に分割するために使用します。この分割方法は、行列全体をいくつかの「部分」に切り分けるイメージです。分割の方法として、等しいサイズで分割する方法と、指定されたサイズで分割する方法があります。

例えば、6つの列を持つ行列があった場合、この関数を使うと、その行列を2つや3つ、または異なるサイズの部分行列に分割できます。具体的には、元の行列の列を部分的に切り取って、新しい部分行列を作成します。これにより、大きなデータを扱いやすい小さな単位に整理することが可能になります。

この関数は、分割後の部分行列配列として返すため、後続の処理に応じた柔軟なデータ操作ができます。たとえば、各部分行列に異なる計算を適用したり、分析を分割して行う場合に役立ちます。

Hsplit関数の引数について

Hsplit関数は、以下の2つの異なる形式(バリアント:異なる引数リスト)で使用できます。それぞれの引数について説明します。

1つ目の形式

bool matrix::Hsplit(
const ulong parts,     // 部分行列の数
  matrix&     splitted[]  // 結果の部分行列の配列
  );

この形式では、行列を指定した数の等しい部分に分割します。

  • parts
    行列を分割して得られる部分行列の数を指定します。たとえば、partsに2を指定すると、行列を2つの等しい部分に分割しようとします。
    分割する部分行列の行数が均等でなければエラーになります。
  • splitted
    分割後の部分行列を格納するための配列を指定します。この配列には、指定した数の部分行列が順番に格納されます。

2つ目の形式

void matrix::Hsplit(
const ulong& parts[],   // 部分行列のサイズ
  matrix&     splitted[]  // 結果の部分行列の配列
  );

この形式では、分割後の各部分行列のサイズを指定します。

  • parts
    各部分行列のサイズ(行数)を指定する配列です。この配列要素ごとに、対応するサイズの部分行列が作成されます。
    配列要素を全て使い切っても元の行列が残っている場合、その残りは最後の部分行列に含まれます。
  • splitted
    分割後の部分行列を格納するための配列を指定します。この配列には、サイズ指定に基づいた部分行列が順番に格納されます。

これらの引数を正しく設定することで、行列を柔軟に分割することができます。

Hsplit関数の戻り値について

Hsplit関数戻り値は、分割処理が成功したかどうかを示します。この戻り値は、プログラムの処理結果を確認する際に重要な役割を果たします。

戻り値の説明

  • true
    行列の分割が成功した場合に返されます。これは、指定された条件(分割数やサイズ配列)に従って、正しく部分行列が作成されたことを意味します。
  • false
    行列の分割に失敗した場合に返されます。この場合、エラーが発生した原因を調べるために、GetLastError関数を使用してエラーコードを取得する必要があります。

注意点

Hsplit関数が失敗する一般的な理由として、以下が挙げられます:

  1. 書式1の第1引数にて指定された分割数が元の行列の行数で割り切れない場合。
  2. 書式2の第1引数にて指定されたサイズ配列が不適切で、行列全体を分割しきれない場合。
  3. 入力データ(元の行列やサイズ配列)が適切に初期化されていない場合。

これらのケースでは、戻り値falseとなり、エラーコードが設定されます。

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

以下は、Hsplit関数を使用して行列を水平に分割するサンプルコードです。


// エントリーポイント関数
void OnStart()
{
   // 元の行列を定義
   // この行列には5行6列の要素があります
   matrix matrix_a = {
       { 1,  2,  3,  4,  5,  6},
       { 7,  8,  9, 10, 11, 12},
       {13, 14, 15, 16, 17, 18},
       {19, 20, 21, 22, 23, 24},
       {25, 26, 27, 28, 29, 30}
   };
   
   // 部分行列を格納するための配列を定義
   matrix splitted[];

   // ====== 1. 等しいサイズで分割する例 ======
   // 行列を2つの部分行列に分割する
   bool res = matrix_a.Hsplit(2, splitted);

   // 処理結果を確認
   // true: 成功, false: 失敗
   Print("分割処理成功: ", res, " エラーコード: ", GetLastError());

   // 分割結果を出力
   for (uint i = 0; i < splitted.Size(); i++)
   {
       // 各部分行列を順番に表示
       Print("部分行列 ", i, " の内容:\n", splitted[i]);
   }

   // ====== 2. サイズ配列を使用した分割の例 ======
   // 各部分行列の行数を指定する配列
   ulong parts[] = {2, 3};  // 最初の部分行列は2行、次の部分行列は3行

   // 分割処理を実行
   res = matrix_a.Hsplit(parts, splitted);

   // 処理結果を確認
   Print("分割処理成功: ", res, " エラーコード: ", GetLastError());

   // 分割結果を出力
   for (uint i = 0; i < splitted.Size(); i++)
   {
       // 各部分行列を順番に表示
       Print("部分行列 ", i, " の内容:\n", splitted[i]);
   }

   // ====== 3. 分割数が不適切な場合の例 ======
   // 行列を5つに分割する(分割数が不適切)
   res = matrix_a.Hsplit(5, splitted);

   // 処理結果を確認
   Print("分割処理成功: ", res, " エラーコード: ", GetLastError());

   // 分割結果がエラーの場合、エラーコードが設定されます
   if (!res)
   {
       Print("エラーが発生しました: エラーコード ", GetLastError());
   }
   else
   {
       // 成功した場合は分割結果を出力
       for (uint i = 0; i < splitted.Size(); i++)
       {
           Print("部分行列 ", i, " の内容:\n", splitted[i]);
       }
   }
}

サンプルコードの解説

以下は、Hsplit関数を使用したサンプルコードの各部分について、分割が失敗または成功する理由を明示しながら解説します。


元の行列の定義

matrix型の変数matrix_aは5行6列の行列です。この行列を使用して分割操作を行います。

元の行列:

matrix matrix_a = {
    { 1,  2,  3,  4,  5,  6},
    { 7,  8,  9, 10, 11, 12},
    {13, 14, 15, 16, 17, 18},
    {19, 20, 21, 22, 23, 24},
    {25, 26, 27, 28, 29, 30}
};

例1: 等しいサイズで分割 (失敗)

Hsplit関数を使用して、行列を2つに分割しようとしています。

引数2は、分割数を指定します。Hsplit関数は、行数を分割数で均等に割り切れる必要があります。matrix_aは5行ですが、分割数2では行数5を均等に分けることができません。

実行結果:

エラーが発生しました: エラーコード 4003

理由:
行列の行数5が分割数2で割り切れないため、部分行列を等しいサイズで作成することができず、エラーとなります。


例2: サイズ配列を使用した分割 (成功)

ここでは、parts配列を使用して、異なるサイズの部分行列を作成します。

配列partsには2, 3が指定されています。最初の部分行列は2行、次の部分行列は3行で作成されます。

実行結果:

部分行列 1:
1  2  3  4  5  6
7  8  9 10 11 12

部分行列 2:
13 14 15 16 17 18
19 20 21 22 23 24
25 26 27 28 29 30

理由:
サイズ配列partsが明示的に指定されているため、Hsplit関数はこの設定に基づいて部分行列を作成します。サイズの合計が行列の行数と一致しており、分割が成功します。

例3: 等しいサイズで分割 (成功)

ここでは、行列を5つに分割しようとしています。

分割数5を指定すると、行数5を5等分に分割し、各部分行列は1行ずつ持つようになります。

実行結果:

部分行列 0:
1  2  3  4  5  6

部分行列 1:
7  8  9 10 11 12

部分行列 2:
13 14 15 16 17 18

部分行列 3:
19 20 21 22 23 24

部分行列 4:
25 26 27 28 29 30

理由:
行列の行数5を分割数5で割ると、各部分行列の行数は1となり、Hsplit関数の条件を満たします。このため、分割が成功します。


まとめ

  • 例1: 等しいサイズで分割しようとしたが、行数が割り切れず失敗。
  • 例2: サイズ配列を使用し、指定された行数に従って分割が成功。
  • 例3: 等しいサイズで分割し、行数と分割数が一致したため成功。

Hsplit関数を使用する際は、行列の行数が分割数またはサイズ配列に適合しているか確認することが重要です。

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


1. インジケータのパラメータ最適化

インジケータの計算には、多くの場合、異なる時間枠や設定値を試す必要があります。Hsplit関数を使うことで、設定値のリストや時間枠を行列として定義し、それを複数の部分に分割して並列処理を行うEAを作成できます。

  • 例:
    複数の移動平均期間を持つ行列を、異なる部分行列に分割して各部分を別々の計算に使用。
  • 効果:
    処理負荷を分散し、効率的にパラメータ最適化を行えるEAを構築可能。

2. マルチシンボルの取引戦略

複数の通貨ペアや銘柄を対象とする取引戦略で、シンボル情報を行列として管理し、Hsplit関数で分割することでシンボルごとに独立した取引ロジックを実装できます。

  • 例:
    行列内の各行に異なるシンボルの価格データを格納し、それを分割して処理。
  • 効果:
    各シンボルごとに個別の戦略を適用可能になり、リスク分散やパフォーマンス向上が期待できます。

3. 時系列データの区間分析

過去データを行列として扱い、一定期間ごとに分割して分析するEAを作成できます。Hsplit関数を使えば、データの区間分割が簡単に行えます。

  • 例:
    日足データを週ごとに分割し、各週の平均値やボラティリティを計算。
  • 効果:
    時間軸に基づいた細かな分析が可能になり、トレンドやサイクルを把握しやすくなります。

4. バックテストの部分最適化

バックテストでは、大量の取引データを効率的に処理する必要があります。Hsplit関数でデータを分割し、特定の期間に焦点を当てたEAを作ることで、個々の期間ごとの戦略最適化が可能です。

  • 例:
    過去5年間のデータを年ごとに分割し、それぞれの年でのパフォーマンスを比較。
  • 効果:
    特定の市場環境に対する戦略の有効性を検証できます。

5. AI学習データの前処理

AIを用いた取引戦略では、大量のデータを行列として管理することが一般的です。Hsplit関数を使えば、このデータをトレーニング用とテスト用に簡単に分割できます。

  • 例:
    株価データを8:2の割合でトレーニング用データとテスト用データに分割。
  • 効果:
    効率的なデータ前処理により、AIモデルの精度を向上させることが可能。

6. クラスタリング分析

異なるマーケットセグメントや資産クラスを行列としてグループ化し、Hsplit関数で分割してクラスタごとに分析するEAを作成できます。

  • 例:
    各資産クラス(株式、通貨、コモディティ)のデータを分割して分析。
  • 効果:
    資産ごとの特徴を把握し、ポートフォリオのバランスを改善する手助けとなります。

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