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

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

MQL5におけるfmax関数は、「2つの数値のうち、大きい方の値を返す」という非常にシンプルな関数です。プログラミングに慣れていない方は、「if文で比較すればいいのでは?」と思うかもしれませんが、実務コードにおいてfmaxを使いこなすことは、コードの可読性を高め、バグを防ぐために非常に重要です。

実務開発で特につまずきやすいのは、「計算結果が意図せずマイナスやゼロになってしまうケース」です。例えば、ストップロス(SL)の幅を計算する際、計算式によっては値が0以下になってしまい、注文エラー(Invalid stops)を引き起こすことがあります。

fmaxを活用すれば、fmax(計算したSL, 最小ストップレベル)のように記述することで、計算値がどれだけ小さくなっても最低限の数値を担保する「下限値の固定」がスマートに実装できます。複雑なif文の羅列を避け、1行でロジックを完結させられるのがこの関数の最大のメリットです。

2. 構文と戻り値

fmax関数の構文は以下の通りです。

double fmax(
   double  value1,     // 1つ目の値
   double  value2      // 2つ目の値
);
  • 引数(パラメーター): 比較したい2つのdouble型の数値を渡します。整数型(int)を渡すことも可能ですが、内部的にdouble型にキャスト(変換)されます。
  • 戻り値: 渡された2つの値のうち、大きい方の値をdouble型で返します。
  • 特殊な仕様: もし引数の一方が「NaN(非数値)」である場合、もう一方の数値が返されます。両方がNaNの場合は、NaNが返されます。

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

以下は、EA開発で頻出する「注文ロット数の計算」において、証券会社の最小ロットを下回らないように制御する実践的なコード例です。

//+------------------------------------------------------------------+
//| ロット数を計算し、最小ロットを下回らないように調整する関数              |
//+------------------------------------------------------------------+
double CalculateSafeLot(double plannedLot)
{
    // 証券会社の最小ロット制限を取得(例: 0.01ロット)
    double minLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);

    // fmaxを使用して、計算されたロットが最小ロットを下回らないようにする
    // plannedLotが0.005などの場合、minLot(0.01)が採用される
    double finalLot = fmax(plannedLot, minLot);

    // 証券会社の最大ロット制限も考慮する場合(参考: fmin)
    double maxLot = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MAX);
    finalLot = fmin(finalLot, maxLot);

    // ロットステップ(例: 0.01単位)に合わせて正規化
    double lotStep = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_STEP);
    finalLot = MathFloor(finalLot / lotStep) * lotStep;

    return finalLot;
}

// EAのエントリー処理での使用例
void OnTick()
{
    double myPlannedLot = 0.005; // 本来のロジックで算出された極小ロット
    double executionLot = CalculateSafeLot(myPlannedLot);

    Print("実行ロット: ", executionLot); // 結果: 0.01(最小ロットが担保される)
}

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

fmaxを使用する際に注意すべき点は、「型の不一致」と「精度の問題」です。

  1. 型の混在: fmax(int, double)のように異なる型を比較すると、戻り値は常にdoubleになります。もし最終的にint型の値が必要な場合は、(int)fmax(...)のように明示的な型変換が必要です。
  2. 価格の比較(浮動小数点数): FXの価格(145.123など)は浮動小数点数です。コンピュータの特性上、ごく稀に「1.1」が「1.1000000000000001」として扱われることがあります。厳密な比較が必要な場合は、NormalizeDouble関数で桁数を揃えてから比較するのがクオンツとしての定石です。
  3. MathMaxとの違い: MQL5にはMathMaxという関数も存在します。機能はほぼ同じですが、fmaxはC++標準ライブラリに準拠した数学関数であり、特に浮動小数点(double/float)の比較に適しています。基本的にはfmaxを使っておけば間違いありません。

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

アルゴリズムの論理構成がどれほど完璧であっても、それを実行するインフラに欠陥があれば、利益は一瞬で消失します。特に自宅のPCや一般的な汎用クラウドサーバーでEAを稼働させるのは、プロの視点からは極めて危険な行為です。家庭用インターネット回線は数ミリ秒から数百ミリ秒の「ゆらぎ(ジッター)」が発生し、この遅延が原因でスリッページが拡大し、バックテスト通りのパフォーマンスを発揮できなくなるからです。

FXの自動売買において、1ミリ秒の遅延は数ピップスの損失に直結します。極限まで約定スピードを高め、ブローカーのサーバーに対して最短経路で注文を届けるためには、トレーディング専用に最適化されたVPS(仮想専用サーバー)の利用が不可欠です。低レイテンシな環境を整えることは、手法を磨くこと以上に、トレードの期待値を底上げするための最優先事項といえます。

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

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

コメント

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