MQL4MQL5 数学
NormalizeDouble()
- できること
- 小数を指定した桁数に四捨五入する
- 対応
- MQL4・MQL5
NormalizeDouble() とは
小数を指定した桁数で四捨五入する関数です。注文の価格・損切り・利確は、銘柄の桁数(_Digits)に合わせて NormalizeDouble() で丸めてから渡すのが基本です。
NormalizeDouble() の書式と引数
double NormalizeDouble(double value, int digits)| 引数 | 型 | 省略時 | 説明 |
|---|---|---|---|
value | double | 必須 | 丸める値。 |
digits | int | 必須 | 小数点以下の桁数(0〜8)。価格なら _Digits。 |
戻り値
丸めた値。
NormalizeDouble() の使い方(コード例)
MQL4・MQL5 共通
double pip = (_Digits == 3 || _Digits == 5) ? _Point * 10 : _Point;
double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);
double sl = NormalizeDouble(bid - 15.5 * pip, _Digits); // 銘柄の桁数に丸める
Print("損切り価格:", DoubleToString(sl, _Digits));OnTick()・OnStart() などの関数の中に書いて使う例です。MetaEditor でコンパイルできることを確認済みです。
NormalizeDouble() の注意点
- 丸めても、double の内部表現の都合で Print() すると 1.23450000001 のように見えることがあります。表示用の文字列が欲しいときは DoubleToString() を使います。
- ロット数を丸めるときは、NormalizeDouble() だけでなく、刻み幅(SYMBOL_VOLUME_STEP)の倍数に切り捨てる処理も必要です。
NormalizeDouble() でよく出るエラー
NormalizeDouble() を使う逆引きレシピ
- 損切り・利確を pips で指定して注文したい1pips の大きさ(5桁・3桁口座は _Point × 10)を求め、損切り・利確の価格を計算して NormalizeDouble() で丸めます。
- 指値・逆指値注文を出したいMQL4 は OrderSend() の種類に OP_BUYLIMIT・OP_BUYSTOP など、MQL5 は CTrade の BuyLimit()・BuyStop() などを使います。
- トレーリングストップを入れたい現在値から一定の幅をとった位置に損切りを計算し、今の損切りより有利なときだけ OrderModify()・PositionModify() で動かします。
- ロット数を最小ロット・刻み幅に合わせたいSYMBOL_VOLUME_STEP(刻み幅)で切り捨て、SYMBOL_VOLUME_MIN・SYMBOL_VOLUME_MAX の範囲に収めます。












