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

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

MQL5のMathExp関数は、数学における「指数関数」を計算するための関数です。具体的には、自然対数の底(ネイピア数 $e \approx 2.71828$)を底(ベース)とし、引数で指定した数値を指数とする累乗($e^x$)を返します。

実務レベルのシステムトレード開発において、この関数は単なる数学の計算以上に重要な役割を果たします。

  • 正規分布の計算: クオンツモデルで価格の乖離率やボラティリティを評価する際、正規分布の確率密度関数を求めるために必須となります。
  • 減衰モデル(デケイ): 時間の経過とともにインジケーターの影響力を弱める、あるいはストップロス幅を徐々に狭めるような「時間的減衰」の実装に多用されます。
  • オプション価格理論: ブラック・ショールズ方程式など、デリバティブの価格算出ロジックをEAに組み込む際に欠かせません。

初心者がつまずきやすいポイントは、「なぜ単純な乗算ではなく $e$ を使うのか」という点です。金融市場の価格変化は複利的な連続性を持つため、線形(直線的)な変化よりも、指数関数を用いた曲線的なモデルの方が相場実態に即した計算ができることが多いのです。

2. 構文と戻り値

MathExp関数の構文は非常にシンプルです。

double MathExp(
   double  value      // 指数
);
  • 引数 (value): 底 $e$ に掛けるべき指数を指定します。正の数、負の数、小数のいずれも可能です。
  • 戻り値: $e$ を value 乗した結果を double 型で返します。

※ 計算結果が double 型の最大値を超える(オーバーフロー)場合、非常に大きな値を返すか、環境によっては実行時エラーの原因となるため注意が必要です。

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

以下は、現在の価格が過去の移動平均からどれだけ乖離しているかを「正規分布」の考え方を用いてスコア化し、指数関数を用いて平滑化する実践的なコード例です。

//+------------------------------------------------------------------+
//| 指数関数を用いた正規分布(ガウス分布)の計算例                       |
//+------------------------------------------------------------------+
double CalculateGaussianWeight(double x, double sigma)
{
   // x は平均からの乖離量、sigma は標準偏差
   // ガウス関数の基本式: exp(-(x^2) / (2 * sigma^2))

   if(sigma == 0) return 0; // ゼロ除算回避

   double exponent = -MathPow(x, 2) / (2 * MathPow(sigma, 2));

   // MathExpを使用して指数計算を行う
   double weight = MathExp(exponent);

   return weight;
}

//+------------------------------------------------------------------+
//| EAのチック時処理(サンプル)                                        |
//+------------------------------------------------------------------+
void OnTick()
{
   double close = iClose(_Symbol, _Period, 0);
   double ma = iMA(_Symbol, _Period, 20, 0, MODE_SMA, PRICE_CLOSE);

   // 20期間の標準偏差を取得(簡易的なボラティリティ)
   double std_dev = 0;
   double sum = 0;
   for(int i=0; i<20; i++) {
      sum += MathPow(iClose(_Symbol, _Period, i) - ma, 2);
   }
   std_dev = MathSqrt(sum / 20);

   // 現在の乖離度を指数関数でウェイト付け
   double diff = close - ma;
   double score = CalculateGaussianWeight(diff, std_dev);

   // スコアが1に近いほど平均に近く、0に近いほど異常乖離(シグナル)
   Comment("現在の価格乖離スコア: ", DoubleToString(score, 5));
}

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

  1. 引数の巨大化によるオーバーフロー:
    MathExp(710) を超えるあたりで double 型の限界に達します。相場データから計算した値をそのまま引数に入れる場合、計算途中で値が暴走していないかチェックするロジックを入れてください。

  2. 負の無限大への接近:
    引数に大きな負の数(例: -700)を入れると、戻り値は限りなく 0 に近づきます。これはエラーではありませんが、その後の計算で「0での除算」を引き起こすリスクがあるため、戻り値が極小になっていないか確認が必要です。

  3. 計算負荷の考慮:
    MathExp は四則演算に比べて計算負荷が高い関数です。インジケーターの OnCalculate 内で数万回のループ処理を行う場合、計算済みの値を配列にキャッシュするなどの最適化を検討してください。

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

どれほど高度な数学モデルを MathExp で構築し、精緻なアルゴリズムを書き上げたとしても、それを実行する「環境」が脆弱であれば、すべての努力は無に帰します。FXの自動売買において、プログラムが売買判断を下してから証券会社のサーバーに注文が届くまでの「コンマ数秒の遅延(レイテンシ)」は、期待利得を削り取る最大の敵です。

特に自宅のPCや一般的な光回線での運用は、ネットワーク経路の不安定さやOSの更新による再起動リスクなど、アルゴリズムトレーダーにとって致命的な欠陥を抱えています。プロのクオンツエンジニアが極限まで約定スピードを追い求めるのは、ミリ秒単位の差がスリッページを引き起こし、バックテストの結果とリアルの運用成績を乖離させることを知っているからです。このリスクを排除し、24時間365日、証券会社に最も近い場所で最速の注文執行を実現するためには、トレーディング専用に最適化されたVPS(仮想専用サーバー)の導入が、もはや「選択肢」ではなく「必須条件」と言えるでしょう。

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

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

コメント

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