せっかくMT4(MetaTrader4)を利用するなら、オリジナルのEA(Expert Advisor)やインジケーターを自作してみませんか。
今回は、初心者向けのMQL4言語入門として、カスタムインジケーターの超簡単な自作方法を解説します。
なぜ超簡単にできるのかというと、すでに出来上がっているカスタムインジケーターのソースコードの一部を書き換えるだけだからです。
せっかく作るなら使えるものがいいので、人気のインジケーター「HiLoバンド」を作ります。
最後あたりでEAの完成品を無料ダウンロードできるので、ぜひ読んで行ってください。
MetaEditor の起動
MT4の「メタクォーツ言語エディタ」をクリックします。
MeTaEditorが立ち上がったら、画面左側の「Navigater」内のツリーから「Indicators」をダブルクリックします。
「Indicators」のツリーから「MACD.mq4」をダブルクリックすると、ソースコードが開きます。
HiLoバンド
このMACDインジケーターのソースコードの一部を書き換えて、HiLoバンドのインジケーターを自作します。
有名なブレイクアウト戦略に必須のインジケーターです。
カスタムインジケーター「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」をダブルクリックすると、ポップアップウィンドウが開きます。
「OK」をクリックすると、チャートにHiLoバンドが表示されます。
まとめ|自作インジケーター無料配布
MQL4言語入門として、カスタムインジケーターを自作して、コンパイルし、チャートに表示させるまでを解説しました。
思ったより簡単だったのではないでしょうか。
また、今回の作業を応用すれば、さまざまなテクニカルインジケーターを自作することができます。
アイディア次第では、ものすごいカスタムインジケーターを自作できるかもしれませんよ。
完成品(HiLoBand.zip)はこちらからダウンロードできます。
・本インジケーターは、あくまでMQL4言語の学習用に無料配布するものです。なので、再配布はやめてください。
・もし、当サイトの宣伝や、下のバナーから『XMTrading』の口座開設をしていただけると、みんなに役立つサイト作りをもっともっと頑張れます(*^▽^*)
次回はブレイクアウト戦略のEAを作ります。今回作った「HiLoバンド」が出すサインで自動売買します。