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

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

iMomentumは、相場の「勢い(モメンタム)」を測定するためのテクニカル指標を呼び出すMQL5の組み込み関数です。現在の価格が一定期間前の価格と比較して、どの程度の速度で変化しているかを数値化します。

実務での活用法:
多くの開発者が陥るのが、単なる「買われすぎ・売られすぎ」の判断材料として使ってしまうことです。しかし、モメンタムの本質は「トレンドの加速度」にあります。
* トレンドの継続確認: 100ライン(基準線)より上でさらに上昇していれば、上昇トレンドに勢いが増していると判断します。
* 逆張りの予兆(ダイバージェンス): 価格は高値を更新しているのに、モメンタムが低下している場合は、トレンドの終焉が近いことを示唆します。

MQL4時代と異なり、MQL5では「ハンドル」を取得し、そのハンドル経由でデータをバッファから取得するという手順が必要になります。この「非同期的なデータの扱い」に慣れることが、MQL5エンジニアへの第一歩です。

2. 構文と戻り値

iMomentum関数は、計算を実行するのではなく、計算を行うための「指標ハンドル」を返します。

int  iMomentum(
   string              symbol,            // 通貨ペア名(NULLなら現在のペア)
   ENUM_TIMEFRAMES     period,            // 時間軸(0なら現在の時間軸)
   int                 mom_period,        // 平均化期間
   ENUM_APPLIED_PRICE  applied_price      // 適用価格(CLOSE, OPEN, etc.)
   );
  • 戻り値: 成功すれば指標のハンドル(整数値)を返し、失敗すれば INVALID_HANDLE を返します。
  • 注意: MQL5のMomentumは、一般的に (現在の価格 / n期間前の価格) * 100 で計算されるため、中心線は「100」となります。

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

以下は、iMomentumを使用して、100ラインを基準に簡単な売買シグナルを出すEAのテンプレートです。

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

// パラメーター設定
input int      InpMomPeriod = 14;          // モメンタムの期間
int            handle;                     // 指標ハンドルを格納する変数
double         momBuffer[];               // データを格納する動的配列

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   // iMomentumハンドルの作成
   handle = iMomentum(_Symbol, _Period, InpMomPeriod, PRICE_CLOSE);

   if(handle == INVALID_HANDLE)
   {
      Print("ハンドルの作成に失敗しました。");
      return(INIT_FAILED);
   }

   // 配列を時系列順(最新がインデックス0)に設定
   ArraySetAsSeries(momBuffer, true);

   return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   // 最新の2個分だけデータをコピー
   if(CopyBuffer(handle, 0, 0, 2, momBuffer) < 0)
   {
      Print("データの取得に失敗しました。");
      return;
   }

   // 1つ前のバー(index 1)と最新のバー(index 0)の値を取得
   double currentMom = momBuffer[0];
   double prevMom    = momBuffer[1];

   // ロジック例:100ラインを上抜けたら買い
   if(prevMom <= 100.0 && currentMom > 100.0)
   {
      Print("買いシグナル:モメンタムが100を上抜けました。 Value: ", currentMom);
      // ここにオーダー処理を記述
   }
   // ロジック例:100ラインを下抜けたら売り
   else if(prevMom >= 100.0 && currentMom < 100.0)
   {
      Print("売りシグナル:モメンタムが100を下抜けました。 Value: ", currentMom);
      // ここにオーダー処理を記述
   }
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
   // ハンドルの解放(メモリ節約のため)
   IndicatorRelease(handle);
}

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

  1. ハンドルの作成場所:
    iMomentum関数を OnTick の中で毎回呼び出さないでください。非常に動作が重くなり、PCのリソースを食いつぶします。必ず OnInit で一度だけ作成し、使い回すのがルールです。
  2. データの準備待ち:
    EAの起動直後は、指標の計算が終わっておらず、CopyBuffer がエラーになることがあります。実運用では、データが十分に取得できているかチェックする処理を入れるのが安全です。
  3. 100ラインの解釈:
    他のプラットフォーム(TradingView等)では中心線が「0」の場合もありますが、MT5の標準iMomentumは「100」が基準です。これを間違えると売買ロジックが全く機能しません。
  4. 配列の時系列設定:
    ArraySetAsSeries を忘れると、momBuffer[0] が「一番古いデータ」を指してしまい、最新の動きを追いかけることができません。

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

アルゴリズム取引において、ロジックの正しさと同じくらい重要なのが「実行環境の物理的な距離」です。自宅のPCでEAを稼働させる場合、インターネットプロバイダー経由の通信には大きな遅延(レイテンシ)が発生します。FXサーバーとの往復に数百ミリ秒を要する環境では、iMomentumが完璧なタイミングでシグナルを出しても、約定する頃には価格が滑り、期待した利益が消失する「スリッページ」が致命的な損失を招きます。

特に、モメンタムのような勢いを重視する戦略では、一瞬の遅れが命取りになります。機関投資家と同じ土俵で戦うには、ブローカーの取引サーバーに物理的に近いデータセンター内に設置された「専用VPS」の導入が不可欠です。ネットワーク遅延を1〜2ミリ秒単位まで極限まで抑えることで、初めてバックテストの結果に近いリアルなパフォーマンスを再現することが可能になります。システム構築の際は、コードを磨くのと同時に、通信インフラへの投資を惜しまないようにしてください。

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

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

コメント

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