MQL4言語入門|カスタムインジケーターの超簡単な自作方法|ハイローバンド

この記事は約13分で読めます。

MQL言語入門|カスタムインジケーターの超簡単な自作方法|ハイローバンド

せっかくMT4(MetaTrader4)を利用するなら、オリジナルのEA(Expert Advisor)やインジケーターを自作してみませんか。

 

今回は、初心者向けのMQL4言語入門として、カスタムインジケーターの超簡単な自作方法を解説します。

なぜ超簡単にできるのかというと、すでに出来上がっているカスタムインジケーターのソースコードの一部を書き換えるだけだからです。

 

せっかく作るなら使えるものがいいので、人気のインジケーター「HiLoバンド」を作ります。

最後あたりでEAの完成品を無料ダウンロードできるので、ぜひ読んで行ってください。

 

スポンサーリンク

MetaEditor の起動

MT4の「メタクォーツ言語エディタ」をクリックします。

メタエディター起動

 

MeTaEditorが立ち上がったら、画面左側の「Navigater」内のツリーから「Indicators」をダブルクリックします。

「Indicators」のツリーから「MACD.mq4」をダブルクリックすると、ソースコードが開きます。

MACDインジケーター起動

 

スポンサーリンク

HiLoバンド

このMACDインジケーターのソースコードの一部を書き換えて、HiLoバンドのインジケーターを自作します。

「HiLoバンド」とは、チャート上に、過去n日間の高値(Hiバンド)、安値(Loバンド)、中心線(Midバンド)の3本のラインを描き、レジスタンスやサポートを確認したり、高値・安値のブレイクアウトを判断するテクニカル指標です。

有名なブレイクアウト戦略に必須のインジケーターです。

 

スポンサーリンク

カスタムインジケーター「HiLoBand.mq4」の自作

最初に、名前をつけてファイルを保存します。

「MACD.mq4」が開いている状態で、「File」→「Save As…」 をクリックします。

メタエディター保存

 

ファイル名を「HiLoBand.mq4」と打ち込んで保存します。

それでは、いよいよソースコードを書き換えていきます。

 

厳格モード命令と外部ファイル使用宣言の削除

ソースコード9行目と11行目を削除します。

#property strict

#include <MovingAverages.mqh>

9行目は厳格モード(strict)の宣言です。このままでも特に問題ないのですが、このへんは私の趣味です。

11行目は外部にある移動平均線のヘッダーファイル(.mch)を使用するための宣言なのですが、HiLoバンドでは使用しません。

 

インジケーターの描画場所、数、色、幅の変更

カーソルを下に移動させます。

ここでは、インジケーターの描画場所、数、色、幅を指定しています。

【変更前】

//--- indicator settings
#property indicator_separate_window
#property indicator_buffers 2
#property indicator_color1 Silver
#property indicator_color2 Red
#property indicator_width1 2

【変更後】

//--- indicator settings
#property indicator_chart_window
#property indicator_buffers 3
#property indicator_color1 Blue
#property indicator_color2 Red
#property indicator_color3 White
#property indicator_width1 2
#property indicator_width2 2
#property indicator_width3 1

「#property indicator_separate_window」は、インジケーターをサブウィンドウに表示させる命令です。HiLoバンドは、メインウィンドウに表示したいので、「#property  indicator_chart_window」に書き換えます。

「#property indicator_buffers」は、インジケーター数を指定する命令です。HiLoバンドには3つインジケーターがあるので、「3」に書き換えます。

「#property indicator_color」は、各インジケーターの色を指定する命令です。3色の見やすさを考え、上記のように書き換えます。

「#property indicator_width」は、各インジケーターの線の幅を指定する命令です。3本の見やすさを考え、上記のように書き換えます(HiラインとLoラインは太線、Midラインは細線)。

 

パラメーター設定の変更

カーソルを下に移動させます。

ここでは、各パラメーターの初期値を設定しています。

【変更前】

//--- indicator parameters
input int InpFastEMA=12; // Fast EMA Period
input int InpSlowEMA=26; // Slow EMA Period
input int InpSignalSMA=9; // Signal SMA Period

【変更後】

//--- indicator parameters
input int BandPeriod=20;

HiLoバンドの期間を、一般的によく使われる「20」に設定しました。

 

インジケーター配列の宣言の変更

カーソルを下に移動させます。

ここでは、各インジケーターを配列として宣言しています。

配列とは、変数(データを一時的に入れておく箱)を複数個並べたものです。

1つの変数には1つのデータしか入れられませんが、配列にはたくさんのデータを格納することができます。

【変更前】

//--- indicator buffers
double ExtMacdBuffer[];
double ExtSignalBuffer[];

【変更後】

//--- indicator buffers
double HL[];
double LL[];
double ML[];

LL(Loバンド)、HL(Hiバンド)、ML(Midバンド)の3つ宣言します。

 

描画設定の変更

カーソルを下に移動させます。

ここでは、各インジケーターの描画設定が記述されています。

【変更前】

//--- drawing settings
SetIndexStyle(0,DRAW_HISTOGRAM);
SetIndexStyle(1,DRAW_LINE);
SetIndexDrawBegin(1,InpSignalSMA);

【変更後】

//--- drawing settings
SetIndexStyle(0,DRAW_LINE);
SetIndexStyle(1,DRAW_LINE);
SetIndexStyle(2,DRAW_LINE);
SetIndexDrawBegin(0,BandPeriod);
SetIndexDrawBegin(1,BandPeriod);
SetIndexDrawBegin(2,BandPeriod);

SetIndexStyle関数は、各インジケーターの描画スタイルを指定します。HiLoバンドでは、3本のラインをすべて実線(SOLID)に指定します。

SetIndexDrawBegin関数は、インジケーターの描画を開始するバーの位置を指定します。

 

インジケーター配列のインデックスバッファー領域への割り当ての変更

カーソルを下に移動させます。

ここでは、各インジケーター配列をインデックスバッファー領域に割り当てています。

【変更前】

//--- indicator buffers mapping
SetIndexBuffer(0,ExtMacdBuffer);
SetIndexBuffer(1,ExtSignalBuffer);

【変更後】

//--- indicator buffers mapping
SetIndexBuffer(0,HL);
SetIndexBuffer(1,LL);
SetIndexBuffer(2,ML);

SetIndexBuffer関数は、インジケーター配列をインデックスバッファー領域に割り当てます。Hiバンド(HL)を「0」に、Midバンド(ML)を「1」に、Loバンド(LL)を「2」に、それぞれ割り当てます。

 

名前と説明の表示の変更

カーソルを下に移動させます。

ここでは、チャート等に表示させる各インジケーターの名前と説明について記述されています。

【変更前】

//--- name for DataWindow and indicator subwindow label
IndicatorShortName("MACD("+IntegerToString(InpFastEMA)+","+IntegerToString(InpSlowEMA)+","+IntegerToString(InpSignalSMA)+")");
SetIndexLabel(0,"MACD");
SetIndexLabel(1,"Signal");

【変更後】

//--- name for DataWindow and indicator subwindow label
IndicatorShortName("HiLoBand("+BandPeriod+")");
SetIndexLabel(0,"High");
SetIndexLabel(1,"Low");
SetIndexLabel(2,"Mid");

IndicatorShortName関数は、データウィンドウとサブウィンドウにインジケーターの名前を表示させます。

SetIndexLabel関数は、データウィンドウにインジケーターの描画線の説明を表示させます。

 

エラー条件の変更

カーソルを下に移動させます。

ここでは、パラメーターエラーについて記述されています。

【変更前】

//--- check for input parameters
if(InpFastEMA<=1 || InpSlowEMA<=1 || InpSignalSMA<=1 || InpFastEMA>=InpSlowEMA)

【変更後】

//--- check for input parameters
if(BandPeriod<=1)

if文(条件分岐)により、パラメーター「BandPeriod」を「1」以下に設定するとエラーメッセージを吐き出すよう記述しました。

 

HiLoバンドの計算の記述

カーソルを下に移動させます。

【変更前】

int i,limit;
//---
if(rates_total<=InpSignalSMA || !ExtParameters) return(0); --- last counted bar will be recounted limit=rates_total-prev_calculated; if(prev_calculated>0)
limit++;
--- macd counted in the 1-st buffer
for(i=0; i<limit; i++)
ExtMacdBuffer[i]=iMA(NULL,0,InpFastEMA,0,MODE_EMA,PRICE_CLOSE,i)-
iMA(NULL,0,InpSlowEMA,0,MODE_EMA,PRICE_CLOSE,i);
--- signal line counted in the 2-nd buffer
SimpleMAOnBuffer(rates_total,prev_calculated,0,InpSignalSMA,ExtMacdBuffer,ExtSignalBuffer);
--- done
return(rates_total);

【変更後】

int i,limit;
int CountedBars=IndicatorCounted();

if(CountedBars<0) return(-1); if(CountedBars>0) CountedBars--;
limit=Bars-CountedBars;

for(i = 0; i < limit; i ++) {
HL[i] = High[Highest(NULL,0,MODE_HIGH,BandPeriod,i+1)];
LL[i] = Low[Lowest(NULL,0,MODE_LOW,BandPeriod,i+1)];
ML[i] = (LL[i]+HL[i])/2;
}

ここで、ようやくHiLoバンド本体の計算をします。

MACDの計算をすべて削除して、上記のように書き換えます。

内容は、時間足ごとに、パラメーター「BandPeriod」で指定した期間の最安値(LL[i])、最高値(HL[i])、中間値(ML[i])を計算しています。

 

まず、変数CountedBarsに、IndicatorCounted()の値を代入します。

IndicatorCounted()は、計算済みのバーの本数を取得します。

 

次に、現在のバー数(Bars)からこのCountedBarsから1をを引いた値を、変数limitに代入します。

 

最後のfor文では、limitが0より大きくなるとき、つまりバーが新しくなるたびに一回だけHL[i]とML[i]とLL[i]を計算します。

for文は、指定した回数だけ処理を繰り返すときに使われます。

Low[]は、安値を格納した配列で、Low[0]なら現在のバーの安値、Low[1]なら1本前のバーの安値、Low[2]なら2本前のバーの安値を表します。

High[]は、高値を格納した配列で、High[0]なら現在のバーの高値、High[1]なら1本前のバーの高値、High[2]なら2本前のバーの高値を表します。

 

ソースコードの書き換えは以上です。

一応、記事の最後あたりに、完成品をダウンロードできるよう置いておきます。

 

スポンサーリンク

ソースコードをコンパイルする

記述し終わったら、「Compile」をクリックします。

記述ミスがなければ、Destrictionに、「0 error(s), 0 warning(s)」と表示されます。

コンパイル

 

コンパイルとは、プログラムのソースコードをコンピューターが実行可能な機械語に翻訳することです。

ソースコードに記述ミスがあった場合は、エラーとなります。

エラーがでた場合は、記述を修正して再びコンパイルしましょう。

 

以下は、よくあるエラーの例です。気を付けましょう。

 

  • 全角で記述している(ソースコードはすべて半角で記述します)
  • 変数の型(”int” や “double” など)が違う
  • カッコ(”{” や ”}“)が足りない(多い)
  • ;” が抜けている

 

スポンサーリンク

チャートに表示する

では、「HiLoBand.mq4」をチャートに表示させてみましょう。

MT4を立ち上げて、画面左側のナビゲーター内のツリーから「インディケータ」をダブルクリックします。

チャート

 

「インディケータ」のツリーから「HiLoBan.mq4」をダブルクリックすると、ポップアップウィンドウが開きます。

HiLoバンドパラメーター

 

「OK」をクリックすると、チャートにHiLoバンドが表示されます。

HiLoバンドチャート

 

スポンサーリンク

まとめ|自作インジケーター無料配布

MQL4言語入門として、カスタムインジケーターを自作して、コンパイルし、チャートに表示させるまでを解説しました。

思ったより簡単だったのではないでしょうか。

また、今回の作業を応用すれば、さまざまなテクニカルインジケーターを自作することができます。

アイディア次第では、ものすごいカスタムインジケーターを自作できるかもしれませんよ。

 

完成品(HiLoBand.zip)はこちらからダウンロードできます。

・本インジケーターは、あくまでMQL4言語の学習用に無料配布するものです。なので、再配布はやめてください。
・もし、当サイトの宣伝や、下のバナーから『XMTrading』の口座開設をしていただけると、みんなに役立つサイト作りをもっともっと頑張れます(*^▽^*)

 

次回はブレイクアウト戦略のEAを作ります。今回作った「HiLoバンド」が出すサインで自動売買します。

 

タイトルとURLをコピーしました