インジケーター作成その1【新規作成の流れ】

インジケーター作成その1【新規作成の流れ】

さてはじまりました!
MetaTrader4のカスタムインジケーター作成方法について、シリーズで記事にしていきたいと思います。
初心者の方にも分かるようにシンプルにしていきます。

第一回目の内容は、「インジケーターと呼べないほどの単純なものをカスタムインジケーターファイルとして作成して、カスタムインジケーター新規作成の流れを覚えよう!」です。

具体的には、現在プライスと前回終値をつないだラインを表示させるだけのインジケーターを作成します。

目次

新規ファイルを作成する

メタエディタのメニュー「表示(View)」→「Languages」→「Japanese」に設定します。

メタエディタの「新規作成」ボタンでMQLウィザードを開きます。
 ↓
「カスタムインディケータ」にチェックして「次へ」ボタンを押します。
 ↓
「名前」の「Indicators¥」の後に作成するインジケーター名を入力します。
 ↓
「次へ」ボタン→「次へ」ボタン→「完了」ボタンとクリックしていきます。

これでメタエディタの画面には、新規に作成された空の(なにもしない)インジケーターの「mq4」ファイルのソースコードが表示されます。

フォルダの形のボタンまたは、メニューの「ファイル」→「開く」で「MQL4」フォルダの「Indicators」フォルダ内を見ると、作成したインジケーターが保存されています。

ラインの本数を定義する

「#property」から始まる数行の下に次のコードを追加します。

#property indicator_buffers 1

「#property」で始まる行は、そのインジケーターの特徴や性質を定義したりします。

上記のコードを追加すると、「表示するのは1つです」という定義をしたことになります。今回の場合、「ラインは1本です」という感じです。

ラインの色と太さを決める

先ほど追加したコードの下に次のコードを追加します。

#property indicator_color1 clrRed
#property indicator_width1 2

「1つ目の(ラインの)色は赤色で太さ2です」と定義します。

この定義は「初期設定として」ということで、実際使用する際にはインジケーターのプロパティ設定ダイアログの「色の設定」タブで自由に変更できます。

ラインの値を格納する配列を宣言

先ほど追加したコードの下に次のコードを追加します。

double buf[];

double型の配列「buf」を宣言します。

この「buf」という配列に、ラインの値を入れていくことになります。

ここで宣言する配列名は自由に決めてOKです。「line」とか「buffer_0」とか、開発を進めていく上で分かりやすい配列名にするとよいです。

インジケーター用に割り当てる

OnInit()関数内に次のコードを追加します。

   SetIndexBuffer(0, buf);

インジケーターバッファ0番に、配列「buf」を割り当てます。

SetIndexBuffer(インデックス番号, double型配列) で、グローバル領域に宣言したdouble型の配列をインジケーターの表示用の配列に格上げします。

インジケーターバッファのインデックス番号は0番から始まります。色や太さを決めたときの数字よりマイナス1になることに注意してください。

描画スタイルを決める

先ほど追加したコードの下に次のコードを追加します。

   SetIndexStyle(0, DRAW_LINE);

「インジケーターバッファのインデックス0番は、ラインです」と定義します。

ラインの他に、ヒストグラムや矢印などが定義できます。

現在プライスを格納していく

OnCalculate()関数内に次のコードを追加します。

   buf[0] = Close[0];

Close[0]とは、ローソク足0本前(現在)の終値、すなわち現在プライスです。
その値を、buf[0]に代入します。

buf[0]とは、今回ではローソク足0本前のラインの値ということになります。

コードの確認とコンパイル

完成したインジケーターのコードは下記のようになります。

//+------------------------------------------------------------------+
//|                                          Sample_Indicator_01.mq4 |
//|                                                      Dr.EA Keiji |
//|                                 https://www.dr-ea.com/meta-blog/ |
//+------------------------------------------------------------------+
#property copyright "Dr.EA Keiji"
#property link      "https://www.dr-ea.com/meta-blog/"
#property version   "1.00"
#property strict
#property indicator_chart_window
#property indicator_buffers 1          // インジケーターバッファ 1つ
#property indicator_color1 clrRed       // 1つ目の色 赤色
#property indicator_width1 2            // 1つ目の太さ 2

double buf[];                           // ライン用の配列を宣言

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping
   SetIndexBuffer(0, buf);              // 配列「buf」をインジケーター用に割り当てる
   SetIndexStyle(0, DRAW_LINE);         // 描画スタイルをラインと定義
//---
   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[])
  {
//---
   buf[0] = Close[0];                   // 現在プライスを代入
//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+

→Sample_Indicator_01.mq4をダウンロード

「コンパイル」ボタンをクリックして、エラーがなければ完成です。

表示・動作確認

MT4画面で、今回作成したインジケーターを1分足またはテスターで表示させ動作を確認してみましょう。

・・・、最初は何も表示されません。。。

0本前のローソク足のラインの値は、buf[0]
1本前のローソク足のラインの値は、buf[1]
2本前のローソク足のラインの値は、buf[2]
...
と並んでいます。

buf[0]には現在プライスが格納されていますが、buf[1]には何も入っていないため、線ではなく点の状態で始まります。

現在のローソク足が終わり、次のローソク足が出現したタイミングで、前回終値と現在プライスを結ぶ直線が表示されます。

このローソク足増加のタイミングでは、先ほどまでbuf[0]だったものが、buf[1]になって新たにbuf[0]が生成されます。

なので、buf[1]の点とbuf[0]の点を結ぶ線が表示されることになります。

さらに時間経過とともに、インジケーターを実行させた時点から次々と終値を結んだカクカクしたラインが描画されていくのが確認できると思います。

まとめ

いかがだったでしょうか?
新規作成の流れや、インジケーターバッファの挙動などを理解できましたでしょうか?

次回は、インジケーターを実行させた時点より前のローソク足の終値もラインで結ぶ方法を解説したいと思います。

ではまた、次回をお楽しみに!

コメントを投稿する

(初めてのコメントの時は、コメントが表示されるためにこのブログのオーナーの承認が必要になることがあります。承認されるまでコメントは表示されませんのでしばらくお待ちください)






画像の中に見える文字を入力してください。

Captchaの認証で入力ミスがありますと、コメントが消えてしまいますのでご注意ください。
コメント欄に(X)HTMLタグやMTタグを記述される場合、「<」は「&lt;」、「>」は「&gt;」と入力してください。