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

コメント