【MQL5】MathRound関数の使い方と自動売買実装コード

1. MathRound関数の概要と実務での活用法

MQL5のMathRound関数は、指定した実数(double型など)を最も近い整数値に四捨五入するための関数です。

実務レベルの開発において、この関数は単に「端数を消す」以上の重要な役割を担います。例えば、インジケーターの計算値をシグナル判定に使う際や、統計的な計算結果を整数ベースのスコアに変換する場合などに多用されます。

しかし、シストレ開発者が最もつまずきやすいのが、「価格の小数点桁数(Digits)に合わせた丸め処理」にそのまま使おうとしてしまうことです。MathRoundはあくまで「整数(.0)」への四捨五入しか行いません。「145.123」を「145.12」にしたい場合に、単独でMathRound(145.123)としても「145.0」になるだけです。

プロのクオンツ現場では、この性質を理解した上で、カスタム関数と組み合わせて「最小ティック単位への丸め」や「ロットサイズの調整」に応用します。


2. 構文と戻り値

MathRound関数の基本仕様は以下の通りです。

double MathRound(
   double value      // 四捨五入する数値
);
  • 引数(value): 四捨五入の対象となる浮動小数点数。
  • 戻り値: 指定された数値に最も近い整数をdouble型で返します。
  • 仕様の詳細: 小数点以下が0.5以上の場合は切り上げ、0.5未満の場合は切り捨てられます。

※戻り値がintではなくdoubleである点に注意してください。整数として扱いたい場合は、必要に応じて(int)で型キャストを行います。


3. 具体的な使い方・実践サンプルコード

以下は、MathRoundを応用して「現在の価格を指定したPips単位で丸める」という、実際のEA開発でよく使われるロジックの例です。

//+------------------------------------------------------------------+
//| 任意の桁数で四捨五入を行う実戦的サンプル                           |
//+------------------------------------------------------------------+
void OnStart()
{
   double originalPrice = 145.678;

   // 1. 単純な四捨五入(整数化)
   double roundedInt = MathRound(originalPrice);
   Print("1. 単純な四捨五入: ", roundedInt); // 出力: 146.0

   // 2. 小数点第2位で四捨五入したい場合(応用テクニック)
   // 一旦100倍して四捨五入し、再度100で割る
   double digit2 = MathRound(originalPrice * 100) / 100;
   Print("2. 小数点第2位で丸め: ", digit2); // 出力: 145.68

   // 3. ロット計算での活用例
   // 計算したロット数が「0.1234」になった場合、取引所の仕様に合わせて0.01単位に丸める
   double rawLot = 0.1234;
   double step = 0.01;
   double executionLot = MathRound(rawLot / step) * step;
   Print("3. 執行ロット数の調整: ", executionLot); // 出力: 0.12
}

4. 使用上の注意点とよくあるエラー

① 浮動小数点数の精度問題

コンピュータの特性上、0.5が内部的に0.49999999...として保持されることがあります。この場合、MathRoundの結果が期待より小さくなる「浮動小数点誤差」が発生する可能性があります。厳密な計算が必要な場合は、微小値(_Pointの半分など)を足してから丸めるなどの工夫が必要です。

② NormalizeDoubleとの使い分け

FXの注文(利確・損切設定など)で価格を指定する場合は、MathRoundではなくNormalizeDoubleを使用するのがMQL5の鉄則です。MathRoundはあくまで数学的な「整数化」であり、証券会社のサーバーが受け付ける「価格の有効桁数」に合わせる処理とは目的が異なります。

③ 負の数の挙動

負の数に対して使用した場合、絶対値が0.5以上で切り上げられます。例えば MathRound(-1.5)-2.0 になります。この挙動が戦略に影響しないか確認してください。


5. 【重要】自動売買における約定スピードと環境の罠

アルゴリズム取引において、MathRoundなどで計算を緻密に行っても、それを執行する「環境」が貧弱であればすべてが無意味になります。自宅のPCや一般的な光回線を利用した自動売買は、プロの世界では「致命的な遅延(レイテンシ)」を抱えていると見なされます。インターネットの経路上のノイズや、物理的な距離による数ミリ秒の遅れが、本来得られるはずだった利益をスリッページ(価格の滑り)によって削り取ってしまうからです。

特にボラティリティが高い局面では、1ミリ秒の遅延が約定拒否や不利な価格での約定を招き、バックテストの結果とかけ離れた損失を生みます。極限まで約定スピードを高め、安定した24時間の稼働を実現するには、ブローカーのサーバーと同じデータセンター内、あるいは至近距離に設置された専用のVPS(仮想専用サーバー)の利用が不可欠です。インフラを最適化することは、優れたアルゴリズムを書くことと同等、あるいはそれ以上に重要な投資戦略の一部なのです。

💡 この記事の内容を実運用で活かすには?

この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント

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