MQL4 iMA 移動平均のインジケータを作成

移動平均(Moving Average)は、一定期間の価格の平均値を線でつないだ、もっとも基本的なテクニカル指標です。MT4には標準で「Moving Average」が入っていますが、ここではMQL4のiMA()関数を使って、移動平均線を描くカスタムインジケータを一から作ってみます。

自分で書いてみると、インジケータの基本的な作り(バッファの用意と OnCalculate() での計算)がよくわかります。

[PR]


移動平均とiMA()関数

MQL4で移動平均の値を取得するには、iMA()関数を使います。書式は次のとおりです。

それぞれの引数の意味は次のとおりです。

引数 意味 例
symbol 計算する通貨ペア。NULLで現在のチャートの通貨ペア NULL
timeframe 時間足(ENUM_TIMEFRAMES)。0で現在のチャートの時間足 0、PERIOD_H1
ma_period 平均する期間(バーの本数) 14
ma_shift 移動平均線を横方向にずらす本数(ラインのオフセット) 0
ma_method 平均化手法(ENUM_MA_METHOD) MODE_SMA
applied_price 計算に使う価格(ENUM_APPLIED_PRICE) PRICE_CLOSE
shift 何本前のバーの値を取り出すか。0が最新バー i

Ref:iMA – MQL4 Documentation

サンプルコード

MetaEditorで新しいカスタムインジケータを作成し、次のコードを貼り付けてコンパイルすると、チャート上にマゼンタ色の14期間SMA(終値ベース)が表示されます。

このサンプルは単純移動平均(SMA)ですが、iMA()では4種類の平均化手法を選べます(後述)。

コードのポイント

  • バッファの用意:#property indicator_buffers 1 で描画用のバッファを1本確保し、OnInit()のSetIndexBuffer()で配列Buffer[]と結びつけます。MQL4のインジケータバッファは、添字0が最新のバーで、数字が大きいほど過去のバーになります。
  • 計算する範囲(limit):初回は prev_calculated が0なので、すべてのバーを計算します。2回目以降は prev_calculated に前回の rates_total が入るため、差は新しいバーができたときだけ1、それ以外は0になります。このままでは形成中の最新バー(i=0)が更新されないので、limit++ で最新バーを毎ティック計算し直しています。
  • input パラメータ:MovingPeriod と MovingShift は input で宣言しているので、チャートに挿入するときのパラメータ画面から変更できます。
  • MQL5との違い:MQL5でよく見る #property indicator_plots はMQL4にはない設定なので、MQL4では使いません。

平均化手法

iMA()の第5引数 ma_method には、次の4種類を指定できます。

定数 名称 特徴
MODE_SMA 単純移動平均(SMA) 期間内の価格をそのまま平均。なめらかだが反応は遅め
MODE_EMA 指数移動平均(EMA) 直近の価格ほど重みを大きくする。SMAより反応が速い
MODE_SMMA 平滑移動平均(SMMA) 過去の平均値を引き継ぎながら平滑化。もっともゆるやかな線になりやすい
MODE_LWMA 加重移動平均(LWMA) 新しい価格ほど直線的に重みを大きくする。反応が速い

たとえばEMAに変えたいときは、サンプルコードの MODE_SMA を MODE_EMA に書き換えるだけです。

同じ期間でも、平均化手法によって線の形はかなり変わります。反応の速さとダマシの多さはトレードオフなので、それぞれの特徴を知ったうえで使い分けるとよいでしょう。

References:

シェアする

  • このエントリーをはてなブックマークに追加

フォローする