[MQL] double型の値を任意の桁で切捨て・切上げ・四捨五入する関数

MQL4で数値を任意の桁で切り上げ・切り捨て・四捨五入する処理を関数化にしたものです。価格等の値を処理する時に使うのでメモ書き。

コピペでそのまま使えます。

1.任意の桁で切り捨て

MQL4には任意の桁で切り捨てする関数が無いため、自分で関数を書く必要があります。下記は数値を任意の桁で切り捨てる処理を関数にしたものです。

処理したい値を引数valに入れると引数digit未満の桁をカットした値を返します。

引数digitが正の数か負の数かでカットする位置が異なります。

  • 引数digitが正の数の場合:少数点以下の桁数
  • 引数digitが負の数の場合:整数部分の桁数

//+------------------------------------------------------------------+
//| Function: round down                                             |
//+------------------------------------------------------------------+
double RoundDown(double val, int digit)
{
   return ((double)(int)(val * MathPow(10, digit))) / MathPow(10, digit);

   /*
   上記式は、以下の手順を1行に集約したもの
   double rev1  = val * MathPow(10, digit);  // valに10のdigit乗を掛けて小数点位置をずらす
   int    rev2  = (int)rev1;                 // 整数に型変換することで小数点以下をカット
   double rev3  = (double)rev2;              // データ型をdoubleに戻す
   double rev4  = rev3 / MathPow(10, digit); // 10のdigit乗で割って小数点位置を元に戻す
   return rev4;
   */

}

処理は最初の1行のみです。処理内容を分解したものをその後のコメントで記しています。

ポイントは10のdigit乗を掛けて値を整数化するところです。整数に型変換することで不要な桁が強制的にカットされます。

2.任意の桁で切り上げ

MQL4には任意の桁で切り上げする関数が無いため、自分で関数を書く必要があります。下記は数値を任意の桁で切り上げる処理を関数にしたものです。

処理したい値を引数valに入れると引数digitの「一つ下の桁」の値で切り上げ処理します。

引数digitが正の数か負の数か「一つ下の桁」の意味が異なります。

  • 引数digitが正の数の場合:少数点以下の桁数
  • 引数digitが負の数の場合:整数部分の桁数

//+------------------------------------------------------------------+
//| Function: round up                                               |
//+------------------------------------------------------------------+
double RoundUp(double val, int digit)
{
   double adjust = (val >= 0)? 0.9 : -0.9;
   return ((double)(int)(val * MathPow(10, digit) + adjust)) / MathPow(10, digit);

   /*
   上記式は、以下の手順を2行に集約したもの
   double adjust = (val >= 0)? 0.9 : -0.9;   // valが0以上の場合はajust=0.9、そうでなければadjust=-0.9
   double rev1  = val * MathPow(10, digit);  // valに10のdigit乗を掛けて小数点位置をずらす
   double rev2  = rev1 + adjust;             // adjustの値を足す
   int    rev3  = (int)rev2;                 // 整数に型変換することで小数点以下をカット
   double rev4  = (double)rev3;              // doubleに戻す
   double rev5  = rev4 / MathPow(10, digit); // 10のdigit乗で割って小数点位置を元に戻す
   return rev5;
   */
}

処理は最初の2行のみです。処理内容を分解したものをその後のコメントで記しています。

ポイントはajustの値(0.9または-0.9)を足すところです。この処理で切り上げ処理を実現します。

3.任意の桁で四捨五入

標準の関数NormalizeDouble()で任意の桁で四捨五入できます。自分でコードを書く必要はありません。

まとめ

任意の桁で切り捨て・切り上げ・四捨五入する方法を説明しました。

使用する値の桁数を正確に管理しておくと、インジケーターやEAでエラーやおかしな挙動をした場合に、原因の特定が多少は楽になります。

コメント

この記事へのコメント(0 件)