Row関数の働き・役割
Row関数は、指定した行番号に対応する行ベクトルを取得したり、指定した行に新しいベクトルを書き込むための関数です。この関数には2つの形式があり、それぞれ以下のような役割を持ちます。
- 指定した行番号に対応する行ベクトルを取得します。
- 指定した行番号に新しい行ベクトルを書き込みます。この際、行列の次元が未割り当ての場合は、自動的にゼロ行列が生成され、ベクトルの値が設定されます。既存の行列に対して操作を行う場合は、行列の次元は変更されませんが、指定した行の値だけが更新されます。
この関数は、行列操作を柔軟に管理するために利用され、行ごとのデータ処理や動的な行列の編集に適しています。
Row関数の引数について
Row関数は、行ベクトルを取得する場合と設定する場合で異なる2つの書式を持ちます。それぞれの書式と引数について説明します。
書式1:行ベクトルを取得する場合
vector matrix::Row(const ulong nrow);
引数
nrow(行番号)
書式2:行ベクトルを設定する場合
void matrix::Row(const vector v, const ulong nrow);
nrow
(行番号)
関数の戻り値について
Row関数の戻り値は、使用する書式によって異なります。それぞれの戻り値について説明します。
書式1:行ベクトルを取得する場合
書式1では、指定された行のデータを行ベクトル形式で返します。
- 戻り値の種類
vector型 - 内容
指定された行番号に対応する行ベクトルを返します。返されるベクトルは、行列内の該当行のデータを反映しています。
例として、行列が[ [1, 2, 3], [4, 5, 6] ]の場合にRow(0)を呼び出すと、ベクトル[1, 2, 3]
が返されます。 - 特記事項
指定した行番号が行列の範囲外の場合、エラーが発生する可能性があります。
書式2:行ベクトルを設定する場合
- 戻り値の種類
なし(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関数を使って取得したデータは、指定した行のベクトル形式で出力されています。
基本的な文法事項
データ型
vectorとmatrixはMQL5でのデータ型で、ベクトルと行列を扱います。
変数の宣言と初期化
変数は
の形式で宣言します。例として、vector型の変数を作成し、初期化する方法があります。
メソッドの呼び出し
メソッド(関数)はインスタンス名.メソッド名(引数)の形式で呼び出します。例えば、行ベクトルを設定する場合、指定した行番号を引数として渡します。
インデックス(通し番号)
行列やベクトルの行や列は、0から始まるインデックス(通し番号)でアクセスします。
Row関数を使ってEAを作る際のアイディア
Row関数は、行列の行データを取得・設定する操作が可能なため、EA(:エキスパートアドバイザー)の開発において、以下のようなアイディアに応用できます。
1. トレードデータの管理と分析
トレード履歴やマーケットデータを行列形式で管理し、Row関数を使用して個別のトレードデータを操作できます。例えば、以下のような応用が可能です。
- 各行に1回のトレード情報(エントリー価格、エグジット価格、利益など)を格納し、トレードごとの分析を効率化。
- 行ごとに設定されたトレード条件を修正し、バックテスト中のパラメータ変更を実現。
2. マルチシンボル戦略のデータ管理
複数の通貨ペアや金融商品のデータを行列に保存し、行ごとにシンボルデータを管理する戦略で使用できます。
3. 機械学習モデルへのデータ入力
行列は機械学習モデルにデータを入力する際の形式として非常に便利です。Row関数を使えば、以下のような処理が可能です。
4. カスタムインジケータの作成
カスタムインジケータで複雑な計算が必要な場合、行列を用いたデータ管理により効率化が期待できます。
5. マルチタイムフレームの戦略
異なるタイムフレームのデータを行列で保持し、行ごとにタイムフレームを区別することで、効率的なマルチタイムフレーム戦略を設計できます。
6. ダイナミックな行列構造の管理
Row関数を使うことで、行列の特定の行を動的に変更できます。これにより、以下のような機能を実現できます。
これらのアイディアは、Row関数を使用して行列データを効率的に操作することで、EAの設計や機能拡張に役立てることができます。