移動平均線を取得できる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, ⑤, ⑥, ⑦);
⑤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(先行・遅行の設定)を変える方法
これら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 の値を変更することで、自在に使うことが可能です。
サンプルプログラムを実行しながら、ゆっくりと確認してみてください!