【MQL5】ArgMax関数について

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

ArgMax関数の働き・役割

ArgMax関数は、行列ベクトル(数値の集まり)の中で最大値がどこにあるのかを調べ、その位置を示すインデックス(通し番号)を返します。この関数は、特定の数値データから効率的に最大値を見つけるために使用されます。

この関数の機能は、金融データの分析やトレード戦略のロジック構築に役立ちます。

例えば、EAエキスパートアドバイザ)のロジックで次のような場面に応用できます:

  • 複数の通貨ペアボラティリティを比較して、最も値動きが激しい通貨ペアを選ぶ。
  • 一定期間のローソク足の価格データを分析し、最も高い価格が記録されたポイントを特定する。
  • インジケータの複数のラインから最大の値を持つラインを抽出し、その結果を基に取引シグナルを生成する。

例えば、ある通貨ペアの1時間足データを一定期間取得して、その中で最も高い高値(High)のインデックスを取得し、そのポイントを基にエントリーやエグジットのロジックを構築できます。

ArgMax関数の引数について

ArgMax関数には3つの異なる書式があります。それぞれの引数と挙動について説明します。


1. ベクトルに適用する場合

ulong vector::ArgMax();

この書式では、ベクトル全体の中で最大値を検索し、そのフラットインデックス(1次元の位置)を返します。引数は必要ありません。

書式
ulong vector::ArgMax();

説明
ベクトルの全要素を順に探索し、最大値を持つ要素フラットインデックスを返します。


2. 行列全体に適用する場合

ulong matrix::ArgMax();

この書式では、行列全体を1次元のデータとして扱い、最大値を検索します。その結果、最大値を持つ要素フラットインデックスを返します。引数は必要ありません。

書式
ulong matrix::ArgMax();

説明
行列を1次元化してすべての要素を比較し、最大値を持つ要素フラットインデックスを返します。

フラットインデックスについて
フラットインデックスとは、行列のような2次元のデータを1次元化した際の位置を表します。例えば、行列要素を行ごとに平坦化した場合、最初の要素インデックス0、その次がインデックス1となります。


3. 行列の特定の軸に適用する場合

vector matrix::ArgMax(
  const int  axis      // 軸
  );

この書式では、行列の特定の軸(行ごとまたは列ごと)に沿って最大値を検索します。1つの引数で軸を指定します。

書式
vector matrix::ArgMax(const int axis);

引数

  • axis
    • 型: 整数型 (int)
    • 値: 0 または 1
    • 説明: 行列内でどの方向に沿って最大値を検索するかを指定します。
      • 0 を指定すると列ごとの最大値のインデックスを計算します(垂直方向)。
      • 1 を指定すると行ごとの最大値のインデックスを計算します(水平方向)。

ArgMax関数の戻り値について

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


1. ベクトルに適用する場合

ベクトル全体の中で最大値を持つ要素フラットインデックスを返します。


2. 行列全体に適用する場合

行列全体を1次元データとして扱い、最大値を持つ要素フラットインデックスを返します。


3. 行列の特定の軸に適用する場合

指定された軸(行または列)ごとに最大値を持つ要素インデックスを計算し、その結果をベクトルとして返します。


フラットインデックスの具体例

行列に対してフラットインデックスを返す場合、次のように計算されます。例えば、次の行列を考えます。

[[10, 3, 2],
 [ 1, 8,12],
 [ 6, 5, 4],
 [ 7,11, 9]]

この行列に対して第2書式を使用すると、行列を1次元化して次のように扱います。

[10, 3, 2, 1, 8, 12, 6, 5, 4, 7, 11, 9]

この1次元データの中で最大値(12)が見つかり、その位置である 5フラットインデックスとして返されます。


ArgMax関数戻り値は、EAでのデータ処理において、最大値の位置を効率よく特定する際に活用できます。特に、フラットインデックス行列全体の中での絶対位置を、ベクトルは軸ごとの相対位置を示すため、目的に応じて使い分けることが重要です。

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

// 行列を初期化します。4行3列の行列です。
matrix mat = {{10, 3, 2}, 
              {1, 8, 12}, 
              {6, 5, 4}, 
              {7, 11, 9}};

// 行列全体をエキスパートログに出力して確認します。
Print("初期状態の行列: ", mat);

// 行列内の最大値を持つ要素のフラットインデックスを取得します。
// ArgMax()は、最大値の位置(インデックス)を返す関数です。
ulong max_index = mat.ArgMax();
Print("最大値のインデックス: ", max_index);

// フラットインデックスを使って最大値の要素を取得します。
// Flat関数でインデックスmax_indexの値を取得します。
double max_value = mat.Flat(max_index);
Print("最大値: ", max_value);

// フラットインデックスを使って最大値を0に更新します。
// Flat関数の第2引数に新しい値(ここでは0)を指定して、該当の要素を変更します。
mat.Flat(max_index, 0);

// 更新後の行列をエキスパートログに出力します。
Print("最大値を0に更新後の行列: ", mat);

// 再び最大値のインデックスを取得します。
// 最大値の位置が変わっていることを確認するため、ArgMax()を再実行します。
max_index = mat.ArgMax();
Print("新しい最大値のインデックス: ", max_index);

// 新しい最大値を取得します。
max_value = mat.Flat(max_index);
Print("新しい最大値: ", max_value);

サンプルコードの解説

行列の初期化

matrix mat = {{10, 3, 2}, 
              {1, 8, 12}, 
              {6, 5, 4}, 
              {7, 11, 9}};

この部分では、matrix型の変数 mat を宣言し、4行3列の行列を初期化しています。行列は2次元配列のように扱われ、各行の要素{} で囲みます。

行列の内容を出力

Print("初期状態の行列: ", mat);

Print関数は、指定したデータをエキスパートログに出力します。ここでは、初期化した行列の内容を確認するために mat を出力しています。

ArgMax関数で最大値の位置を取得

ulong max_index = mat.ArgMax();
Print("最大値のインデックス: ", max_index);

ArgMax関数は、行列内で最大値を持つ要素フラットインデックスを返します。ここで得られる max_index は、その最大値が行列内でどの位置にあるかを示します。

変数max_index は ulong型で宣言されています。これは符号なし整数型で、大きな値を扱う際に使用します。

Flat関数で最大値を取得

double max_value = mat.Flat(max_index);
Print("最大値: ", max_value);

Flat関数を使って、インデックスmax_index の要素を取得しています。このとき、戻り値double型の値として得られます。取得した値を確認するためにエキスパートログに出力しています。

Flat関数で要素を更新

mat.Flat(max_index, 0);

Flat関数の第2引数0 を指定することで、インデックスmax_index に対応する行列要素0 に更新しています。Flat関数を使用することで、行と列を意識せずに行列要素を直接操作できます。

更新後の行列を出力

Print("最大値を0に更新後の行列: ", mat);

更新後の行列をエキスパートログに出力し、最大値の要素0 に変更されたことを確認します。

新しい最大値を取得

max_index = mat.ArgMax();
Print("新しい最大値のインデックス: ", max_index);

max_value = mat.Flat(max_index);
Print("新しい最大値: ", max_value);

最大値の要素0 に更新した後、新しい最大値を取得しています。再びArgMax関数Flat関数を使用して、新しい最大値のインデックスと値を確認します。

基本的な文法事項の解説

  1. matrix
    行列を扱うためのデータ型です。行列の各要素double型として格納されます。
  2. Print関数
    メッセージや変数の値をエキスパートログに出力する関数です。コードの動作を確認する際に便利です。
  3. メソッド呼び出し
    mat という行列変数に対して ArgMaxFlat メソッドを呼び出しています。ドットでオブジェクトに属するメソッドを指定します。
  4. ulong型
    符号なし整数型です。ArgMax メソッドが返すフラットインデックスを格納するために使用しています。
  5. 変数の型と初期化
    すべての変数は使用する前に型を宣言し、必要に応じて初期化しています。たとえば、double型変数を作成して値を格納する形です。

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

1. 複数通貨ペアの中で最もボラティリティが高い通貨ペアを選ぶ

取引する通貨ペアを選択する際、複数の通貨ペアのボラティリティ(値動きの大きさ)を計算し、ArgMax関数を使って最もボラティリティの高い通貨ペアを特定します。選ばれた通貨ペアでのみ取引を行うEAを作成します。

ロジック概要

  • 通貨ペアごとに一定期間の高値と安値の差を計算します。
  • ArgMax関数を使用して、最大の値動きを持つ通貨ペアのインデックスを取得します。
  • 特定した通貨ペアで売買シグナルを基に取引を実行します。

2. インジケータの複数のラインから最強のトレンドラインを抽出

MACDボリンジャーバンドなどのインジケータには複数のラインが存在します。そのラインの中で、最も強いトレンド(最大値や最急な変化)を示すラインを特定し、その結果を基に取引シグナルを生成するEAを開発します。

ロジック概要


3. 一定期間の高値や安値を基にエントリータイミングを決定

ArgMax関数を使用して、一定期間の価格データ(高値や安値)を分析し、エントリーやエグジットポイントを特定するEAを作成します。例えば、トレンドのピークやボトムをトリガーに逆張り戦略を実行します。

ロジック概要

  • 価格データ(高値または安値)をベクトルとして取得します。
  • ArgMax関数で最大値または最小値の位置を特定します。
  • 特定の位置が現在価格とどの程度離れているかを判断し、エントリー条件を満たした場合に注文を発注します。

4. 過去のニュースイベントの影響を分析して取引戦略を構築

過去のニュースイベント時のボラティリティを分析し、最大の価格変動が発生したポイントをArgMax関数で特定します。この情報を活用して、次回のニュースイベントに備えたEAを構築できます。

ロジック概要

  • 各ニュースイベントごとの価格変動幅を計算し、行列に格納します。
  • ArgMax関数を使用して最大の変動幅を持つイベントを特定します。
  • イベントの特徴を分析し、同様の状況での自動取引ロジックを設定します。

ArgMax関数を使用することで、大量のデータの中から効率よく最大値やその位置を特定し、柔軟なEAロジックを実現できます。具体的なデータセットや取引戦略に応じて、上記のアイディアをさらにカスタマイズすることが可能です。

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