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

カスタムインジケーター

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

 

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

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

 

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

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

 

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

 

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

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

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

【変更前】

//--- 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]を計算します。

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バンドチャート

 

まとめ

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

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

 

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

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

 

次回は、今回作った「HiLoバンド」が出すサインを利用して、ブレイクアウト戦略のEAを作ってみます。

MQL言語入門|カスタムインジケーターをEA化する超簡単な方法|ブレイクアウト戦略
カスタムインジケーター「HiLoBand.mq4」を使って、ブレイクアウト戦略をEA化する方法を解説します。完成品のダウンロードもできます。いつもどおりの超簡単な自作方法です。この記事を通じて、カスタムインジケーターをEA化する方法を理解してください。。

 

もっと本格的にMQL言語を使いこなしたいなら、この書籍がおすすめです。私もこの本で勉強しました。

FXメタトレーダー入門―最先端システムトレードソフト使いこなし術 (現代の錬金術師シリーズ 56)


おすすめFX業者とVPSサービス

もしあなたがMT4のリアル口座を検討中なら『XM』がおすすめです。『XM』は、豊富な入出金方法、24時間日本語サポート、レバレッジ888倍、お得なボーナスなどで、日本人の口座開設数No.1の海外FX業者です。スマホ・PC・Macすべて同じMT4口座で取引できます。


もしあなたがMT4をVPS稼働しようとお考えなら、このMT4専用VPSがおすすめです。初期費用0円なので気楽に試してみませんか♪

MQL言語入門

●免責及び注意事項●
当サイトの全てのコンテンツは管理人自身による情報の提供を目的としており、投資行動を勧誘・助言するものではありません。
当サイトに掲載している全ての情報について、その正確性、完全性、有用性等について保証するものではありません。
個々の取引において生じたいかなる損失について、当サイトの管理人は一切の責任を負いかねます。
取引にあたっては、FXという金融商品のリスクを十分に理解した上で、ご自身の判断と責任でなさるようお願いいたします。
当サイトの記載内容は、予告なしに変更することがあります。

Startup!

コメント

  1. TAS より:

    鈴木さん

    はじめまして。

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

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

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

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

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

  3. たろたろ より:

    はじめまして。
    上記のコード通り打ったところ安値のラインしか表示されません。
    文のみですと説明しづらいため、画像を載せて説明したいので個人メールに飛んで頂けると幸いです。
    よろしくお願いします。

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