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

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

MQL5におけるMathLog関数(およびそのエイリアスであるlog関数)は、数学上の自然対数(底が e ≒ 2.718)を計算するための関数です。

「なぜFXの自動売買で対数が必要なのか?」と疑問に思うかもしれませんが、プロのクオンツやアルゴリズムトレーダーにとって、価格データをそのまま扱うよりも「対数」に変換して扱う方が圧倒的にメリットが多いのです。

実務での主な活用法:
1. 対数収益率(Log Return)の算出: 通常の騰落率((終値-始値)/始値)ではなく、対数収益率を用いることで、複利計算や統計的な処理(正規分布への近似など)が容易になります。
2. ボラティリティの正規化: 価格が100円の時の1円の動きと、150円の時の1円の動きは意味が異なります。対数を使うことで、価格帯に依存しない一貫したボラティリティ分析が可能になります。
3. ケリー基準などの資金管理: 資金の幾何学的な成長を最大化する計算において、対数は必須の知識です。

初心者のうちは「難しそうな数学」と敬遠しがちですが、価格を「率」として正しく捉えるEAを作りたいなら、避けては通れない関数と言えます。

2. 構文と戻り値

MQL5で対数を計算する際の標準的な書き方は以下の通りです。

double MathLog(
   double  value      // 入力値
);
  • パラメーター: value(計算対象となる数値)。
  • 戻り値: 自然対数の計算結果を double 型で返します。
  • 別名: log() と記述しても全く同じ動作をします(C++などの他言語からの移行者に配慮されています)。

注意点として、MathLog は「自然対数」です。もし「常用対数(底が10)」を計算したい場合は MathLog10 を使用する必要があります。

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

実務で最も頻繁に使用される「対数収益率」を計算するサンプルコードを紹介します。前日比の変動を「%」ではなく「対数収益率」で取得するロジックです。

//+------------------------------------------------------------------+
//| 2つの価格から対数収益率を算出するサンプル                                   |
//+------------------------------------------------------------------+
void OnStart()
{
   // 現在の価格と1本前のバーの終値を取得
   double currentPrice = Close[0];
   double previousPrice = Close[1];

   // 対数収益率の計算式: ln(現在の価格 / 過去の価格)
   // 数学的な性質により、log(A) - log(B) と書いても同じです
   double logReturn = MathLog(currentPrice / previousPrice);

   // 結果を出力(分かりやすくするために100倍して表示)
   PrintFormat("現在の価格: %.5f, 前回の価格: %.5f", currentPrice, previousPrice);
   PrintFormat("対数収益率: %.6f", logReturn);

   // 実務的な応用例:対数ボラティリティの算出など
   // 価格の急激な変化をパーセントよりも数学的に正しく捉えることができます
}

//+------------------------------------------------------------------+
//| 応用:指定した価格が0以下にならないようチェックする関数                         |
//+------------------------------------------------------------------+
double SafeLog(double value)
{
   // log関数の引数は必ず正の数である必要があるため、エラーを回避する
   if(value <= 0)
   {
      Print("エラー: log関数の引数が0以下です。");
      return(0);
   }
   return(MathLog(value));
}

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

MathLog 関数を使用する際、初心者が最もハマりやすい罠が2つあります。

  1. 引数に「0以下」を渡すとエラー(NaN)になる
    数学の定義上、対数の引数は必ずプラスでなければなりません。価格データ(Closeなど)は基本的にプラスですが、インジケーターの差分や計算途中の変数などを渡す際、誤って 0マイナスの値 を渡すと、戻り値は non-numeric (NaN) になります。これが原因でEAの計算が止まったり、予期せぬ挙動をすることが多いため、必ず事前に「値が正であるか」をチェック(バリデーション)する癖をつけましょう。

  2. 自然対数(e)と常用対数(10)の混同
    MathLog は底が e です。もし特定の投資理論や計算式で「10を底とする対数」が指定されている場合は、MathLog10 を使わないと計算結果が全く異なってしまいます。

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

どれほど高度な対数計算を用いて精密なアルゴリズムを組み上げたとしても、それを実行する「環境」が貧弱であれば、すべては水の泡となります。特に日本の一般的な家庭用インターネット回線から海外のFXサーバーへ接続する場合、数百ミリ秒(ms)単位の物理的な遅延(レイテンシ)が発生します。この遅延は、ボラティリティが高まった局面で数ピップスもの「スリッページ」を引き起こし、理論上の利益を瞬時に食いつぶします。

プロのエンジニアが開発する自動売買において、自宅PCでの稼働は論外と言わざるを得ません。取引サーバーに物理的に近いデータセンターに設置された「専用VPS」を利用することは、もはやオプションではなく必須条件です。ネットワーク遅延を極限まで排除し、コンマ秒の約定スピードを確保することこそが、クオンツ的なロジックを利益に変えるための最後の、そして最も重要なピースとなります。

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

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

コメント

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