【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(先行・遅行の設定)を変える方法

これら2つをマスターすることで、移動平均線を自由自在に使うことができるようになります。

 

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

 

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

ma_periodは移動平均線の計算期間を設定する引数です。

もっと具体的に言うと、「何本の移動平均線を扱うのか」を設定する引数です。

ゴールデンクロスやデッドクロスの判定には、2本以上の移動平均線が必要です。

そこで、プログラムで2本以上の移動平均線を扱っていきます。

 

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

プログラムを書いてみましょう。

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
   {
//---

//iMAの返り値を代入する配列を準備
    double MA1;
    double MA2;
    double MA3;

//iMAを実行(③を変更)
    MA1 = iMA(NULL,0,7,0,MODE_SMA,PRICE_CLOSE,0);
    MA2 = iMA(NULL,0,14,0,MODE_SMA,PRICE_CLOSE,0);
    MA3 = iMA(NULL,0,25,0,MODE_SMA,PRICE_CLOSE,0);

//結果を表示
    Comment("\n",
            " 7移動平均線:",MA1,"\n","\n",
            "14移動平均線:",MA2,"\n","\n",
            "25移動平均線:",MA3);

   }

 

このプログラムを実行すると、このような結果になります。

 

③を変えることで、計算期間を変更できるため、1本だけでなく複数の移動平均線を扱うことができます。

ここでは3本の移動平均線の値を取得していますが、何本でも取得できます。

プログラム上で、複数の移動平均線を扱いたい時は、③ma_periodを変更して、使用してください。

 

 

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

shiftは過去の値を取得する時に使います。

簡単に言うと、「どのくらいの長さの線として扱うのか」を設定する引数です。

数値を増やせば増やすだけ、より過去の値を取得できるので、繋げることで線として扱うことができます。

下記のプログラムを見てください。

iMAの⑦shiftを変えて、その値を表示させるプログラムです。

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
   {
//---

//iMAの返り値を代入する配列を準備
    double MA[5];

//配列を初期化
    ArrayInitialize(MA,0);

//iMAを実行(⑦を変更)
    MA[0] = iMA(NULL,0,7,0,MODE_SMA,PRICE_CLOSE,0);
    MA[1] = iMA(NULL,0,7,0,MODE_SMA,PRICE_CLOSE,1);
    MA[2] = iMA(NULL,0,7,0,MODE_SMA,PRICE_CLOSE,2);
    MA[3] = iMA(NULL,0,7,0,MODE_SMA,PRICE_CLOSE,3);
    MA[4] = iMA(NULL,0,7,0,MODE_SMA,PRICE_CLOSE,4);

//結果を表示
    Comment("\n",
            "現在のロウソク足:",MA[0],"\n","\n",
            "1つ前のロウソク足:",MA[1],"\n","\n",
            "2つ前のロウソク足:",MA[2],"\n","\n",
            "3つ前のロウソク足:",MA[3],"\n","\n",
            "4つ前のロウソク足:",MA[4]);

   }

 

このプログラムを実行すると、以下のように表示されます。

 

iMAを使う時、上記のように⑦番目の引数を変えて、使用する場合が多いです。

なぜなら、点ではなく、線として扱いたいからです。

もう一度確認ですが、iMAは移動平均「点」を取得する関数です。

過去の点を繋げることで、移動平均「線」として扱うことができます。

その時に、配列を使うと便利なので、配列をマスターしていない方は、こちらを参考にしてください。

 

 

③ma_period、⑦shift を変えることで、移動平均線を自由自在に使用できます。

いろいろ値を変えてみて、表示がどうなるか検証してみてください。

 

 

まとめ

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

FXの基本と言われている、ゴールデンクロスやデッドクロスの判定に使うことができます。

引数の数が多くて混乱してしまいがちですが、引数のうち、③ma_period と ⑦shift の値を変更することで、自在に使うことが可能です。

サンプルプログラムを実行しながら、ゆっくりと確認してみてください!