【MQL5】Assign関数について

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

Assign関数の働き・役割

Assign関数は、行列(数字が並んだ2次元のデータ)やベクトル(数字が並んだ1次元のデータ)などのデータを別の変数にコピーするために使われます。この関数を使うと、行列ベクトルだけでなく、配列(特定の順序で並べられたデータ)のデータもコピーできます。さらに、この関数には「自動キャスト」という仕組みがあり、データのサイズが違っていても、それに合わせてコピー先の行列ベクトルのサイズが調整されます。

たとえば、ある行列のデータを別の行列にコピーしたり、2次元配列(データを並べた表のようなもの)の内容を行列にコピーしたりすることができます。この機能により、データのサイズが自動で調整されるため、異なるサイズのデータも柔軟に扱えるのが特徴です。

Assign関数の引数について

bool matrix::Assign(
  const matrix<T> &mat    // コピーされた行列
  );
bool matrix::Assign(
  const void      &array[] // コピーされた配列
  );
bool vector::Assign(
  const vector<T>  &vec    // コピーされたベクトル
  );
bool vector::Assign(
  const void      &array[] // コピーされた配列
  );

Assign関数には、データのコピー元となる行列(数字が並んだ2次元のデータ)、ベクトル(数字が並んだ1次元のデータ)、または配列(特定の順序で並べられたデータ)を引数として渡します。

行列用のAssign関数の場合、コピー元の行列引数として指定します。この行列は、コピー先の行列の内容にそのまま反映されます。

ベクトル用のAssign関数の場合、コピー元のベクトル引数に指定します。これにより、ベクトルの内容が指定したベクトルにコピーされます。

また、行列ベクトル配列をコピーすることも可能で、この場合、配列の内容が自動キャストによって行列ベクトルに変換されます。配列のサイズに合わせて、行列やベクトルも適切なサイズに変更され、データがコピーされます。

Assign関数を使用する際の引数には、それぞれ異なるデータ形式(行列ベクトル配列)を指定できるため、必要に応じて適切なデータ形式を用いることが重要です。

Assign関数の戻り値について

Assign関数戻り値は、コピー処理が成功したかどうかを示す真偽値です。データのコピーが正常に行われた場合にはtrueが返され、コピーに失敗した場合にはfalseが返されます。これにより、Assign関数を使用した後に戻り値を確認することで、データのコピーが正しく行われたかを判断できます。

この戻り値は、データの形式やサイズの違いが原因でコピーが行えなかった場合にfalseとなり、エラーの検出に役立ちます。Assign関数を使ってデータをコピーする際には、戻り値を確認することで、コピーが成功したかどうかを確かめることができます。

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

//--- 行列のコピーを行うサンプルコード
void OnStart()
{
    // 行列aを定義し、初期値として数値をセット
    matrix a = {{2, 2}, {3, 3}, {4, 4}};

    // 行列bをaに2を足した値で定義
    matrix b = a + 2;

    // 空の行列cを作成
    matrix c;

    // コンソールに行列aの内容を出力
    Print("matrix a \n", a);

    // コンソールに行列bの内容を出力
    Print("matrix b \n", b);

    // 行列bを行列cにコピーするためにAssign関数を使用
    c.Assign(b);

    // コンソールに行列cの内容を出力
    Print("matrix c \n", c);

    //--- 配列から行列にデータをコピーするサンプルコード
    // 2行10列の行列double_matrixを3.14で初期化して作成
    matrix double_matrix = matrix::Full(2, 10, 3.14);

    // コピー前のdouble_matrixの内容を出力
    Print("double_matrix before Assign() \n", double_matrix);

    // 5行5列の整数型2次元配列int_arrを定義し、初期値をセット
    int int_arr[5][5] = {{1, 2}, {3, 4}, {5, 6}};

    // 配列int_arrの内容を出力
    Print("int_arr: ");
    ArrayPrint(int_arr);

    // 配列int_arrをdouble_matrixにコピーするためにAssign関数を使用
    double_matrix.Assign(int_arr);

    // コピー後のdouble_matrixの内容を出力
    Print("double_matrix after Assign(int_arr) \n", double_matrix);
}

サンプルコードの解説

このサンプルコードでは、Assign関数を使用して行列配列を他の行列にコピーする方法を示しています。それぞれの部分を順に解説します。

まず、OnStart関数が定義されています。OnStart関数は、スクリプトが開始されたときに自動的に呼び出される特別な関数で、コードの処理の開始地点となります。

行列a、行列b、行列cの定義

コードの最初の部分では、行列a、行列b、行列cの3つの行列が定義されています。

行列aに3行2列の値を設定しています。matrixというデータ型は、行列を扱うために使用される型です。

行列aの各要素に2を足して新しい行列bを作成しています。ここで使われている加算演算子は、行列の各要素に2を加算する役割を持っています。

空の行列cを作成しています。行列cはこの後でデータがコピーされる予定です。

Print関数を使用して行列の内容を出力

Print関数は、指定されたテキストや変数の内容をエキスパートログに出力します。ここでは、行列a、行列b、行列cの内容をそれぞれ確認できるように出力しています。改行は改行を示しており、ログの見やすさのために使われています。

行列のコピー操作

Assign関数を使用して行列bの内容を行列cにコピーしています。Assign関数は、引数に指定した行列のデータをコピーし、行列cが行列bと同じデータを持つようにしています。これにより、行列bと同じ内容のデータが行列cに複製されます。

配列から行列へのデータコピー

次に、matrixのFullメソッドを使用してdouble_matrixという行列が定義されています。この行列は2行10列で、すべての要素が3.14という初期値で埋められています。

また、5行5列の整数型2次元配列int_arrが定義されています。この配列は部分的に初期化されており、残りの要素は0で埋められます。

Assign関数を使用して配列int_arrの内容を行列double_matrixにコピーしています。このとき、自動キャストが行われ、double_matrixが配列int_arrのサイズに合わせて自動的に調整されます。

配列int_arrの内容を出力

Print関数ArrayPrint関数を使用して、配列int_arrの内容をエキスパートログに出力しています。Print関数での出力内容は「int_arr:」というラベルだけを示し、ArrayPrint関数配列int_arrのすべての要素を詳細に出力します。これにより、int_arr内のデータがログに表示され、後に行うコピー操作の結果と比較しやすくなります。

Assign関数による配列のコピー操作

Assign関数を使用して配列int_arrの内容を行列double_matrixにコピーしています。このとき、自動キャストが行われ、double_matrixが配列int_arrのサイズに合わせて自動的に調整されます。

結果の出力

Assign関数を使ってコピーを行った後、再びPrint関数を使用してdouble_matrixの内容を出力し、コピーが成功したかどうかを確認しています。

このコードのように、Assign関数を使うと、行列配列のデータを他の行列ベクトルにコピーすることが可能です。
さらに、自動キャストによりデータのサイズが自動的に調整されるため、異なるサイズのデータにも柔軟に対応できる点が特徴です。

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

Assign関数を利用すると、データのコピーや変換が容易に行えるため、複雑なデータ処理が必要なエキスパートアドバイザーEA)の開発に大いに役立ちます。以下に、Assign関数を活用したEAのアイディアを紹介します。

価格データの分析と統計処理

Assign関数を使って、異なる時間軸の価格データ(1分足、5分足、1時間足など)を行列ベクトルにコピーし、統計的な分析を行うEAを作成することが可能です。
この方法により、異なる時間枠のデータを一元的に管理し、比較分析がしやすくなります。また、配列として取得した価格データを行列に変換し、平均値や分散、標準偏差といった統計指標を計算することで、トレンドの強さやボラティリティを数値化でき、より精度の高いトレード判断に貢献します。

パターン認識アルゴリズムの実装

行列ベクトルのデータに価格の変動パターンを保存し、Assign関数を使用して新しいデータと比較することで、特定のパターンが形成されているかどうかを検出するEAを作成することができます。
過去のパターンをベクトルに保存し、Assign関数でそのパターンをコピー・参照することで、リアルタイムで現在の価格変動との類似性を測定し、売買シグナルの発信に役立てることができます。これにより、パターンに基づいたトレード戦略の実装が可能になります。

異なるシンボルの相関分析

Assign関数を使用して、異なる通貨ペアのデータを行列にまとめ、相関分析を行うEAを開発することも可能です。この方法を使うことで、異なるシンボル(特定の文字や記号)間の相関性をリアルタイムで計測し、相関が高い通貨ペアを対象にエントリーやエグジットのタイミングを決定するロジックを構築できます。
通貨ペアごとのベクトルを作成し、Assign関数で一元管理することにより、複数のペアの相関をリアルタイムで監視するシンプルなコードが実現可能です。

データの一括管理とメモリ効率の向上

Assign関数を用いて複数の配列データを行列にまとめることで、データの一括管理が可能となり、コードの可読性が向上します。これにより、大量のデータを扱うEAメモリ使用量を最小限に抑え、EAのパフォーマンスが向上します。特に、過去の価格データやインジケータのデータをまとめて管理する場合には、Assign関数メモリ領域の一元化が可能となり、不要なデータのメモリ解放も容易に管理できるようになります。

Assign関数は、行列ベクトルのデータコピーと変換を効率よく行うため、柔軟で効率的なデータ管理が求められるEAの開発において非常に有用です。

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