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

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

MQL5のMathFloor関数は、指定した数値以下の最大の整数を返す、いわゆる「床関数(切り捨て)」です。数学的には、数直線上で左側にある最も近い整数を探す処理と言えます。

FXの自動売買(EA)開発において、この関数は単に小数点以下を消すためだけのものではありません。実務では主に「リスク管理に基づくロット計算」で頻繁に利用されます。

例えば、口座残高に対して「証拠金の1%で持てる最大ロット数」を計算した際、計算結果が 1.256 ロットになったとします。多くのブローカーでは小数点第3位以下の注文は受け付けられないため、これを 1.25 に切り捨てる必要があります。もしここで四捨五入(MathRound)をして 1.26 に繰り上げてしまうと、許容リスクを超過したり、証拠金不足で注文がリジェクトされるリスクが生じます。

「安全に、かつルールに則った数値に収める」ために、MathFloorはクオンツエンジニアにとって必須のツールとなります。

2. 構文と戻り値

MathFloor関数の基本的な仕様は以下の通りです。

double MathFloor(
   double  value      // 対象となる数値
);
  • 引数(value): 切り捨て処理を行いたい double 型の数値を指定します。
  • 戻り値: 指定した数値以下の最大の整数を double 型で返します。

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

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

以下は、EA開発で最も一般的かつ重要な「ステップ値に基づいたロットサイズの切り捨て計算」の実装例です。

//+------------------------------------------------------------------+
//| ロット数をブローカーの最小ステップ単位で切り捨てる関数            |
//+------------------------------------------------------------------+
double CalculateSafeLot(double rawLot)
{
   // シンボルの最小ロット単位を取得(例:0.01)
   double lotStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);

   // ステップ値が0の場合はエラー回避のためにそのまま返す
   if(lotStep <= 0) return 0;

   // 1. 計算されたロットをステップ値で割る(例:1.256 / 0.01 = 125.6)
   // 2. MathFloorで端数を切り捨てる(125.6 -> 125.0)
   // 3. 再びステップ値を掛けて戻す(125.0 * 0.01 = 1.25)
   double normalizedLot = MathFloor(rawLot / lotStep) * lotStep;

   // 最小ロット・最大ロットの制限も考慮
   double minLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
   double maxLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);

   if(normalizedLot < minLot) normalizedLot = 0; // 最小未満ならエントリーしない
   if(normalizedLot > maxLot) normalizedLot = maxLot;

   return normalizedLot;
}

// 使用例
void OnTick()
{
   double myStrategyLot = 1.25678; // 戦略上算出されたロット数
   double finalLot = CalculateSafeLot(myStrategyLot);

   Print("計算後ロット: ", finalLot); // 出力結果: 1.25
}

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

① 負の数の挙動に注意

MathFloorは「数値以下」の整数を返すため、負の数では直感と異なる動きをすることがあります。
MathFloor(1.8)1.0
MathFloor(-1.2)-2.0 (-1.0ではない)
負の値を扱う際に「0の方向へ向かって切り捨て」を行いたい場合は、MathFloorではなく MathTruncate を使用するのが正解です。

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

コンピュータ内部では 0.1 などの小数は近似値として扱われます。極稀に、計算結果が 1.0 になるはずが 0.999999999999 となり、MathFloor を通すと 0 になってしまうバグが発生します。これを防ぐには、MathFloor(value + 0.0000000001) のように微小な値を加算してから処理する「微調整(Epsilon)」が実務的なTipsです。

③ 型の混同

戻り値が double であるため、配列のインデックス(int)にそのまま代入しようとするとコンパイル警告が出ます。必ず明確にキャストする癖をつけましょう。

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

どれほど完璧なアルゴリズムを書き、MathFloorで精密なロット計算を行っても、実行環境が貧弱であればすべては無意味になります。自宅のPCや一般的な光回線でEAを稼働させることは、プロのレース場に市販車で乗り込むようなものです。インターネットの経路上の遅延(レイテンシ)や、家庭内LANの不安定さは、注文が証拠金サーバーに届くまでの間に価格を滑らせ(スリッページ)、バックテストとはかけ離れた損失を生み出します。

FXの自動売買で勝ち残るエンジニアにとって、専用のVPS(仮想専用サーバー)導入は「オプション」ではなく「必須インフラ」です。ブローカーのサーバーが設置されているデータセンター(ロンドンやニューヨークなど)に物理的に近いVPSを利用することで、ネットワーク遅延をマイクロ秒単位まで極限に抑え、約定スピードを劇的に向上させることが可能です。このわずかな差が、月間のトータル損益をプラスとマイナスの境界線で分ける決定打となります。

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

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

コメント

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