Col関数の働き・役割
Col関数は、行列(matrix)クラスにおいて指定された列のデータを取得または設定するために使用されます。この関数は2つの形式(バリアント)を持っており、特定の列をベクトルとして返す形式と、指定されたベクトルを特定の列に書き込む形式があります。
また、未割り当て行列(次元を持たない行列)に対して使用することも可能です。この場合、自動的にゼロで初期化された行列が生成され、指定した列にベクトルが書き込まれます。列を書き込む場合、既存の行列サイズは変更されず、列外の要素は影響を受けません。
この関数は行列の操作において、特定の列を扱う際に重要な役割を果たします。たとえば、データの部分的な操作や解析に利用されます。
Col関数の引数について
Col関数には、ベクトルを返す形式とベクトルを設定する形式の2つがあります。それぞれの形式について引数を以下に説明します。
ベクトルを返す形式
vector matrix::Col(
const ulong ncol // 列番号
);
例として、行列の2列目を取得する場合、引数ncol
には2
を指定します。
ベクトルを設定する形式
void matrix::Col(
const vector v, // 列ベクトル
const ulong ncol // 列番号
);
ベクトルを行列の特定の列に書き込む形式では、以下の引数を取ります。
- 第1引数:
v
書き込むベクトルを指定します。データ型はvector型です。
指定されたベクトルが行列の列として書き込まれます。 - 第2引数:
ncol
ベクトルを設定する列番号を指定します。データ型はulong型です。
指定された列番号の列にベクトルのデータが書き込まれます。
たとえば、ベクトル{1, 2, 3}
を行列の1列目に書き込む場合、引数v
に{1, 2, 3}
、ncol
に1
を指定します。
これらの引数により、Col関数は特定の列を柔軟に取得したり設定したりすることができます。行列の次元が未割り当ての場合でも、この関数を使って新しい行列を動的に初期化できます。
Col関数の戻り値について
Col関数の戻り値は、使用する形式によって異なります。それぞれの形式における戻り値を以下に説明します。
ベクトルを返す形式
ベクトルを取得する形式では、指定された列を表すベクトルを返します。このベクトルは、行列内の指定列に対応するデータを保持しています。
たとえば、行列の2列目を取得する場合、戻り値はその列を表すベクトルとなります。列内の要素が順に格納されたベクトルが返されます。
ベクトルを設定する形式
ベクトルを設定する形式では、関数は戻り値を持ちません。この形式はvoid型であり、指定されたベクトルを行列の特定の列に設定することに専念しています。
たとえば、未割り当て行列(次元を持たない行列)にベクトルを設定した場合、自動的にゼロで初期化された行列が生成され、その列にベクトルが書き込まれます。この操作自体に戻り値はありません。
これにより、Col関数はデータの取得時に結果を明確に返し、データの設定時には効率的に行列に変更を加えることが可能です。
Col関数を使ったサンプルコード
以下に、Col関数を使用して行列の特定の列を取得および設定する例を示します。
// MQL5のスクリプトとして実行されるエントリーポイント
void OnStart()
{
// ベクトルv1を定義し、要素1, 2, 3を持たせる
vector v1 = {1, 2, 3};
// 空の行列m1を定義する
matrix m1;
// ベクトルv1を行列m1の1列目に設定する
m1.Col(v1, 1);
// 行列m1の内容をエキスパートログに出力する
Print("m1\n", m1);
// 4行5列の行列m2を定義し、全ての要素を8で初期化する
matrix m2 = matrix::Full(4, 5, 8);
// ベクトルv1を行列m2の2列目に設定する
m2.Col(v1, 2);
// 行列m2の内容をエキスパートログに出力する
Print("m2\n", m2);
// 行列m2の1列目を取得し、エキスパートログに出力する
Print("col 1 - ", m2.Col(1));
// 行列m2の2列目を取得し、エキスパートログに出力する
Print("col 2 - ", m2.Col(2));
}
実行結果の例:
m1
[[0,1]
[0,2]
[0,3]]
m2
[[8,8,1,8,8]
[8,8,2,8,8]
[8,8,3,8,8]
[8,8,8,8,8]]
col 1 - [8,8,8,8]
col 2 - [1,2,3,8]
サンプルコードの解説
このサンプルコードでは、MQL5のCol関数を使って行列(matrix)の特定の列を取得したり、設定したりする方法を実演しています。以下にコードの各部分を詳しく解説します。
1. OnStart関数の定義
MQL5では、スクリプトを実行する際に必ず最初に呼び出される関数がOnStart関数です。この関数の中にコードを記述することで、スクリプトの動作を制御します。
ここでは、OnStart関数内にCol関数を用いた処理を記述しています。
voidは、この関数が何も戻り値を返さないことを示します。OnStartは関数名で、スクリプトのエントリーポイントを表します。
2. ベクトルv1の定義
コードでは次に、ベクトル(vector型)の変数v1を定義しています。
vectorは、数値のリストを扱うためのデータ型です。複数の数値を一つのまとまりとして保存できます。v1は変数名で、このベクトルを指します。{1, 2, 3}はベクトルの要素を指定する部分です。この場合、v1には1, 2, 3の3つの数値が格納されます。
3. 空の行列m1の作成
matrixは行列を扱うためのデータ型です。m1は変数名で、この行列を指します。この時点ではm1は未割り当てで、行や列を持っていません。
4. Col関数を使ってベクトルを行列の列に設定
ここでCol関数を使い、ベクトルv1を行列m1の1列目に設定します。
m1.Colは、行列m1のColメソッドを呼び出しています。引数v1は、設定するデータを持つベクトルです。引数1は、設定先となる列番号を指定しています。この場合、1列目にv1が設定されます。
行列m1が未割り当てであった場合、Col関数は自動的にゼロで初期化された行列を生成し、その中の1列目にv1を設定します。
5. 行列m1の内容を表示
以下のコードで、行列m1の内容をエキスパートログに出力しています。
Print関数は、指定した内容をエキスパートログに出力するための関数です。”m1\n”はテキストで、\nは改行を意味します。m1は出力したい行列です。
出力結果として、以下のように行列m1が表示されます。
[[0,1] [0,2] [0,3]]
6. 初期化された行列m2の作成
次に、特定の値で初期化された行列m2を作成します。
matrix::Fullは、行数・列数と初期値を指定して行列を作成する静的メソッドです。引数4は行数を、5は列数を指定しています。この場合、4行5列の行列が作成されます。引数8は、行列内の全ての要素を8で初期化することを意味します。
7. Col関数を使って別の列にベクトルを設定
m2.Colは、行列m2のColメソッドを呼び出しています。引数2は、2列目を指定しています。この列にv1の要素1, 2, 3が設定されます。
既存の行列に列を設定する場合、行列の次元(行数・列数)は変更されず、指定した列にのみベクトルが書き込まれます。
8. 行列m2の内容を表示
以下のコードで、行列m2の内容をエキスパートログに出力します。
行列m2の内容は以下の通りです。
[[8,8,1,8,8] [8,8,2,8,8] [8,8,3,8,8] [8,8,8,8,8]]
9. 特定の列を取得して表示
以下のコードで、行列m2の1列目と2列目を取得し、それぞれの内容をエキスパートログに出力します。
m2.Col(1)は、行列m2の1列目をベクトルとして取得しています。m2.Col(2)は、行列m2の2列目をベクトルとして取得しています。
出力結果は以下の通りです。
col 1 – [8,8,8,8] col 2 – [1,2,3,8]
Col関数を使ってEAを作る際のアイディア
Col関数を使用することで、行列の列データを効率的に取得・設定できます。この特性を活用することで、エキスパートアドバイザ(EA)の開発において次のような応用が考えられます。
1. 複数通貨ペアの時系列データ管理
Col関数を用いて、各通貨ペアの価格データ(例えば終値や高値)を行列の列として管理することができます。行ごとに異なる時間足を対応させることで、複数通貨ペアのデータを1つの行列にまとめ、分析やトレードロジックに活用できます。
たとえば、EUR/USDの価格データを1列目に、USD/JPYを2列目に格納し、それぞれのデータを必要なタイミングでCol関数を使って取り出します。
2. テクニカル指標の結果の保存と比較
テクニカル指標(インジケータ)の結果を行列に保存し、特定の条件で比較するためにCol関数を利用します。
各列に異なるインジケータの計算結果を保持することで、インジケータ間の相関関係やトレードシグナルの一致を簡単に分析できます。
例として、移動平均のデータを1列目に、RSIのデータを2列目に格納し、異なる指標の条件が一致したタイミングで売買シグナルを生成するロジックを構築できます。
3. 過去のバックテストデータの操作
バックテストの履歴データを行列として管理し、Col関数で特定の列(例えば取引結果や価格変動の統計データ)を取り出して検証を行うことが可能です。これにより、トレードパフォーマンスの詳細な分析が容易になります。
例えば、トレード結果を格納した列を選択し、収益率や勝率を計算するEAを作成できます。
4. 自動ポートフォリオ最適化
複数資産のリターンやリスクを行列で表現し、Col関数を用いて個々の資産に対応するデータを操作することで、ポートフォリオの自動最適化を行うことができます。リスクやリターンの計算結果を列ごとに管理し、それらを最適化アルゴリズムで処理するEAを構築できます。
5. トレード条件の多次元評価
複数のトレード条件を行列の列として管理し、Col関数を使ってそれぞれの条件を独立して評価できます。これにより、複数のトレードロジックを並列的に実行し、最も良いパフォーマンスを示す条件を選択するEAを作ることが可能です。
例えば、各列に異なる取引戦略のシグナルを保存し、そのうち特定の条件に合致する戦略のみを使用するロジックを実装できます。
Col関数を活用することで、行列データの柔軟な管理が可能になり、複雑な分析やトレードロジックを実現するEAを作成できる可能性が広がります。