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

 

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

 

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

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

 

ホントに超簡単ですので、ぜひ挑戦してみてください。

 

MetaEditor の起動

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

 

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

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

 

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」に設定しました。

 

インジケーター変数の宣言の変更

カーソルを下に移動させます。
ここでは、各インジケーターを変数として宣言しています。

【変更前】

//--- 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」で指定された期間の最安値、最高値、中間値を計算しています。

IndicatorCounted関数は、インジケーターの確定値が計算されたバー(=現在のバー以外)の本数を取得します。

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バンドが表示されます。

 

まとめ

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

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

 

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

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

 

☆MQL言語入門まとめ☆

【保存版】MQL言語入門まとめ~EA自作への道~
せっかくMT4を使うなら、オリジナルのEAやインジケーターを自作してみませんか。「プログラミングなんて自分にはとても無理だ」と思うかもしれませんが、そんなことありません。最低限知っておくべきことさえ押さえておけば、簡単にできますから。

 

もし、あなたが本格的にMQL言語を使いこなしたいと考えているなら、以下の書籍がおすすめです。

FXメタトレーダー実践プログラミング (現代の錬金術師シリーズ)

もしあなたが、MT4をリアル口座で稼働しようと考えているなら、XMTradingがおすすめです。
XMは、海外FX業者の中で、日本人による口座開設数No.1、豊富な入出金方法、24時間対応の日本語サポートなどにより、日本人でも安心して利用できます。

XMの口座開設はこちらから

MT4でシストレ

●免責及び注意事項●
当サイトの全てのコンテンツは管理人自身による情報の提供を目的としており、決して投資行動を勧誘・助言するものではありません。
投資商品、売買価格決定等の投資行動につきましては、ご自身の判断と責任に基づいて行われるようお願いいたします。
また、個々の取引において生じたいかなる損失についても、本ブログサイトおよびその管理者は一切の責任を負いかねます。

Startup!

コメント

  1. TAS より:

    鈴木さん

    はじめまして。

    HiLoバンドの作成方法解説ありがとうございます。

    完成品のソースコードのURLが、BreakOut.mq4のEAになってしまっていたので、
    お手すきの際にHiLoバンドのmq4のリンクにして頂けましたら、幸いです。

    今後の記事も楽しみにしております。

    よろしくお願い致します。

  2. TASさん
    ご訪問ありがとうございます。
    さらにご指摘ありがとうございます。
    URLの間違い訂正しました。
    まだまだ勉強中で至らないことも多いと思いますが、よろしくお願いします。