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

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

MQL5のround関数は、与えられた浮動小数点数(double型など)を「もっとも近い整数」に丸めるための関数です。

FXのシステムトレード開発において、数値計算は日常茶飯事ですが、コンピュータが扱う浮動小数点数は、内部的に「1.0」を「0.999999999999」のように保持していることがあり、これが計算誤差の原因となります。

実務で特につまずきやすいのは、「ロット数の計算」や「特定のステップ(刻み幅)への丸め」です。例えば、資金管理ロジックで算出された「0.1234枚」というロット数を、証券会社が許可する「0.12枚」に丸める際などに、このround関数を基礎としたロジックが不可欠となります。単に小数点以下を切り捨てるのではなく、数学的に正しい四捨五入に近い処理を行いたい場合に活用します。

2. 構文と戻り値

round関数の構文は非常にシンプルです。

double round(
   double  value      // 丸め対象の数値
);
  • パラメーター: value … 丸めたい対象となる数値(double型)を指定します。
  • 戻り値: 入力値に最も近い整数をdouble型で返します。

※注意:この関数は「小数点第n位で丸める」という機能は持っておらず、あくまで整数化する関数である点に注意してください。特定の桁数で丸めたい場合は、後述する工夫が必要になります。

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

MQL5での実用的な例として、「計算されたロット数を、証券会社の最小ステップ(例:0.01刻み)に合わせて丸める」コードを紹介します。

//+------------------------------------------------------------------+
//| ロット数を指定されたステップ単位で丸める関数                    |
//+------------------------------------------------------------------+
double RoundLotSize(double lot)
{
   // 証券会社の最小ロットステップを取得(例:0.01)
   double lotStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);

   if(lotStep <= 0) return lot;

   // 1. ロット数をステップで割り、何ステップ分あるかを算出
   // 2. round関数で最も近い整数(ステップ数)にする
   // 3. 再びステップを掛けて元の単位に戻す
   double roundedLot = round(lot / lotStep) * lotStep;

   return roundedLot;
}

//+------------------------------------------------------------------+
//| スクリプトの開始関数                                             |
//+------------------------------------------------------------------+
void OnStart()
{
   double rawLot = 0.1265; // 計算で算出された複雑なロット数
   double finalLot = RoundLotSize(rawLot);

   Print("元の値: ", rawLot);    // 0.1265
   Print("丸め後: ", finalLot);  // ステップが0.01なら 0.13 になる
}

このコードでは、round関数を単体で使うのではなく、「割って、丸めて、掛ける」という手順を踏むことで、任意の刻み幅に対応させています。これはEA開発において非常に頻出するテクニックです。

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

開発初心者が陥りやすいミスは、「価格(Price)の丸め」にroundをそのまま使ってしまうことです。

  1. 価格には不向き: roundは整数に丸めるため、150.555円をroundに渡すと「151.0」になってしまいます。価格を適切な桁数にしたい場合は、NormalizeDouble関数を使用するか、前述の「掛けて・丸めて・割る」ロジックで桁数を調整する必要があります。
  2. 型変換の意識: roundの戻り値はdouble型です。もし整数として扱いたい(int型に代入したい)場合は、明示的なキャスト(int)round(value)を行うのが安全です。
  3. 負の数の挙動: 正の数だけでなく負の数も丸めますが、ロジックによっては「切り捨て(floor)」や「切り上げ(ceil)」を使うべき場面もあります。数学的な四捨五入(0.5以上を切り上げ)を期待しすぎると、負の数で意図しない挙動になることがあるため、デバッグでの確認が必須です。

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

どれほど完璧なアルゴリズムをround関数や高度な数学モデルで構築したとしても、それを実行する「環境」が貧弱であれば、すべては水の泡となります。特に日本の一般的な家庭用インターネット回線から海外のFXサーバーへ接続する場合、物理的な距離によるネットワーク遅延(レイテンシ)は避けられません。この数ミリ秒から数百ミリ秒の遅延が、注文時の「スリッページ」を引き起こし、バックテストでは利益が出ていたロジックを実運用で破綻させる致命的な要因となります。

プロのクオンツエンジニアが自宅のPCでEAを24時間稼働させることはまずありません。約定スピードを極限まで高め、相場の急変時にも確実に注文を執行させるためには、取引サーバーに物理的に近いデータセンター内に設置された「専用のVPS(仮想専用サーバー)」が必須です。インフラへの投資を惜しむことは、アルゴリズムの精度を捨てることと同義であると理解してください。

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

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

コメント

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