Init関数の働き・役割
Init関数は、行列やベクトルを初期化するために使用されます。MQL5で行列やベクトルを操作する際には、データを特定の値や規則であらかじめ埋めることがよくあります。
Init関数を使用することで、行列やベクトルの各要素に順次値を割り当てたり、規則的に値を増加させたりすることができます。
行列とベクトルの違い
行列は、データを縦(行)と横(列)に並べた2次元の構造で、多くの値をまとめて管理する際に使用します。例えば、株価のデータを日付と時刻ごとに整理する際などに役立ちます。
一方、ベクトルは1次元のデータ構造で、数値やデータの並びを1列に整理したい場合に使われます。連続したデータや単一方向のデータの集合を扱う際に便利です。
Init関数を使うことで、行列やベクトルの要素を効率よく初期化でき、プログラム実行時にデータをスムーズに準備することができます。
Init関数の引数について
Init関数には、行列とベクトルを初期化するためにいくつかの情報を指定する必要があります。ここでは、行列とベクトルの初期化に使うそれぞれの引数について簡単に説明します。
行列(matrix::Init)の引数
void matrix::Init(
const ulong rows, // 行数
const ulong cols, // 列数
func_name init_func=NULL, // クラスのスコープまたは静的メソッドに配置されたinit関数
... parameters
);
最初の引数rows は、行列の行の数を指定します。行数を指定することで、行列が縦に何個のデータを持つかを決めます。
次の引数cols は、行列の列の数を指定します。これにより、行列が横に何個のデータを持つかが決まります。
三つ目の引数init_func は、行列のデータをどのように埋めるかを決めるための「初期化関数」を指定します。例えば、最初のデータから少しずつ増えるようにしたい場合や、特定の値で埋めたい場合など、この初期化関数を使って細かく調整できます。ここで関数を指定しないときは、NULL(何も指定しないこと)として扱われます。
四つ目の引数… は、init_func に渡す「追加のデータ」を指定します。例えば、初期化のときに使う開始の値や増える量など、必要な設定を行えます。
ベクトル(vector::Init)の引数
void vector::Init(
const ulong size, // vector size
func_name init_func=NULL, // クラスのスコープまたは静的メソッドに配置されたinit関数
... parameters
);
最初の引数 size は、ベクトルのデータの個数(サイズ)を指定します。これにより、ベクトルが何個のデータを持つかが決まります。
次の引数init_func は、ベクトルのデータをどのように初期化するかを決めるための関数です。こちらも関数を指定することで、データの初期化の仕方を細かく調整できます。特に関数を指定しない場合は、NULL が使われます。
三つ目の引数… は、init_func に渡す追加のデータです。ベクトルの初期化に使いたい値や条件をここで設定できます。
Init関数の戻り値について
Init関数は、行列やベクトルを初期化するための関数であり、戻り値はありません。
Init関数の役割は、指定された行数・列数やサイズ、初期化関数に従って行列やベクトルの各要素を設定することです。そのため、処理が完了した後は、初期化された行列やベクトルがそのまま使える状態になっていますが、Init関数自体から何かの値が返されることはありません。
Init関数を使ったサンプルコード
以下は、Init関数を使って行列とベクトルを初期化する例です。サンプルコードには、行列やベクトルの各要素に特定の値を設定するための関数「MatrixArange」と「VectorArange」を使用しています。
// テンプレート関数 MatrixArange
// 行列の各要素に初期値と増分を指定して値を割り当てます
template<typename T>
void MatrixArange(matrix<T> &mat, T value=0.0, T step=1.0)
{
// 行をループで処理する
for(ulong i=0; i<mat.Rows(); i++)
{
// 列をループで処理する
for(ulong j=0; j<mat.Cols(); j++, value+=step)
mat[i][j] = value; // 各要素に値を設定してから、次に進む
}
}
// テンプレート関数 VectorArange
// ベクトルの各要素に初期値と増分を指定して値を割り当てます
template<typename T>
void VectorArange(vector<T> &vec, T value=0.0, T step=1.0)
{
// ベクトルの要素数分ループを回す
for(ulong i=0; i<vec.Size(); i++, value+=step)
vec[i] = value; // 各要素に値を設定してから、次に進む
}
// スクリプトプログラムの開始関数
void OnStart()
{
// 行列とベクトルのサイズを指定
int size_m = 3, size_k = 4;
// 行列mを初期化
// 3行4列の行列にMatrixArange関数を使って初期値-2、増分0.1で値を割り当てる
matrix m(size_m, size_k, MatrixArange, -2., 0.1);
Print("matrix m \n", m); // 行列mの内容をエキスパートログに出力
// float型の行列m_floatを初期化
// 5行5列の行列にMatrixArange関数を使って初期値-2.0f、増分0.1fで値を割り当てる
matrixf m_float(5, 5, MatrixArange, -2.f, 0.1f);
Print("matrix m_float \n", m_float); // 行列m_floatの内容をエキスパートログに出力
// ベクトルvを初期化
// 4つの要素を持つベクトルにVectorArange関数を使って初期値-10で値を割り当てる
vector v(size_k, VectorArange, -10.0);
Print("vector v \n", v); // ベクトルvの内容をエキスパートログに出力
/* エキスパートログ出力例:
matrix m
[[-2, -1.9, -1.8, -1.7],
[-1.6, -1.5, -1.4, -1.3],
[-1.2, -1.1, -1.0, -0.9]]
matrix m_float
[[-2.0, -1.9, -1.8, -1.7, -1.6],
[-1.5, -1.4, -1.3, -1.2, -1.1],
[-1.0, -0.9, -0.8, -0.7, -0.6],
[-0.5, -0.4, -0.3, -0.2, -0.1],
[0.0, 0.1, 0.2, 0.3, 0.4]]
vector v
[-10.0, -9.0, -8.0, -7.0]
*/
}
サンプルコードの解説
このサンプルコードでは、Init関数を使って行列とベクトルの初期化を行っています。それぞれの構成について、中学生にもわかるように解説します。
テンプレート関数と template キーワードについて
このコードにはテンプレートを使った関数である MatrixArange関数と VectorArange関数 が含まれています。テンプレートとは、さまざまな型(例えば、整数型の int や小数を扱う float など)に対応するようにした関数のことです。テンプレートを使うことで、同じ名前の関数が複数の型で動作するようになります。たとえば、MatrixArange関数を int 型でも float 型でも使えるようにしたい場合、テンプレートにしておくと便利です。
template キーワードは、関数をテンプレートとして宣言するときに使用します。たとえば template と記述すると、この T という型は関数を呼び出すときに指定される型に置き換わります。このコードでは、MatrixArange関数や VectorArange関数を呼び出すときに型が決定され、指定した型に合わせて処理が行われます。
typename は、テンプレート関数の中で使われる型の名前を指定するためのキーワードです。T という名前で型を指定しており、呼び出し時に設定した型に自動的に置き換わります。たとえば、行列 matrix に対して MatrixArange関数を呼び出すと、T は double 型に置き換わって処理されます。
MatrixArange関数について
MatrixArange関数は、行列の各要素に初期値と増分(step)を使って値を割り当てるための関数です。具体的には、2つの for 文(繰り返し文)を使って行(i)と列(j)をループし、各要素mat[i][j] に順次値を設定しています。ここで、i は行、j は列を表し、value は初期値から step ずつ増えながら各要素に設定されます。
VectorArange関数について
VectorArange関数はベクトルの各要素に値を設定するための関数です。この関数も for 文を使ってベクトルの各要素を順にループし、要素ごとに value の値を設定しています。MatrixArange関数と同様に、value は step ごとに増えながら次の要素に設定されます。
matrixキーワードとmatrixfキーワードの違い
このサンプルコードには、matrix と matrixf の2種類のキーワードが登場します。どちらも行列を扱うためのキーワードですが、扱うデータの型が異なります。
- matrix は、一般的なデータ型(例えば int 型や double 型など)で行列を定義するときに使います。このコードでは、matrix m が int 型や double 型の行列として使われています。
- matrixf は float 型(小数点以下の精度が通常の小数よりも少し低い型)を使って行列を定義するためのキーワードです。このコードでは、matrixf m_float が float 型の行列として使われています。
float 型はメモリの使用量が少なく処理が速いという特徴があり、特に大量のデータを扱う際に便利です。一方で、double 型のように高精度な計算を必要とする場合には適していないこともあります。このサンプルコードでは、行列 m_float が matrixf によって float 型で定義され、軽量な計算に使われています。
-2.0f、増分 0.1f の意味
行列m_float を初期化する際、MatrixArange関数に初期値として -2.0f、増分として 0.1f が指定されています。このように数値の後に f をつける表記は、その数値を float 型で扱うことを示しています。例えば、-2.0 だけだと double 型(精度が高い小数)と解釈されますが、f を付けて -2.0f とすることで、float 型の値として認識されます。float 型はメモリの使用量が少なく、処理も速くなるという利点があります。
OnStart関数について
OnStart関数 は、スクリプトが実行されたときに最初に呼び出される関数です。この中で行列やベクトルのサイズを設定し、MatrixArange関数 や VectorArange関数を使って初期化しています。
- 行列m は、行数を 3、列数を 4 として、初期値 -2.0、増分 0.1 の設定で MatrixArange関数 を使用して初期化しています。行列mの内容は、そのままエキスパートログに出力されます。
- 行列m_float は、行数を 5、列数を 5 とし、float型の行列として初期化されています。初期値 -2.0f、増分 0.1f の設定で MatrixArange関数を使ってデータを割り当て、エキスパートログに出力します。
- ベクトルv は、要素数を 4 とし、初期値 -10.0 の設定で VectorArange関数を使って初期化しています。ベクトルvもエキスパートログに出力され、各要素に値が設定されたことが確認できます。
Print関数 は、エキスパートログに行列やベクトルの内容を出力するために使用されます。
Init関数を使ってEAを作る際のアイディア
Init関数を使って行列やベクトルを初期化することで、トレーディングアルゴリズムやエキスパートアドバイザー(EA)のデータ処理が効率化されます。以下に、Init関数を活用したEAのアイディアをいくつか紹介します。
過去データの統計的分析
トレード戦略において、過去の価格データの統計的な分析を行うことは重要です。Init関数で行列を初期化し、ローソク足データ(始値、高値、安値、終値など)を行列に格納して解析することができます。これにより、価格の変動パターンや相場の特徴を調べ、戦略の精度向上に役立てることが可能です。
Init関数によるマルチタイムフレーム分析
マルチタイムフレーム分析とは、異なる時間足(例えば、1分足、5分足、1時間足など)のデータを同時に使用し、複数の視点から相場を分析する手法です。
短期的な変動と長期的なトレンドを組み合わせることで、エントリーやエグジットのタイミングをより精度高く判断できるようになります。
Init関数を使って、タイムフレームごとに異なるサイズの行列を初期化し、それぞれの時間足のデータを格納することで、マルチタイムフレーム分析を実現します。
こうして得られたデータを基に、トレンドやサポート・レジスタンスレベルを識別し、より多角的なトレード戦略の立案が可能になります。
テクニカル指標の計算用バッファ(データ領域)作成
Init関数でベクトルを初期化し、テクニカル指標(移動平均、ボリンジャーバンドなど)を計算するためのバッファ(データを一時的に保持する領域)を作成できます。例えば、移動平均を計算するために、過去n期間の終値をベクトルに格納し、リアルタイムで更新して計算することが可能です。
複数通貨ペアの相関分析
Init関数で複数の行列を用意し、異なる通貨ペアごとの価格データを各行列に格納します。通貨ペア間の相関関係を分析するために、これらの行列を使って過去データの相関を計算し、強い相関を持つ通貨ペアのトレード戦略を立案することができます。
機械学習のためのデータセット作成
機械学習を用いたトレード戦略においても、Init関数は有用です。例えば、行列を初期化して、価格変動やテクニカル指標を特徴量として格納し、トレーニングデータセットとして使用できます。このようにして、相場予測や売買判断のためのモデルを作成する際に役立てることができます。
カスタムトレードシミュレーション
Init関数で行列を初期化し、仮想的なポジション情報や資金管理の記録を格納することで、バックテストやトレードシミュレーションを行うことができます。
ポジションサイズやリスク管理パラメータを追跡する行列を用意することで、仮想トレードのパフォーマンスを分析し、実際のトレードに活かすことができます。
Init関数は、これらのさまざまな用途でデータの初期化や管理を効率化し、EAの構築を支える強力な手段となります。