インジケーターと呼べないほどの単純なものを作成して、MetaTrader4のカスタムインジケーター新規作成の手順を覚えよう!
ここでは、現在プライスと前回終値をつないだラインを表示させるだけのインジケーターを作成しながらその手順を解説します。
MT4の操作方法やメタエディタの使用方法に不安がある方は、【MT4自動売買入門】を参考にしてみてください。
新規カスタムインジケーター作成の流れ
さぁて、カスタムインジケーターの新規作成方法を解説するぞい
ワクワク♪
新規インジケーターファイルを作成
メタエディタのメニューで「表示(View)」→「Languages」→「Japanese」に設定します。
次の操作手順で、空のインジケーターファイルを新規作成します。
- 新規作成ボタンでMQLウィザードを開く
- カスタムインディケータにチェックして次へボタン
- 名前の「Indicators¥」の後にインジケーター名を入力
- 次へボタン→次へボタン→完了ボタン
これでメタエディタの画面には、新規に作成された空の(なにもしない)インジケーターの「mq4」ファイルのソースコードが表示されます。
//+------------------------------------------------------------------+ //| NewIndicator.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 //+------------------------------------------------------------------+ //| Custom indicator initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- indicator buffers mapping //--- 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[]) { //--- //--- return value of prev_calculated for next call return(rates_total); } //+------------------------------------------------------------------+
ヒィーーー
フォルダの形の既存のファイルを開くボタンまたは、メニューの「ファイル」→「開く」で表示されるウィンドウで、「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()関数の()括弧内は次のように指定します。
SetIndexBuffer(バッファインデックス, 配列名)
バッファインデックス
インジケーターバッファのインデックスを指定します。インデックスは0番から始まります。
配列名
グローバル領域に宣言したdouble型の配列の配列名を指定します。
SetIndexBuffer()関数で、グローバル領域に宣言した配列をインジケーターの表示用の配列に格上げします。
インジケーターバッファのインデックス番号は0番から始まりますので、色や太さを決めたときのindicator_color1やindicator_width1の「1」の箇所の数字より1つ小さくなることに注意しましょう。
描画タイプを決める
先ほど追加したコードの下に次のコードを追加します。
SetIndexStyle(0, DRAW_LINE);
インジケーターバッファ0番を、ラインで表示させる
SetIndexStyle()関数の()括弧内は次のように指定します。
SetIndexStyle(バッファインデックス, 描画タイプ, 以降省略)
バッファインデックス
インジケーターバッファのインデックスを指定します。インデックスは0番から始まります。
描画タイプ
描画タイプは次の6種類から選んで指定します。
ライン | DRAW_LINE |
---|---|
セクション | DRAW_SECTION |
ヒストグラム | DRAW_HISTOGRAM |
アロー(矢印) | DRAW_ARROW |
ZigZag | DRAW_ZIGZAG |
表示なし | DRAW_NONE |
以降省略
以降、描画スタイル・太さ・色を指定できますが、最初のチャート上表示時に色の設定タブでの設定が反映されなくなるので、省略することをおすすめします。
描画タイプは#propertyでも指定できます。
複数ライン描画する場合にfor()文とSetIndexStyle()関数でコード短縮できるのでSetIndexStyle()関数での描画タイプ指定がおすすめです。
現在プライスを格納していく
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]の点を結ぶ線が表示されることになります。
さらに時間経過とともに、インジケーターを実行させた時点から次々と終値を結んだカクカクしたラインが描画されていきます。
あとがき
いかがだったでしょうか?新規作成の流れや、インジケーターバッファについて理解できましたでしょうか?
次回は、インジケーターを実行させた時点より前のローソク足の終値もラインで結ぶ方法を解説します。
ではまた、次回をお楽しみに!