【MQL5】Row関数について

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

Row関数の働き・役割

Row関数は、指定した行番号に対応する行ベクトルを取得したり、指定した行に新しいベクトルを書き込むための関数です。この関数には2つの形式があり、それぞれ以下のような役割を持ちます。

  1. 指定した行番号に対応する行ベクトルを取得します。
  2. 指定した行番号に新しい行ベクトルを書き込みます。この際、行列の次元が未割り当ての場合は、自動的にゼロ行列が生成され、ベクトルの値が設定されます。既存の行列に対して操作を行う場合は、行列の次元は変更されませんが、指定した行の値だけが更新されます。

この関数は、行列操作を柔軟に管理するために利用され、行ごとのデータ処理や動的な行列の編集に適しています。

Row関数の引数について

Row関数は、行ベクトルを取得する場合と設定する場合で異なる2つの書式を持ちます。それぞれの書式と引数について説明します。

書式1:行ベクトルを取得する場合

vector matrix::Row(const ulong nrow);

引数
nrow(行番号)

  • 種類:ulong型
  • 説明:行列から取得する行の番号を指定します。この番号は、0から始まるインデックス(通し番号)を示します。指定された行のデータがベクトル形式で返されます。

書式2:行ベクトルを設定する場合

void matrix::Row(const vector v, const ulong nrow);

引数
v(行ベクトル

  • 種類:vector
  • 説明:行列の指定した行に設定するベクトルを指定します。このベクトルのサイズが現在の列数と異なる場合、自動的に対応する列が拡張または無視される形で適用されます。

nrow(行番号)

  • 種類:ulong型
  • 説明:行列においてベクトルを設定する行の番号を指定します。この番号は、0から始まるインデックス(通し番号)を示します。指定された行番号に従って行列が更新されます。

関数の戻り値について

Row関数戻り値は、使用する書式によって異なります。それぞれの戻り値について説明します。

書式1:行ベクトルを取得する場合

書式1では、指定された行のデータを行ベクトル形式で返します。

  • 戻り値の種類
    vector
  • 内容
    指定された行番号に対応する行ベクトルを返します。返されるベクトルは、行列内の該当行のデータを反映しています。
    例として、行列が[ [1, 2, 3], [4, 5, 6] ]の場合にRow(0)を呼び出すと、ベクトル[1, 2, 3]が返されます。
  • 特記事項
    指定した行番号が行列の範囲外の場合、エラーが発生する可能性があります。

書式2:行ベクトルを設定する場合

書式2はvoid型のため、戻り値はありません。

  • 戻り値の種類
    なし(void型
  • 内容
    ベクトルを指定された行に設定する操作を実行します。設定後の行列全体の状態は、行列の次元や行ベクトルのサイズに応じて変化します。
  • 特記事項
    未割り当て行列に行を設定する場合、行列は自動的に拡張されます。この際、新たに生成される行や列の値はすべて0で初期化されます。

未割り当て行列について

未割り当て行列とは、次元(行数や列数)が設定されておらず、どのようなデータも持たない状態の行列を指します。
これは、matrix型の変数を初期化した直後や、Resizeメソッドなどで次元をリセットした場合に発生します。未割り当て状態では行列内の要素を参照することはできませんが、新たな行や列を設定する操作を行うと、自動的にゼロで初期化された行列が作成されます。

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

以下はRow関数の使用例です。それぞれ、行ベクトルの設定と取得の動作を確認するコードを含んでいます。

void OnStart()
{
    // ベクトルを作成します。これは行ベクトルとして使用されます。
    vector v1 = {1, 2, 3};

    // 空の行列を作成します。現在は何の要素も含まれていません。
    matrix m1;

    // m1の行1にv1を設定します。
    m1.Row(v1, 1);

    // m1の内容をエキスパートログに出力します。
    Print("m1\n", m1);

    // サイズ4x5の行列m2を作成し、初期値をすべて7に設定します。
    matrix m2 = matrix::Full(4, 5, 7);

    // m2の行2にv1を設定します。
    m2.Row(v1, 2);

    // m2の内容をエキスパートログに出力します。
    Print("m2\n", m2);

    // m2の行1を取得し、その内容をエキスパートログに出力します。
    Print("row 1 - ", m2.Row(1));

    // m2の行2を取得し、その内容をエキスパートログに出力します。
    Print("row 2 - ", m2.Row(2));
}

このコードの実行結果

m1
[[0,0,0]
 [1,2,3]]
m2
[[7,7,7,7,7]
 [7,7,7,7,7]
 [1,2,3,7,7]
 [7,7,7,7,7]]
row 1 - [7,7,7,7,7]
row 2 - [1,2,3,7,7]

Row関数サンプルコードの解説

このサンプルコードでは、Row関数を使い、以下の2つの操作を行っています。

ベクトルを指定した行に設定する。
指定した行のデータを取得する。

コードの中で使用されている各部分について詳しく説明します。

ベクトルの作成

この部分では、vector型の変数v1を作成し、初期値として1, 2, 3を代入しています。
vectorは、行や列のデータを格納するために使用されるMQL5データ型です。リテラル(直接値を示す文字列)として、1, 2, 3は3つの値を持つベクトルを表します。

空の行列の作成

matrix型の変数m1を作成しています。この行列は初期状態では未割り当てで、行や列の情報を持ちません。

行ベクトルの設定

ここでは、Row関数の書式2を使用しています。
ベクトルv1を行列m1の1行目に設定しています。以下の動作が行われます。

行列m1が未割り当てであるため、サイズ3×2のゼロ行列が自動的に生成されます。この行列は、ベクトルのサイズ(3)を列数とし、行番号に応じて行数を決定します。
指定された行番号(1)にv1の値1, 2, 3が設定されます。

行列の初期化

matrix::Fullは、指定したサイズの行列を作成し、すべての要素を同じ値で初期化するメソッドです。
ここでは、サイズ4×5の行列を作成し、全要素を7で初期化しています。

行ベクトルの更新

行列m2の行2にv1の値を設定しています。既存の行列に対する操作では、行列の次元は変更されません。指定した行番号(2)以外の要素はそのまま保持されます。

行ベクトルの取得

Row関数の書式1を使用して、行列m2の行1のデータを取得しています。このデータは、ベクトル形式で返されます。

エキスパートログへの出力

Print関数は、指定された値をエキスパートログに出力するための関数です。デバッグや結果の確認に利用されます。

結果の解釈

コードの実行結果は、行列の内容がどのように変更されたかを示しています。

行列m1は、未割り当てから2行の行列に拡張され、行1にv1が設定されています。
行列m2は、行2にv1が設定され、他の行の内容は変更されていません。
Row関数を使って取得したデータは、指定した行のベクトル形式で出力されています。

基本的な文法事項

データ型

vectormatrixMQL5でのデータ型で、ベクトル行列を扱います。

変数の宣言と初期化

変数

データ型 変数名 = 値

の形式で宣言します。例として、vector型の変数を作成し、初期化する方法があります。

メソッドの呼び出し

メソッド関数)はインスタンス名.メソッド名(引数)の形式で呼び出します。例えば、行ベクトルを設定する場合、指定した行番号を引数として渡します。

インデックス(通し番号)

行列ベクトルの行や列は、0から始まるインデックス(通し番号)でアクセスします。

このようにして、Row関数を用いた行列操作を理解できます。

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

Row関数は、行列の行データを取得・設定する操作が可能なため、EA(:エキスパートアドバイザー)の開発において、以下のようなアイディアに応用できます。

1. トレードデータの管理と分析

トレード履歴やマーケットデータを行列形式で管理し、Row関数を使用して個別のトレードデータを操作できます。例えば、以下のような応用が可能です。

  • 各行に1回のトレード情報(エントリー価格、エグジット価格、利益など)を格納し、トレードごとの分析を効率化。
  • 行ごとに設定されたトレード条件を修正し、バックテスト中のパラメータ変更を実現。

2. マルチシンボル戦略のデータ管理

複数の通貨ペアや金融商品のデータを行列に保存し、行ごとにシンボルデータを管理する戦略で使用できます。

  • 各行を1つのシンボルに割り当て、対応するデータ(OHLC価格、インジケータの値)を行ベクトルで操作。
  • Row関数で特定シンボルの行データを取得し、分析や条件判定を行う。

3. 機械学習モデルへのデータ入力

行列機械学習モデルにデータを入力する際の形式として非常に便利です。Row関数を使えば、以下のような処理が可能です。

  • 行ごとに過去の価格データやインジケータ値を保存し、行列全体をモデルのトレーニングデータとして利用。
  • 特定の行を抽出して、モデルの評価や予測に使用。

4. カスタムインジケータの作成

カスタムインジケータで複雑な計算が必要な場合、行列を用いたデータ管理により効率化が期待できます。

  • 行列の各行にインジケータの中間データを格納し、計算ステップごとにRow関数でデータを更新。
  • 過去データの行を取得し、直近の値と比較するロジックを簡潔に実装。

5. マルチタイムフレームの戦略

異なるタイムフレームのデータを行列で保持し、行ごとにタイムフレームを区別することで、効率的なマルチタイムフレーム戦略を設計できます。

  • 行列の行をタイムフレームに対応させ、行ごとのデータ(終値、移動平均など)をRow関数で取得。
  • 複数のタイムフレームを比較してトレード条件を判定。

6. ダイナミックな行列構造の管理

Row関数を使うことで、行列の特定の行を動的に変更できます。これにより、以下のような機能を実現できます。

  • 新しいトレードが発生するたびに対応する行データを追加・更新。
  • 特定の条件を満たさないデータをゼロ行列で置き換え、効率的なメモリ管理を実現。

これらのアイディアは、Row関数を使用して行列データを効率的に操作することで、EAの設計や機能拡張に役立てることができます。

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