【MQL5】MathFloor関数について

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

MathFloor関数の働き・役割

MathFloor関数は、指定された実数(小数点以下を持つ数値)の値を「下から最も近い整数」に丸め、その整数値を返します。たとえば、数値が3.7であれば3を、-2.3であれば-3を返します。このように、指定された値をその値以下の最大の整数に切り捨てます。

この関数は、小数点以下の値を切り捨てたい場合や、整数としての値を計算に使用したい場合に役立ちます。例えば、価格データのような実数データを整数として扱う際や、数量の計算において端数を切り捨てる処理で用いることができます。また、MathFloor関数の代わりに、floorと記述することも可能です。

MathFloor関数の引数について

double  MathFloor(
  double  val     // 数値
  );

MathFloor関数には、1つの引数があります。この引数として、丸め処理(数値の小数部分を特定の基準で切り捨てや切り上げする計算方法)を行いたい実数を指定します。

第一引数 val
対象の数値を指定します。valには実数(小数点以下を持つ数値)を与え、MathFloor関数はこの数値の小数点以下を切り捨てた値を返します。たとえば、valが5.9の場合には戻り値は5となり、-1.2の場合には-2が返されます。

MathFloor関数の戻り値について

MathFloor関数は、指定された実数のうち「その値以下の最大の整数」を返します。この戻り値の型はdoubleです。たとえば、5.8のような値を与えると5が返され、-2.3の場合には-3が返されます。

MathFloor関数は、整数部分を保持しつつ、小数点以下を切り捨てた値を返すため、正の数と負の数での動作に注意が必要です。負の値の場合は「その値以下の最大の整数」を返すため、-1.2のような値は-2になります。

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

#define VALUES_TOTAL 31  // ループ回数を定義(全体の数値増加のステップ数)

//+------------------------------------------------------------------+
//| スクリプトプログラム開始関数                                     |
//+------------------------------------------------------------------+
void OnStart()
{
    //--- 変換用の変数を宣言する
    double value = 0;            // MathFloor関数に使用する実数の初期値
    int floor_value = 0;         // MathFloorの結果を格納するための変数

    //--- 実数の小数増分の数によるループ
    for (int i = 0; i < VALUES_TOTAL; i++)
    {
        //--- 数値を増やす
        value += 0.1; // valueを0.1ずつ増加させる(小数の増分)

        //--- 下から最も近い整数値を取得する
        floor_value = (int)MathFloor(NormalizeDouble(value, 1)); // valueの小数点以下を1桁にし、下の整数値に切り捨てた結果をfloor_valueに格納

        //--- 操作ログに制御値を表示する
        // PrintFormatを用いて、valueとfloor_valueの両方の値をエキスパートログに表示
        PrintFormat("value: %.1f, floor value: %d", value, floor_value);

        /*
        結果:
        value: 0.1, floor value: 0   // 小数点以下を切り捨てるためfloor_valueは0
        value: 0.2, floor value: 0   // 小数部分を切り捨てた結果0が続く
        value: 0.3, floor value: 0
        value: 0.4, floor value: 0
        value: 0.5, floor value: 0
        value: 0.6, floor value: 0
        value: 0.7, floor value: 0
        value: 0.8, floor value: 0
        value: 0.9, floor value: 0
        value: 1.0, floor value: 1   // 1.0で初めて切り捨て値が1に更新される
        value: 1.1, floor value: 1   // 1.1から1.9までは1が続く
        value: 1.2, floor value: 1
        value: 1.3, floor value: 1
        value: 1.4, floor value: 1
        value: 1.5, floor value: 1
        value: 1.6, floor value: 1
        value: 1.7, floor value: 1
        value: 1.8, floor value: 1
        value: 1.9, floor value: 1
        value: 2.0, floor value: 2   // 2.0で切り捨て値が2に更新される
        value: 2.1, floor value: 2   // 2.1から2.9までは2が続く
        value: 2.2, floor value: 2
        value: 2.3, floor value: 2
        value: 2.4, floor value: 2
        value: 2.5, floor value: 2
        value: 2.6, floor value: 2
        value: 2.7, floor value: 2
        value: 2.8, floor value: 2
        value: 2.9, floor value: 2
        value: 3.0, floor value: 3   // 3.0で切り捨て値が3に更新される
        value: 3.1, floor value: 3   // 3.1では3が返される
        */
    }
}

このプログラムは、初期値を0とする実数valueを0.1ずつ増加させ、MathFloor関数でその値を切り捨てて整数値を取得し、valueと切り捨て結果をエキスパートログに表示します。valueが0から始まり、0.1ずつ増えていく中で、MathFloor関数は「その値以下の最大の整数」を返し、たとえばvalueが0.9までは0、1.0になると1、2.0になると2という具合に、整数値が更新される様子がログで確認できます。

サンプルコード解説

このコードは、MathFloor関数を用いて指定の数値の小数点以下を切り捨て、整数部分をエキスパートログに出力する処理を行っています。

まず、定数VALUES_TOTALに31が設定され、ループの反復回数を定義しています。このループによって、valueという変数が0から始まり、0.1ずつ増加していきます。

  1. 初期設定で、valueには0が設定され、floor_valueにはMathFloor関数の結果を受け取るための整数型変数として0が指定されています。
  2. 各ループで、まずvalueが0.1加算されます。この変数には実数が格納されているため、小数の増分操作が可能です。
  3. MathFloor関数を使ってvalueの値を「下から最も近い整数」に丸め、切り捨てた結果をfloor_valueに代入します。NormalizeDouble関数で小数点以下の桁数を1桁に丸めてからMathFloor関数に渡すことで、計算精度の問題で発生する誤差を防いでいます。
  4. 最後にPrintFormat関数を使って、現在のvalueとfloor_valueをエキスパートログに出力します。出力フォーマットは、小数点以下1桁まで表示したvalueと整数のfloor_valueで、各ループの増加に伴い、ログに切り捨て結果が表示されます。

出力例として、valueが0.1から始まって0.9までの間はfloor_valueは0のままですが、valueが1.0に達した時点でfloor_valueが1に更新され、以後、次の整数に近い値まで切り捨てが行われる挙動を示します。

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

  1. ロットサイズの管理
    資金管理において、計算したロットサイズを切り捨てて整数にすることで、取引量を調整できます。たとえば、リスク管理の一環として、証拠金残高に基づいたロットサイズ計算を行い、少数部分を切り捨てることで過剰な取引量を抑え、安定した取引を実現するEAを構築できます。
  2. 価格レベルの設定
    トレンドラインやサポート・レジスタンスラインなどの価格レベルを設定する際、値をMathFloor関数で切り捨て、指定のレベル以下の最も近い整数値で設定することが可能です。これにより、各価格ラインを基準値でそろえ、チャート上の視覚的な整理が行えます。
  3. 目標利確・損切りラインの最適化
    MathFloor関数で利確や損切りの目標値を切り捨てて設定することで、エントリー後の価格変動に対して目標ラインをわかりやすく設定できます。特に、最小取引単位に従って整数に切り捨てることで、損益ラインの誤差を防ぎ、リスクの精密な管理ができるEAを実現できます。
  4. 小数点以下を制限する計算
    複雑な計算処理やフィボナッチ・リトレースメントのライン設定などで得られる結果の小数部分を切り捨て、最も近い整数値で設定することにより、計算処理を簡略化し、EAの処理速度を向上させることができます。
タイトルとURLをコピーしました