移動平均線を表示するインジケーターのコードをそのままコピペしたのに、
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です。

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つの種類の移動平均線を表示することができました。
今回のソースコードを応用すれば、何本でも移動平均線を表示させることができるようになります。
コメント