
移動平均線を取得できる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(①, ②, ③, ④, ⑤, ⑥, ⑦);
一覧で見ると、このようになります。
| 番号 | データ型 | 引数名 | 内容 |
| ① | string | symbol | 通貨ペアを設定(NULLなど) |
| ② | int | timeframe | 時間足を設定(5分足など) |
| ③ | int | ma_period | 計算期間を設定(14,25,50など) |
| ④ | int | ma_shift | 表示移動の設定(普通は0) |
| ⑤ | int | ma_method | 計算方法の設定(Simpleなど) |
| ⑥ | int | applied_price | 適用価格の設定(始値や終値など) |
| ⑦ | int | shift | 先行・遅行の設定(右から何本目なのか) |
1つずつ見ていきましょう。
①symbol (通貨ペアを設定)
symbolは、移動平均を取得する通貨ペアを設定します。
例えばドル円の場合、「USDJPY」という値になります。
ですが、具体的に通貨ペアを設定する必要はありません。
というのもMQLには便利なものがあり、「Symbol」または「NULL」と書くだけで、現在の通貨ペアを設定できます。
そのため通常は、下記のように入力すれば大丈夫です。
double ma = iMA(NULL, ②, ③, ④, ⑤, ⑥, ⑦);
②timeframe (時間足を設定)
timeframeは、移動平均を取得する時間足を設定します。
「0」を入力すると、表示されている時間足になりますので、通常は「0」を入力すれば問題ありません。
double ma = iMA(NULL, 0, ③, ④, ⑤, ⑥, ⑦);
別の時間足を設定する方法
もし、表示されている時間足ではない値を取得したい場合は、以下の値を入力することで、別の時間足を設定できます。
| 入力値 | 内容 |
| PERIOD_CURRENT | 現在チャートの時間軸(0を入力した時と同じ) |
| PERIOD_M1 | 1分足 |
| PERIOD_M5 | 5分足 |
| PERIOD_M15 | 15分足 |
| PERIOD_M30 | 30分足 |
| PERIOD_H1 | 1時間足 |
| PERIOD_H4 | 4時間足 |
| PERIOD_D1 | 1日足 |
| PERIOD_W1 | 1週足 |
| PERIOD_MN1 | 1月足 |
③ma_period (計算期間を設定)
3つ目は、移動平均の計算期間を設定します。
計算期間とは、ロウソク足の本数のことです。
過去何本のロウソク足に対して、移動平均を計算するのかを設定します。
一般的には「7」、「14」、「25」という値がよく使われます。
「7」なら、過去7本のロウソク足に対して計算します。
ロジックに合わせた数値を入力すると良いでしょう。
double ma = iMA(NULL, 0, 7, ④, ⑤, ⑥, ⑦);
④ma_shift (表示移動の設定)
移動平均線の表示を、左右に移動させることができます。
ですが、こちらも設定する必要はなく、「0」を入力します。
もし「3」を入力した場合、ロウソク足3本分だけ右に移動します。
マイナスなら左に移動します。
double ma = iMA(NULL, 0, 7, 0, ⑤, ⑥, ⑦);移動するのは表示だけです。iMAの取得値が移動するのではないので、注意してください。
⑤ma_method (計算方法の設定)
計算方法の設定です。
移動平均線の計算方法は、主に4つあります。以下の通りです。
| 入力値 | 計算方法 |
| MODE_SMA | 単純移動平均 |
| MODE_EMA | 指数移動平均 |
| MODE_SMMA | 平滑移動平均 |
| MODE_LWMA | 加重移動平均 |
「難しい!」という方は、単純移動平均(MODE_SMA)を入力してください。
なぜなら、移動平均線のインジケータは、単純移動平均になっているからです。
そうすれば、Moving Averageインジケータの表示通りに、値を取得できるはずです。
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 |
double ma = iMA(NULL, 0, 7, 0, MODE_SMA, PRICE_CLOSE, ⑦);
⑦shift (先行・遅行の設定)
最後にshiftの設定です。
先行線や遅行線の設定をします。
簡単に言うと、どのくらい過去の移動平均線の値を取得するかです。
プラスの数値を入力した場合、その数値分だけ過去のロウソク足の、移動平均線の値を取得します。
移動平均線を1本だけ使う場合は、「0」で良いのですが、2本使う場合(ゴールデンクロスやデッドクロス)は、このshiftを使います。
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関数は引数が多く最初は難しく感じますが、慣れてしまえば簡単に使えるようになります。
ぜひサンプルコードを参考に、実際に動かしてみてください!





