【MQL5】MathMin関数について

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

MathMin関数の働き・役割

MathMin関数は、指定された2つの数値のうち、より小さい値を返すために使用されます。この関数は、価格やインジケータの値の比較において、最小値を求めたい場合に便利です。たとえば、指定したデータの範囲や限界値を確認し、その範囲内でのみ処理を行いたいときに、MathMin関数を用いることで効率的に最小値を取得できます。

MathMin関数の引数について

double MathMin(
   double value1,    // 1番目の値
   double value2     // 2番目の値
);

MathMin関数の書式は以下の通りです。

第1引数 value1

最初の数値です。この引数は、MathMin関数が比較する2つの数値のうち、1つ目の値を示します。この値と第2引数の値が比較され、より小さい方が戻り値として返されます。

第2引数 value2

2つ目の数値です。この引数に指定された値は、第1引数の値と比較され、より小さい値がMathMin関数戻り値となります。

MathMin関数はこの2つの引数の間で最小値を判定し、指定された2つの値のどちらが小さいかを求める役割を果たします。引数には整数型や浮動小数点型など、異なる型の値を指定することが可能で、ビットサイズの小さいデータ型は自動的に大きい方の型にキャストされます。同じ型のデータが引数として渡される場合には、キャストは行われません。

MathMin関数の戻り値について

MathMin関数戻り値は、指定された2つの引数のうち小さい方の値です。戻り値の型は、引数として渡された2つの値のうち、ビットサイズが大きいデータ型と同じになります。

たとえば、value1が整数型(int)、value2が浮動小数点型(double)の場合、戻り値は浮動小数点型として返されます。
MathMin関数に異なるデータ型の値が引数として渡される場合、ビットサイズの小さいデータ型が自動的にビットサイズの大きいデータ型キャストされるため、戻り値も自動的にビットサイズの大きい型と同じになります。

このようにして、MathMin関数は異なる型を持つ引数の最小値を適切な型で返すします。

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

//--- 入力パラメータを定義
input uint InpBars = 100000; // ユーザーが希望するバー数(初期値は100000)

//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                      |
//+------------------------------------------------------------------+
void OnStart()
{
  //--- サーバー上で利用可能なバーの数を取得する
  // Bars関数は、指定されたシンボルと時間枠のデータが存在するバーの総数を返します
  uint bars_total = Bars(Symbol(), Period());
  
  //--- バーのデータが取得できない場合(バーの数が0の場合)は、エラーメッセージを表示して終了
  if (bars_total == 0)
  {
    // PrintFormat関数を使用して、シンボルと時間枠のデータがまだ生成されていない旨を出力
    PrintFormat("タイムシリーズ %s %s のデータがまだターミナルに生成されていません。後でもう一度お試しください。", Symbol(), StringSubstr(EnumToString(Period()), 7));
    return; // 処理を終了して戻ります
  }

  //--- 利用可能なバー数とユーザーが希望するバー数のうち、最小のバー数を取得する
  // MathMin関数を使って、bars_totalとInpBarsのどちらか小さい値を選びます
  int bars = (int)MathMin(bars_total, InpBars);

  //--- サーバーで利用可能なバーの数が要求されたバー数より少ない場合、警告メッセージを表示
  if (bars_total < InpBars)
    // PrintFormat関数を使用して、サーバー上のバー数が要求数より少ないことを報告します
    PrintFormat("サーバー上のバー数 (%u) は要求されたバー数 (%u) より少ないです", bars_total, InpBars);

  //--- 作業可能なバーの数を操作ログに表示する
  // 実際に取得できたバー数(最小値)をエキスパートログに出力します
  Print("作業に利用可能なバー数: ", bars);
}

このコードは、指定されたシンボルと時間枠において、サーバー上で利用可能なバーの数を取得し、その数とユーザーが希望するバー数のうち小さい方の値を選びます。もしサーバー上のバー数が希望する数より少ない場合は、その旨をエキスパートログに表示します。最後に、実際に使用可能なバーの数をログに出力します。

サンプルコード解説

このコードでは、サーバー上に存在するバー(価格データ)の数を取得し、ユーザーが指定した希望バー数と比較して、より小さい方を選択し、作業に利用可能なバー数をログに出力します。また、サーバー上のバーが希望数に満たない場合には警告メッセージをエキスパートログに表示します。以下に各部分について詳しく解説します。

入力パラメータ

  • InpBars
    入力パラメータとして「InpBars」を定義しており、初期値は100000です。この値はユーザーが希望するバーの数を表し、後にサーバー上で利用可能なバーの数と比較されます。MQL5では「input」キーワードを使用して、外部から変更可能なパラメータを指定します。

OnStart関数

OnStart関数は、スクリプトが開始されたときに呼び出されるメインの関数です。この関数内で、バー数の取得と比較が行われます。

サーバー上で利用可能なバーの数を取得

  • Bars関数
    Bars関数は、指定されたシンボルと時間枠(タイムフレーム)で利用可能なバーの総数を返します。この例では、Bars関数の第1引数Symbol関数、第2引数Period関数が渡されています。
  • Symbol関数
    Symbol関数は現在のチャートのシンボル(通貨ペアなど)を取得します。このシンボル名は「EURUSD」などの通貨ペアや、その他の銘柄の識別子です。
  • Period関数
    Period関数は、現在のチャートの時間枠(例:1分足や1時間足)を取得します。これにより、取得するバーの対象が決定されます。

エラーメッセージの表示

  • bars_total変数
    bars_totalは、サーバー上で利用可能なバーの総数を保持する変数です。もし、Bars関数が0を返した場合、つまりバーが存在しない場合には、エラーメッセージを表示して処理を終了します。
  • PrintFormat関数
    PrintFormat関数は、指定した形式で文字列を出力するための関数です。この関数内では、シンボル名と時間枠を含むメッセージを出力しています。
  • StringSubstr関数
    EnumToString関数を使って時間枠の名前を取得し、StringSubstr関数で先頭から7文字を省略して表示しています。この操作により、時間枠名を短縮表示します。

利用可能なバー数の選択と最小値の取得

バー数不足の警告メッセージ

サーバー上で利用可能なバー数がユーザーの希望数に満たない場合には、再度PrintFormat関数で警告メッセージを出力します。PrintFormat関数では、次のフォーマット指定子を使用しています。

作業に利用可能なバー数の表示

最後に、作業に利用可能なバー数「bars」をPrint関数でエキスパートログに出力します。このPrint関数は、与えられた値をエキスパートログに表示するために使用されます。

このコード全体を通して、サーバー上で利用可能なバー数とユーザーの希望するバー数を比較し、最小値を基に処理を行う流れが構築されています。

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

MathMin関数を活用すると、価格データや指標の値などを比較し、最小値を取得する処理をEAエキスパートアドバイザー)で効率的に行えます。以下に、MathMin関数を使用したEA作成のアイディアを紹介します。

価格データを使った動的なトレードサイズの設定

MathMin関数を用いて、ユーザーが指定した最大ロット数と現在の口座残高に基づく適切なロット数のうち、小さい方をトレードサイズとして設定することができます。これにより、リスク管理を行いつつ、動的に取引サイズを調整するEAを作成できます。

利益確定と損失回避のための柔軟なストップロス・テイクプロフィット設定

MathMin関数を使って、現在のATR(平均的な値動き幅)やユーザーが指定した値幅のうち、より小さい方をストップロスとして設定し、テイクプロフィットも同様に設定することで、価格変動に応じた柔軟な利益確定や損失回避の設定が可能になります。これにより、変動の大きさに応じてリスク管理を強化したEAを実現できます。

保有ポジション数に応じた新規エントリー制限

現在保有しているポジション数と最大ポジション数のうち小さい方をMathMin関数で選び、これをもとに新規エントリーの制限を行うことで、エントリー数の上限を超えないようなトレードルールを実装できます。これにより、保有ポジション数に基づくエントリー制御が可能になります。

ボラティリティに基づくトレード頻度の調整

MathMin関数を利用して、一定期間のボラティリティとユーザー指定の最大値を比較し、小さい方の値を基準にトレード頻度を決定するEAを構築できます。これにより、価格変動の少ないときにはトレードを抑え、変動が大きいときには積極的にトレードを行う柔軟な戦略が実現します。

利用可能な履歴データに基づいたバックテスト範囲の自動調整

ユーザーが希望するバー数と、サーバー上で利用可能なバー数のうち小さい方をMathMin関数で選択し、EAバックテスト範囲として設定することで、実際のデータ量に合わせた効率的なバックテストが可能になります。これにより、データ不足によるエラーを回避しながら、最適なバックテストが実行できます。

これらのアイディアにより、MathMin関数を使った効率的なデータ処理やリスク管理が可能となり、より柔軟で安定したEAを構築することができます。

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