【MQL4関数】iMA関数(移動平均線)の使い方とサンプルプログラム

【中級編】MQLプログラムの読み方・書き方
朝日奈りさ
朝日奈りさ

移動平均線を取得できるiMA関数について解説していくよ!

iMA関数とは?

ゴールデンクロスやデッドクロスを手法にしている方は、ぜひiMA関数をマスターしましょう!

iMA関数は、移動平均線の値を取得する関数です。

移動平均線の値が取得できれば、if文for文と組みわせることで、クロスの判定ができます。

しかし、iMA関数を使いこなすのは難しいため、挫折してしまうかたもいらっしゃいます。

なぜ難しいのかというと、返り値(戻り値)引数を入力する必要があるからです。

特に引数はとても複雑なので、しっかり把握するようにしましょう!

 

またiMA関数は、MQLに標準で組み込まれている関数なので、自分でプログラミングしなくてOKです!

いつでも使うことができます。

 

if文やfor文がわからない方は、以下の記事が参考になります。

 

 

iMA関数の書き方

iMA関数は難しいと言っても、基本的には関数の使い方と同じなので、まずは関数の基礎をマスターしましょう。

関数についてはこちらの記事にまとめておりますので、参考になると思います。

 

基本的な書き方

iMA関数の基本的な書き方は、以下の通りです。

分かりやすいように、引数は省略しています。

double ma = iMA(①, ②, ③, ④, ⑤, ⑥, ⑦);

 

このように返り値はdouble型です。

さらに7つの引数を入力します。

引数の数を見るだけでも、うんざりしてしまいますね…

まずは返り値、次に引数について、詳しく見ていきましょう。

 

iMA関数の返り値(戻り値)

iMA関数の返り値はdouble型です。

値が1つだけ返ってきます。

つまり、移動平均「線」ではなく、移動平均「点」が返ってくるのです。

例えばドル円で使ってみると、「107.000」のような値が返ってきます。

 

また、iMA関数は1つのロウソク足に対して、1つだけ値を返します。

そして、返ってきた値を繋げることで、移動平均「線」として処理することができるようになります。

 

iMA関数の引数

ここからは、iMA関数の引数について詳しく見ていきます。

難しいので、ゆっくり理解していくと良いと思います。

下記の通り、iMA関数は7つの引数があります。

double ma = iMA(①, ②, ③, ④, ⑤, ⑥, ⑦);

 

一覧で見ると、このようになります。

番号データ型引数名内容
stringsymbol通貨ペアを設定(NULLなど)
inttimeframe時間足を設定(5分足など)
intma_period計算期間を設定(14,25,50など)
intma_shift表示移動の設定(普通は0)
intma_method計算方法の設定(Simpleなど)
intapplied_price適用価格の設定(始値や終値など)
intshift先行・遅行の設定(右から何本目なのか)

 

1つずつ見ていきましょう。

 

①symbol (通貨ペアを設定)

symbolは、移動平均を取得する通貨ペアを設定します。

例えばドル円の場合、「USDJPY」という値になります。

ですが、具体的に通貨ペアを設定する必要はありません。

というのもMQLには便利なものがあり、「Symbol」または「NULL」と書くだけで、現在の通貨ペアを設定できます。

そのため通常は、下記のように入力すれば大丈夫です。

①に「NULL」を入力
double ma = iMA(NULL, ②, ③, ④, ⑤, ⑥, ⑦);

 

②timeframe (時間足を設定)

timeframeは、移動平均を取得する時間足を設定します。

「0」を入力すると、表示されている時間足になりますので、通常は「0」を入力すれば問題ありません。

②に「0」を入力
double ma = iMA(NULL, 0, ③, ④, ⑤, ⑥, ⑦);

 

別の時間足を設定する方法

もし、表示されている時間足ではない値を取得したい場合は、以下の値を入力することで、別の時間足を設定できます。

入力値内容
PERIOD_CURRENT現在チャートの時間軸(0を入力した時と同じ)
PERIOD_M11分足
PERIOD_M55分足
PERIOD_M1515分足
PERIOD_M3030分足
PERIOD_H11時間足
PERIOD_H44時間足
PERIOD_D11日足
PERIOD_W11週足
PERIOD_MN11月足

 

③ma_period (計算期間を設定)

3つ目は、移動平均の計算期間を設定します。

計算期間とは、ロウソク足の本数のことです。

過去何本のロウソク足に対して、移動平均を計算するのかを設定します。

一般的には「7」「14」「25」という値がよく使われます。

「7」なら、過去7本のロウソク足に対して計算します。

ロジックに合わせた数値を入力すると良いでしょう。

③に「7」を入力
double ma = iMA(NULL, 0, 7, ④, ⑤, ⑥, ⑦);

 

④ma_shift (表示移動の設定)

移動平均線の表示を、左右に移動させることができます。

ですが、こちらも設定する必要はなく、「0」を入力します。

もし「3」を入力した場合、ロウソク足3本分だけ右に移動します。

マイナスなら左に移動します。

④に「0」を入力
double ma = iMA(NULL, 0, 7, 0, ⑤, ⑥, ⑦);

移動するのは表示だけです。iMAの取得値が移動するのではないので、注意してください。

 

⑤ma_method (計算方法の設定)

計算方法の設定です。

移動平均線の計算方法は、主に4つあります。以下の通りです。

入力値計算方法
MODE_SMA単純移動平均
MODE_EMA指数移動平均
MODE_SMMA平滑移動平均
MODE_LWMA加重移動平均

 

「難しい!」という方は、単純移動平均(MODE_SMA)を入力してください。

なぜなら、移動平均線のインジケータは、単純移動平均になっているからです。

そうすれば、Moving Averageインジケータの表示通りに、値を取得できるはずです。

⑤に「MODE_SMA」を入力
double ma = iMA(NULL, 0, 7, 0, MODE_SMA, ⑥, ⑦);

 

⑥applied_price (適用価格の設定)

適用価格とは、ロウソク足の「終値」「始値」「高値」「底値」のことです。

移動平均の計算を、どの値で計算するのかを設定します。

以下の通り設定できるのですが、「終値」(PRICE_CLOSE)で設定して問題ありません。

入力値内容
PRICE_CLOSE終値
PRICE_OPEN始値
PRICE_HIGH高値
PRICE_LOW底値
PRICE_MEDIAN中間(高値 + 安値)/2
PRICE_TYPICAL中間(高値 + 安値 + 終値)/3
PRICE_WEIGHTED中間(高値 + 安値 + 終値 + 終値)/4
⑥に「PRICE_CLOSE」を入力
double ma = iMA(NULL, 0, 7, 0, MODE_SMA, PRICE_CLOSE, ⑦);

 

⑦shift (先行・遅行の設定)

最後にshiftの設定です。

先行線や遅行線の設定をします。

簡単に言うと、どのくらい過去の移動平均線の値を取得するかです。

プラスの数値を入力した場合、その数値分だけ過去のロウソク足の、移動平均線の値を取得します。

移動平均線を1本だけ使う場合は、「0」で良いのですが、2本使う場合(ゴールデンクロスやデッドクロス)は、このshiftを使います。

⑦に「0」を入力
double ma = iMA(NULL, 0, 7, 0, MODE_SMA, PRICE_CLOSE, 0);

 

ここまでで、iMAの書き方は完了です。

上記のように記述すれば、移動平均線の値を取得することができます。

 

iMA関数の具体的な使い方(サンプルあり)

もう少し具体的な使い方を見ていきましょう。

iMAを使う時、大体2通りの使い方があります。

  • ③ma_period(計算期間の設定)を変える方法
  • ⑦shift(先行・遅行の設定)を変える方法

それぞれ見ていきましょう。

 

③ma_period(計算期間)を変える方法

ゴールデンクロスやデッドクロスを判定する場合、短期移動平均線と長期移動平均線の2本が必要です。

この場合、③ma_period(計算期間)を変えることで、短期と長期の移動平均線の値を取得できます。

例えば、短期を「7」、長期を「25」に設定する場合は以下の通りです。

// 短期移動平均線(期間7)
double ma_short = iMA(NULL, 0, 7, 0, MODE_SMA, PRICE_CLOSE, 0);

// 長期移動平均線(期間25)
double ma_long = iMA(NULL, 0, 25, 0, MODE_SMA, PRICE_CLOSE, 0);

 

このように③の部分だけを変えることで、短期と長期の値を別々に取得できます。

 

⑦shift(先行・遅行)を変える方法

ゴールデンクロスやデッドクロスの判定には、現在の値1本前の値を比較する必要があります。

この場合、⑦shift(先行・遅行の設定)を変えることで、過去の移動平均線の値を取得できます。

例えば、現在のロウソク足と1本前のロウソク足の移動平均を取得する場合は以下の通りです。

// 現在のロウソク足の移動平均(shift=0)
double ma_current = iMA(NULL, 0, 7, 0, MODE_SMA, PRICE_CLOSE, 0);

// 1本前のロウソク足の移動平均(shift=1)
double ma_prev = iMA(NULL, 0, 7, 0, MODE_SMA, PRICE_CLOSE, 1);

 

⑦の部分を「0」にすると現在のロウソク足、「1」にすると1本前のロウソク足の値を取得します。

 

サンプルプログラム(ゴールデンクロス・デッドクロス判定)

ここからは、iMA関数を使った実践的なサンプルプログラムを紹介します。

ゴールデンクロスとデッドクロスを判定するEA(自動売買プログラム)のサンプルです。

 

ゴールデンクロス・デッドクロスの判定ロジック

ゴールデンクロスとデッドクロスの判定は、以下のように考えます。

【ゴールデンクロス】

  • 1本前:短期MA < 長期MA(短期が下にある)
  • 現在 :短期MA > 長期MA(短期が上に抜けた)

【デッドクロス】

  • 1本前:短期MA > 長期MA(短期が上にある)
  • 現在 :短期MA < 長期MA(短期が下に抜けた)

 

サンプルコード

以下がゴールデンクロス・デッドクロスを判定し、アラートを表示するサンプルプログラムです。

//+------------------------------------------------------------------+
//| iMA関数サンプル - ゴールデンクロス・デッドクロス判定             |
//+------------------------------------------------------------------+

// 入力パラメータ
input int ShortPeriod = 7;    // 短期移動平均の期間
input int LongPeriod  = 25;   // 長期移動平均の期間

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   // 現在のロウソク足の短期・長期移動平均を取得
   double ma_short_current = iMA(NULL, 0, ShortPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
   double ma_long_current  = iMA(NULL, 0, LongPeriod,  0, MODE_SMA, PRICE_CLOSE, 0);

   // 1本前のロウソク足の短期・長期移動平均を取得
   double ma_short_prev = iMA(NULL, 0, ShortPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
   double ma_long_prev  = iMA(NULL, 0, LongPeriod,  0, MODE_SMA, PRICE_CLOSE, 1);

   // ゴールデンクロス判定
   if(ma_short_prev < ma_long_prev && ma_short_current > ma_long_current)
   {
      Alert("ゴールデンクロスが発生しました!");
   }

   // デッドクロス判定
   if(ma_short_prev > ma_long_prev && ma_short_current < ma_long_current)
   {
      Alert("デッドクロスが発生しました!");
   }
}

 

サンプルコードの解説

上記のサンプルコードを順番に解説します。

 

①入力パラメータの設定

input int ShortPeriod = 7;    // 短期移動平均の期間
input int LongPeriod  = 25;   // 長期移動平均の期間

inputをつけることで、EAの設定画面から期間を変更できるようになります。

 

②現在と1本前の移動平均線の値を取得

// 現在のロウソク足(shift=0)
double ma_short_current = iMA(NULL, 0, ShortPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
double ma_long_current  = iMA(NULL, 0, LongPeriod,  0, MODE_SMA, PRICE_CLOSE, 0);

// 1本前のロウソク足(shift=1)
double ma_short_prev = iMA(NULL, 0, ShortPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
double ma_long_prev  = iMA(NULL, 0, LongPeriod,  0, MODE_SMA, PRICE_CLOSE, 1);

③ma_periodと⑦shiftの両方を変えて、合計4つの値を取得しています。

 

③ゴールデンクロス・デッドクロスの判定

// ゴールデンクロス判定
if(ma_short_prev < ma_long_prev && ma_short_current > ma_long_current)
{
   Alert("ゴールデンクロスが発生しました!");
}

if文を使って、1本前では短期が長期より下にあり、現在は短期が長期より上にある場合を、ゴールデンクロスと判定しています。

デッドクロスは、この逆の条件で判定しています。

 

iMA関数を使う時の注意点

最後に、iMA関数を使う時の注意点をまとめておきます。

 

注意点①:返ってくるのは「点」であること

先ほども説明しましたが、iMA関数は移動平均「線」ではなく、移動平均「点」を返します。

1回の呼び出しで、1つのロウソク足に対する1つの値しか取得できません。

複数の値が必要な場合は、⑦shiftの値を変えて複数回呼び出す必要があります。

 

注意点②:④ma_shiftと⑦shiftの違い

④ma_shiftと⑦shiftは混同しやすいので注意が必要です。

  • ④ma_shift:表示を移動させるだけ(取得する値は変わらない)
  • ⑦shift:取得するロウソク足の位置を変える(実際に取得する値が変わる)

通常は④ma_shiftは「0」のままで、⑦shiftを使って過去の値を取得するようにしましょう。

 

注意点③:計算期間より少ないデータしかない場合

例えばma_periodを「25」に設定した場合、最低でも25本のロウソク足のデータが必要です。

データが不足している場合、正しい値が返ってこない可能性があるので注意してください。

 

まとめ

iMA関数について解説しました。ポイントをまとめます。

  • iMA関数は移動平均線の値を取得する関数
  • 返り値はdouble型で、1つの値(移動平均「点」)が返ってくる
  • 引数は7つあるが、よく変更するのは③ma_periodと⑦shift
  • ゴールデンクロス・デッドクロスの判定には、③ma_periodと⑦shiftを組み合わせて使う
  • ④ma_shiftと⑦shiftの違いに注意する

 

iMA関数は引数が多く最初は難しく感じますが、慣れてしまえば簡単に使えるようになります。

ぜひサンプルコードを参考に、実際に動かしてみてください!