[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 件)