RSIやMACDは多くの記事で紹介されていますが、

Momentum(モメンタム)という指標は、

存在は知っていても使ったことがない人が多いかもしれません。

計算がシンプルな分、値動きの勢いの変化にすばやく反応する指標です。

この記事では、iMomentum()関数の使い方と、

基準線100の読み方、

100をクロスした瞬間だけを矢印で知らせるインジケーターの作り方を解説します。

この記事で分かること
・iMomentum()関数の書式と戻り値の読み方
・基準線100が持つ意味
・100クロスの瞬間だけを矢印表示する実装
・RSI/MACDとの違いと組み合わせ方

なぜMomentumを使うのか

まず、この指標を使う意義について整理します。

RSI/MACDとの違い(計算の単純さ)

RSIは上昇/下落の比率を計算し、

MACDは2本の移動平均線の差を計算します。

Momentumは、現在の価格と、

計算期間前の価格を比べるだけの単純な指標です。

基準線100の意味

Momentumは、計算期間前の価格を100として、

現在の価格がその何%の水準にあるかを表します。

100より上なら価格が上昇、100より下なら下落したことを意味します。

この記事で作るインジケーターの概要

Momentumの値そのものを見るだけでなく、

基準線100を上下にクロスした瞬間だけを、

矢印で知らせるインジケーターを作ります。

iMomentum()関数の基本

関数の書式と、戻り値の読み方を確認します。

関数の書式

double iMomentum(
   string           symbol,        // シンボル名
   int              timeframe,     // 時間枠
   int              period,        // Momentumの計算期間
   int              applied_price, // 適用価格
   int              shift          // シフト(0が最新バー)
   );

CopyRates等とは異なり、

MQL4のiMomentum()は配列ではなく、

1つの値を直接返す方式の関数です。

戻り値の読み方(100を基準に上下)

戻り値の読み方
・100より上 → 計算期間前より価格が上昇
・100より下 → 計算期間前より価格が下落
・100に近い → 値動きが小さく勢いが弱い

期間(period)の決め方

期間を短くするほど、

直近の価格変化に敏感に反応しますが、

ノイズのような小さな変化にも反応しやすくなります。

一般的には14前後から試すのがよいでしょう。

実際に動くコード全体

100クロスの瞬間だけを矢印で表示するインジケーターです。

設計のポイント(値そのものでなくクロスの瞬間を検知)

Momentumの値を毎回表示すると、

サブウィンドウが必要になり見づらくなります。

100をまたいだ瞬間だけをメインチャートに矢印で示すことで、

一目で勢いの転換点が分かる設計にします。

コード全文

//+------------------------------------------------------------------+
//|                                   MomentumCrossArrowIndicator.mq4 |
//|                     Copyright 2026, FX-EA System Project Creator |
//|                        https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, FX-EA System Project Creator"
#property link      "https://creator.fx-ea-system-project.com/"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2

input int MomentumPeriod = 14;

double UpArrowBuffer[];
double DownArrowBuffer[];

int OnInit()
  {
   SetIndexBuffer(0, UpArrowBuffer);
   SetIndexStyle(0, DRAW_ARROW, STYLE_SOLID, 2, clrBlue);
   SetIndexArrow(0, 233);

   SetIndexBuffer(1, DownArrowBuffer);
   SetIndexStyle(1, DRAW_ARROW, STYLE_SOLID, 2, clrRed);
   SetIndexArrow(1, 234);

   return(INIT_SUCCEEDED);
  }

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int start = (prev_calculated > 0) ? prev_calculated - 1 : 1;

   for(int i = start; i < rates_total; i++)
     {
      int shift = rates_total - 1 - i;

      double momNow = iMomentum(NULL, 0, MomentumPeriod, PRICE_CLOSE, shift);
      double momPrev = iMomentum(NULL, 0, MomentumPeriod, PRICE_CLOSE, shift + 1);

      UpArrowBuffer[i] = EMPTY_VALUE;
      DownArrowBuffer[i] = EMPTY_VALUE;

      if(momPrev <= 100 && momNow > 100)
        {
         UpArrowBuffer[i] = low[i] - 10 * _Point;
        }
      else if(momPrev >= 100 && momNow < 100)
        {
         DownArrowBuffer[i] = high[i] + 10 * _Point;
        }
     }

   return(rates_total);
  }

既刊記事と同じ設計を踏襲した理由

既刊のOsMA・iForceの矢印表示記事と同じく、

「前回値と今回値を比較して基準線をまたいだ瞬間だけ描画する」、

という設計を踏襲しています。

同じ考え方を複数の指標に応用できることが分かります。

基準線100クロスの判定ロジック

矢印を描画する条件の組み方を詳しく見ていきます。

前回値と今回値を比較する理由

momPrevとmomNowという2つの値を保持し、

100を挟んで値が入れ替わった瞬間だけを検出します。

値が100以上であり続ける間は、何度も矢印を描画しません。

上抜け/下抜けの矢印分岐

momPrevが100以下でmomNowが100超なら上抜け、

momPrevが100以上でmomNowが100未満なら下抜けと判定します。

チャタリングを減らす工夫

注意
・100付近で値動きが小さいと矢印が頻発しやすい
・期間(period)を長めにするとチャタリングが減る
・用途に応じて期間を調整する必要がある

既存インジケーターとの違い・組み合わせ方

他の指標や既刊記事との役割の違いを整理します。

既刊perfect-order-ea.mdなどとの組み合わせ

Momentumの100クロスは、

トレンドの転換点を早期にとらえやすい反面、

単独では誤検知も増えます。

既刊の複数指標多数決EAのような設計に、

1つの判断材料として組み込む使い方が実用的です。

RSIとの違い

RSIは0〜100の範囲に収まるよう正規化されていますが、

Momentumは上下に制限がなく、

値動きの大きさがそのまま反映されます。

単独で使う場合の注意

Momentum単独でのエントリー判断は、

誤検知が多くなりやすいため、

環境認識(トレンド/レンジ判定)等と組み合わせることを推奨します。

よくある注意点

実装時につまずきやすい点をまとめます。

applied_price引数の意味を誤解しやすい

PRICE_CLOSE以外の価格を指定すると、

一般的な「終値ベースのMomentum」とは、

異なる値になる点に注意してください。

期間を極端に短くするとノイズが増える

periodを極端に短くすると、

小さな値動きにも反応しやすくなり、

矢印が密集して読みにくくなります。

MQL5版は未着手(今後の課題)

MQL5のiMomentum()は、

ハンドルを返す方式に変わっており、

本記事ではMQL4版のみを扱いました。

MQL5版は今後の記事化候補として扱います。

よくある質問

Momentumについて、よくある疑問に回答します。

Momentumは何の略ですか?

英語で「勢い」を意味する単語がそのまま指標名になっています。

価格の勢い(変化の速さ)を数値化する指標です。

RSIと同時に使う意味はありますか?

計算方法が異なるため、

両方が同じ方向を示したときはシグナルの信頼度が上がる、

という使い方ができます。

サブウィンドウで値そのものも見たいです

本記事のコードはメインチャートに矢印だけを表示する設計です。

値そのものをグラフで見たい場合は、

indicator_separate_windowへ変更し、

バッファをDRAW_LINEで描画するよう改修してください。

【MQL4】Momentum(モメンタム)の基準線100クロスを矢印表示するインジケーターの作り方について解説してみた:まとめ

Momentumは、RSIやMACDに比べて影が薄い指標ですが、

計算がシンプルな分、値動きの勢いの変化にすばやく反応します。

値そのものを見る代わりに、

基準線100をまたいだ瞬間だけを矢印で表示することで、

勢いの転換点を一目で把握できるようになります。

単独でのエントリー判断には誤検知が伴うため、

環境認識や他の指標と組み合わせて使うことをおすすめします。

関連記事