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

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

MQL5のfmod関数は、「浮動小数点数(double型)の割り算における余り(剰余)」を求めるための関数です。

C言語や他のプログラミング言語でお馴染みの「%」演算子は、MQL5では整数型(intやlong)にしか使えません。FXの価格やインジケーターの値は基本的に小数点を含む「double型」であるため、「現在の価格が特定のキリ数(100pipsごとなど)からどれだけ離れているか」を計算したい場合には、このfmod関数が必須となります。

実務での活用シーン

実務開発において、fmodは以下のようなロジックで頻繁に利用されます。

  • グリッドトレード(トラリピ系): 一定の間隔(例:20pipsごと)に注文を並べる際、現在の価格がステップの節目に位置しているかを判定する。
  • 等間隔のログ出力: 100ポイント動くごとに情報をログに記録する。
  • カスタムインジケーターの描画: 時間軸や価格軸で一定周期ごとに目盛りを表示させる。

初心者の方は「価格を一定数で割って、余りが0なら処理する」というロジックを組みがちですが、浮動小数点特有の計算誤差により、単純な比較では期待通りに動かないことがあります。このあたりの「実務上のつまずきポイント」についても後述します。


2. 構文と戻り値

fmod関数の定義は以下の通りです。

double fmod(
   double  numerator,    // 被除数(割られる数)
   double  denominator   // 除数(割る数)
);

パラメーター

  • numerator: 割られる数値(例:現在の Bid 価格)。
  • denominator: 割る数値(例:グリッドの間隔 0.01 など)。

戻り値

  • numerator / denominator を計算した際の「余り」を double 型で返します。
  • もし denominator(割る数)が 0 の場合は、数学的エラーとなり、戻り値は不定(NaN: Not a Number)を返します。

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

以下は、現在の価格が「500ポイント(50pips)」ごとの節目に近いかどうかを判定し、節目に到達した時だけログを出力する実用的なスクリプト例です。

void OnTick()
{
    // 現在のBid価格を取得
    double bid = SymbolInfoDouble(_Symbol, SYMBOL_BID);

    // 判定基準となる間隔(例:500ポイント = 0.050 / 50pips相当)
    double step = 500 * _Point;

    // fmod関数で余りを算出
    double remainder = fmod(bid, step);

    // 【重要】浮動小数点の比較は、単純な「== 0」ではなく
    // 非常に小さい値(閾値)より小さいかどうかで判定するのがプロの定石
    double threshold = 10 * _Point; // 節目から10ポイント以内なら「節目」とみなす

    if(remainder < threshold || remainder > (step - threshold))
    {
        PrintFormat("節目に到達しました。現在のBid: %.5f, 余り: %.5f", bid, remainder);

        // ここにエントリー注文やアラートなどのロジックを記述
    }
}

このコードでは、fmodの結果が「ほぼ0」または「ほぼステップ値(1つ前の節目の余り)」であるかをチェックしています。これにより、価格が節目をまたいだ瞬間を正確に捉えることが可能になります。


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

(1) ゼロ除算の回避

fmodの第2引数(denominator)に 0 が入ると、EAは正常に動作しなくなります。外部パラメータ(input変数)で間隔を指定できるようにする場合は、必ず事前に 0 でないかチェックするバリデーションを入れましょう。

(2) 負の数の扱い

numerator(割られる数)が負の場合、戻り値も負または 0 になります。FXの価格は正の値ですが、損益計算(Profit)やインジケーターのバッファ値に対して fmod を使う場合は、結果がマイナスになる可能性があることを考慮してください。

(3) 浮動小数点計算の誤差

コンピュータは小数をバイナリで扱うため、0.1 などの単純な数字でも内部的には微小な誤差を含んでいます。そのため、fmod(0.3, 0.1) の結果が厳密に 0.0 になるとは限りません。
比較の際は、必ず FLT_EPSILON や、上記のサンプルコードのように threshold(しきい値)を設けて判定するようにしてください。


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

アルゴリズムトレードにおいて、fmodを用いたロジックが完璧であっても、それを実行する「環境」が貧弱であれば、その戦略は破綻します。多くの個人開発者が陥る罠は、自宅のPCや一般的な光回線でEAを運用しようとすることです。

為替市場はマイクロ秒単位で価格が変動しています。自宅PCから海外にある取引サーバー(メタクオーツ社のサーバーや各証券会社のインフラ)へ注文を出す場合、物理的な距離によるネットワーク遅延(レイテンシ)は避けられません。この数ミリ秒〜数百ミリ秒の遅延が、スリッページを引き起こし、本来得られるはずだった利益を削り取ります。プロのクオンツや専業トレーダーにとって、取引サーバーの至近距離に位置する専用のVPS(仮想専用サーバー)を利用することは、ロジックを組むことと同等、あるいはそれ以上に重要な「勝つための絶対条件」です。極限まで約定スピードを高め、インフラ面での不利を排除しない限り、シストレでの長期的な生存は極めて困難と言わざるを得ません。

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

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

コメント

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