移動平均線を表示するインジケーターのコードをそのままコピペしたのに、

MetaEditorでコンパイルが通らない——原因の多くは、

記事のコード表示に紛れ込んだ余計なHTMLタグです。

この記事では、SMA(単純移動平均線)とEMA(指数移動平均線)を、

同時に表示するインジケーターの作り方を、

実際にコピペしてコンパイルできる状態のコードで解説します。

SMA・EMAの2つの移動平均線を同時表示するインジケーターとは

前回は1つの移動平均線を表示できたので、

今回は異なる種類の移動平均線を、

同時に表示させるインジケーターを作成していきます。

この記事で作るもの
・SMAの移動平均線を表示させる
・EMAの移動平均線を表示させる

メタエディタで「ma-sample2」インジケーターを新規作成する

まずはメタエディタ(MetaEditor)を立ち上げて、新しいインジケーターを作成します。

メタエディタ(MetaEditor)を立ち上げましょう。

今回は名前を「ma-sample2」で作成します。

プロパティとバッファを記述する(2本の移動平均線の設定)

今回は2つの移動平均線を使うので、プロパティとバッファをそれぞれ2つ用意します。

プロパティを記述する(色・線種・幅を2本分)

今回は2つの移動平均線を使うので2つのプロパティを記述します。バッファも2つ用意します。

1つ目の移動平均線は

  • 赤色
  • SOLID
  • 幅3

2つ目の移動平均線は

  • 黄色
  • SOLID
  • 幅3

です。まずは移動平均線を2つ表示させるためにバッファを2つ用意しましょう。

#property indicator_buffers 2//バッファ2つ

次に色を指定します。

#property indicator_color1 Red//赤色
#property indicator_color2 Yellow//黄色

次に線を実線にします。

#property indicator_style1 STYLE_SOLID//実線
#property indicator_style2 STYLE_SOLID//実線

最後に線の幅を決めます。

#property indicator_width1 3//幅3
#property indicator_width2 3//幅3

これでプロパティの記述は完了です。

#property indicator_buffers 2//バッファ2つ
#property indicator_color1 Red//赤色
#property indicator_color2 Yellow//黄色
#property indicator_style1 STYLE_SOLID//実線
#property indicator_style2 STYLE_SOLID//実線
#property indicator_width1 3//幅3
#property indicator_width2 3//幅3

バッファを定義する(sma[]とema[]の2つ)

バッファの定義します。今回は移動平均線が2つなのでバッファも2つ用意します。

sma[]とema[]の2つのバッファを作りましょう。

double sma[];//バッファ定義
double ema[];//バッファ定義

これでバッファの定義は完了です。

double sma[];//バッファ定義
double ema[];//バッファ定義

OnInit()・OnCalculate()にSMA/EMAの計算を実装する

バッファの定義ができたら、

OnInit()での紐付けとOnCalculate()での計算処理を実装します。

OnInit()でSetIndexBufferを2つ紐付ける

OnInit()関数に記述していきます。

今回は配列を2つ使うので、SetIndexBufferも0と1の2つを使います。

0にsmaの配列を紐付けして、1にemaの配列を紐付けします。

SetIndexBuffer(0,sma);//インデックス0にsma配列を紐付け
SetIndexBuffer(1,ema);//インデックス1にema配列を紐付け

これでOnInit()関数の記述は完了です。

SetIndexBuffer(0,sma);//インデックス0にsma配列を紐付け
SetIndexBuffer(1,ema);//インデックス1にema配列を紐付け

OnCalculate()でiMA関数からSMA・EMAを取得する

OnCalculate()関数に記述にはiMA関数の情報を記述していきます。

前回は1つでしたが、今回は2つ必要になります。今回は

  • 期間20
  • SMAとEMAを1つずつ

表示させていきます。

まずは、いつもどおりに未計算のバーを計算します。

int limit = Bars-IndicatorCounted();//未だ計算されていないバー数(チャート上のバー数 - 計算済みバー数)

つぎにfor文でいつもどおりに繰り返し計算させます。

for(int i=0; i < limit; i++)

最後にfor文の条件が満たされている場合に移動平均線を表示させましょう。

sma[i] = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, i);//期間20のSMA
ema[i] = iMA(NULL, 0, 20, 0, MODE_EMA, PRICE_CLOSE, i);//期間20のEMA

これでOnCalculate()関数の記述は完了です。

int limit = Bars-IndicatorCounted();//未だ計算されていないバー数(チャート上のバー数 - 計算済みバー数)
   for(int i=0; i < limit; i++)
   {
      sma[i] = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, i);//期間20のSMA
      ema[i] = iMA(NULL, 0, 20, 0, MODE_EMA, PRICE_CLOSE, i);//期間20のEMA
   }

コンパイルして動作確認する

記述が終わったら、実際にコンパイルしてチャートで表示を確認します。

コピペしてコンパイルが通らないときに確認すること

注意
もし上のコードでコンパイルエラーが出た場合、

コピー元に<span>のような、

HTMLタグの断片が紛れ込んでいないか確認してください。

コードをブログに掲載する際のシンタックスハイライト表示が、

コピペ時にそのまま文字として貼り付いてしまうことがあります。

下の「ソースコード全体」からコピーすれば、この問題は起きません。

コンパイルしてチャートへ適用する

コンパイルしてチャートにセットして赤色と黄色の移動平均線が表示されていればOKです。

MQL インジケーター作成 2つの移動平均線を表示

ma-sample2のソースコード全体(SMA・EMA同時表示インジケーター)

ma-sample2のソースコード全体は以下に記載しています。

//+------------------------------------------------------------------+
//|                                                   ma-sample2.mq4 |
//|                     Copyright 2020, FX-EA System Project Creator |
//|                        https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, FX-EA System Project Creator"
#property link      "https://creator.fx-ea-system-project.com/"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 2//バッファ2つ
#property indicator_color1 Red//赤色
#property indicator_color2 Yellow//黄色
#property indicator_style1 STYLE_SOLID//実線
#property indicator_style2 STYLE_SOLID//実線
#property indicator_width1 3//幅3
#property indicator_width2 3//幅3
double sma[];//バッファ定義
double ema[];//バッファ定義

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0,sma);//インデックス0にsma配列を紐付け
   SetIndexBuffer(1,ema);//インデックス1にema配列を紐付け
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
//---
   int limit = Bars-IndicatorCounted();//未だ計算されていないバー数(チャート上のバー数 - 計算済みバー数)
   for(int i=0; i < limit; i++)
   {
      sma[i] = iMA(NULL, 0, 20, 0, MODE_SMA, PRICE_CLOSE, i);//期間20のSMA
      ema[i] = iMA(NULL, 0, 20, 0, MODE_EMA, PRICE_CLOSE, i);//期間20のEMA
   }
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

あわせて読みたい: 【MQL】移動平均線の傾きを表示させるインジケーター【初級編】

【MQL】2つの種類の違う移動平均線を表示させるインジケーター【初級編】:まとめ

これで2つの種類の移動平均線を表示することができました。

今回のソースコードを応用すれば、何本でも移動平均線を表示させることができるようになります。

関連記事