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を使わないと、このロジックは再現できません。

コメント