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

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

MQL5のexp関数は、数学定数 $e$(ネイピア数:約2.71828)を底(ベース)として、指定した数値を指数とする累乗($e^x$)を計算する関数です。

実務レベルのシステムトレード開発において、この関数は単なる数学計算以上の役割を担います。主に以下の3つのシーンで多用されます。

  1. インジケーターの平滑化とシグモイド関数: オシレーターの値を0から1の範囲に収め、非線形な反応をモデル化する際に使用します(AI・機械学習を用いたEA開発で頻出)。
  2. ボラティリティの計算: オプション価格理論(ブラック・ショールズモデル)や、価格の対数変化率を元の価格スケールに戻す際に必須となります。
  3. 連続複利の計算: 資金管理(マネーマネジメント)において、複利効果を数学的に厳密にシミュレーションする場合に活用されます。

初心者の方がつまずきやすいポイントは、「なぜ単なる累乗(pow関数)ではなくexpを使うのか」という点です。金融工学の世界では、$e$ を底とした計算が標準であり、計算速度と精度の両面でexp関数が最適化されているため、自作するのではなく組み込み関数を使うのが鉄則です。

2. 構文と戻り値

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

double exp(
   double value    // 指数
);
  • パラメーター:
    • value: $e$ を何乗するかを指定する数値(double型)。正の数、負の数、0のいずれも指定可能です。
  • 戻り値:
    • $e$ の value 乗を返します。
    • 計算結果が大きすぎてオーバーフローした場合は INF(無限大)を返し、アンダーフローした場合は 0 を返します。

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

以下は、価格の乖離率をシグモイド関数(0.0〜1.0の範囲)に変換し、エントリーの「自信度」を数値化する実践的なサンプルです。

//+------------------------------------------------------------------+
//|                                              ExpSampleExpert.mq5 |
//+------------------------------------------------------------------+
#property strict

// シグモイド関数:入力を0.0〜1.0の範囲に変換する
// これにより、極端な価格変動を「1.0(最大)」に収束させることができる
double Sigmoid(double x)
{
   // 数式: 1 / (1 + exp(-x))
   return(1.0 / (1.0 + exp(-x)));
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   // 現在価格と20期間移動平均の乖離を取得
   double ma = iMA(_Symbol, _Period, 20, 0, MODE_SMA, PRICE_CLOSE);
   double array[1];
   CopyBuffer(ma, 0, 0, 1, array);

   double currentPrice = SymbolInfoDouble(_Symbol, SYMBOL_BID);
   double diff = currentPrice - array[0];

   // 乖離額をシグモイド関数に適用(感度調整のために係数0.5を掛ける)
   double confidence = Sigmoid(diff * 0.5);

   // ログ出力:自信度が0.8以上(強い上昇トレンド)ならメッセージを表示
   Print("Current Confidence: ", DoubleToString(confidence, 2));

   if(confidence > 0.8)
   {
      Print("強気シグナル:価格が平均から大きく上に乖離しています。");
   }
   else if(confidence < 0.2)
   {
      Print("弱気シグナル:価格が平均から大きく下に乖離しています。");
   }
}

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

exp関数を使用する際に最も注意すべきは、「引数の増大によるオーバーフロー」です。

  • 数値の爆発: exp(710) を超えるあたりで、double型の最大値を突破し、戻り値が inf になります。これを知らずに計算を続けると、EAが「Zero divide(ゼロ除算)」や「Invalid price」などのエラーで停止する原因になります。
  • 負の巨大数: 逆に exp(-710) などの非常に小さな負の数を渡すと、結果は限りなく 0 に近づきます。分母に exp を含む計算式の場合、ゼロ除算チェックを事前に行うのが安全です。
  • 精度の限界: exp は非常に精密な関数ですが、連続して複雑な計算を行うと、浮動小数点特有の誤差が蓄積します。価格の比較を行う際は NormalizeDouble や誤差許容範囲(Pointなど)を考慮してください。

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

アルゴリズムの計算精度にどれだけこだわっても、それを実行する「環境」が貧弱であれば、すべての努力は無に帰します。特に、自宅のPCや一般的な光回線でEAを稼働させている場合、ネットワークの遅延(レイテンシ)という致命的なリスクを抱えることになります。金融市場はミリ秒(1000分の1秒)単位で価格が変動しており、あなたのPCがシグナルを検知してからサーバーに注文が届くまでの間に価格が滑ってしまえば、ロジック通りの利益を出すことは不可能です。

プロのクオンツエンジニアが例外なく専用のVPS(仮想専用サーバー)を利用するのは、物理的な距離による遅延を極限まで排除するためです。証券会社のサーバーと同じデータセンター内、あるいは至近距離にあるVPSでEAを動かすことは、単なる「安定稼働」のためではなく、スリッページを抑えて期待値を守るための「必須の投資」です。約定スピードの差が年間収支で数百ピップスの差を生むことも珍しくありません。本気で勝てるシステムを構築したいのであれば、デスクトップ環境での運用は卒業し、低レイテンシが保証された自動売買専用VPSへ移行することを強く推奨します。

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

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

コメント

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