1. MathMod関数の概要と実務での活用法
MQL5のMathMod関数は、2つの数値で割り算を行った際の「余り(剰余)」を求めるための関数です。数学的には x = i * y + f(iは整数、fは余り)という式の f を算出します。
一見地味な関数ですが、FXのシステムトレード開発、特にEA(エキスパートアドバイザー)のロジック構築においては極めて重要な役割を果たします。実務では主に以下のようなシーンで活用されます。
- ロット数の正規化: 証券会社が規定する「ロットステップ(例:0.01刻み)」に、計算したロット数が適合しているか確認する。
- 一定間隔での処理: グリッドトレードやトラップリピート系のように、価格が「50ピップス動くごとに」エントリーするようなトリガー判定。
- 時間による制御: 特定の分(例:15分ごと)にロジックを走らせたい場合の条件分岐。
初心者がつまずきやすいポイントは、整数同士の計算(10 ÷ 3 = 余り1)だけでなく、小数点を含む計算(1.05 ÷ 0.1 = 余り0.05)でも多用される点です。特にMQL5では浮動小数点数の精度問題が絡むため、この関数の特性を正しく理解しておく必要があります。
2. 構文と戻り値
MathMod関数の構文は非常にシンプルです。
double MathMod(
double value, // 被除数(割られる数)
double value2 // 除数(割る数)
);
- value: 余りを求めたい元の数値。
- value2: 何で割るかを指定する数値。
- 戻り値:
valueをvalue2で割ったときの余りをdouble型で返します。
※もし value2 が 0 の場合、結果は未定義(多くの場合 0 や NaN)となるため、実戦コードでは 0 除算を避けるガード処理が必須です。
3. 具体的な使い方・実践サンプルコード
実務で最も頻出する「計算されたロット数を、証券会社の最小単位(ロットステップ)に合わせて調整する」例を紹介します。
//+------------------------------------------------------------------+
//| ロット数を証券会社の仕様(LotStep)に適合させる関数 |
//+------------------------------------------------------------------+
double NormalizeLotSize(double targetLot)
{
// 証券会社の最小ロット単位(例:0.01)を取得
double lotStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
// 計算されたロット数をステップで割った「余り」を算出
double remainder = MathMod(targetLot, lotStep);
// 余りがある場合、その分を差し引いて正規化する
// 例:0.125ロットを0.01刻みにしたい場合、0.125 % 0.01 = 0.005
// 0.125 - 0.005 = 0.12ロットとなる
double normalizedLot = targetLot - remainder;
// 最後に、浮動小数点の誤差を排除するため再度丸める
normalizedLot = NormalizeDouble(normalizedLot, 2);
return normalizedLot;
}
// EAのエントリー時などの使用イメージ
void OnTick()
{
double rawLot = 0.1285; // 複雑な計算の結果、導き出されたロット
double finalLot = NormalizeLotSize(rawLot);
Print("元のロット: ", rawLot, " -> 調整後: ", finalLot);
// 出力例: 元のロット: 0.1285 -> 調整後: 0.12
}
このコードでは、MathMod を使うことで「中途半端な端数」を特定し、それを差し引くことで証券会社が受け付ける正しい注文数量を算出しています。
4. 使用上の注意点とよくあるエラー
MathMod を扱う上で、エンジニアが最も警戒すべきは「浮動小数点数の精度誤差」です。
コンピュータ内部では、小数はバイナリ(2進数)で表現されています。そのため、人間にとっての 0.1 は、内部的には 0.10000000000000001 のような微小な誤差を含んでいます。
- 比較の罠:
MathMod(1.0, 0.1) == 0という比較は、内部誤差によってfalseになることがあります。余りが 0 かどうかを判定したい場合は、MathModの結果が「極めて小さい値(例:0.000001以下)かどうか」で判定するのがプロの定石です。 - 負の数の扱い:
value(割られる数)が負の場合、戻り値も負または 0 になります。時間計算などで負の数が混じる場合は、MathAbs()で絶対値を取ってから計算するなどの工夫が必要です。 - 0除算:
value2が 0 だとEAは即座に停止、あるいは予期せぬ挙動を示します。入力値が外部パラメータ(Input)の場合は必ずチェックを入れましょう。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、MathMod を駆使して完璧な計算ロジックを組み上げたとしても、それを実行する「環境」が貧弱であれば、その努力はすべて無に帰します。FXの価格はミリ秒単位で変動しており、EAが計算を終えて注文を出してから、証券会社のサーバーに届くまでの「ネットワーク遅延(レイテンシ)」が勝敗を分けるからです。
一般家庭のインターネット回線やPCでは、他のアプリケーションによる通信干渉やOSの更新、物理的な距離による遅延が避けられません。プロのクオンツや専業トレーダーにとって、証券会社のデータセンターに近い場所に位置する「専用VPS(仮想専用サーバー)」の利用は、もはやオプションではなく必須のインフラです。わずか数ミリ秒の遅延が、スリッページを増大させ、期待値をマイナスへと叩き落とします。極限まで研ぎ澄まされたロジックを活かすには、24時間安定稼働し、超低レイテンシを実現するトレード専用の実行環境を確保することが、真の「勝てるエンジニア」への第一歩となります。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント