「記事通りにコードをコピペしてコンパイルできたのに、

チャートに何も表示されない」——

ローソク足情報インジケーターでよくあるつまずきです。

原因の多くは、インジケーターなのにスクリプト用の関数を使ってしまっていることにあります。

この記事では、

ローソク足の始値・高値・安値・終値を取得してチャート上に表示するインジケーターの作り方を、

実際にMetaEditorでコンパイルして動作する形で解説します。

ローソク足の始値・高値・安値・終値を取得して表示するインジケーター

今回はローソク足の情報を取得して表示するインジケーターを作成していきます。

具体的には、以下の4つの値を1つのインジケーターで同時に表示します。

  • 現在の始値
  • 1つ前の足の高値
  • 1時間足の現在の安値
  • ドル円現在の終値

MetaEditorでカスタムインジケーターを新規作成する手順

まず、MetaEditorでインジケーターの土台となるファイルを作成します。

メタエディタ(MetaEditor)を立ち上げましょう。操作は以下に記載しています。

【MQL】カスタムインジケーターを作成の流れについてわかりやすく説明してみた

今回は名前を「Candle-info」で作成します。

ウィザードでは「Custom Indicator」を選び、

`#property indicator_chart_window`

(チャートウィンドウにサブウィンドウを作らず直接表示するモード)を指定して進めてください。

OnStart()ではなくOnCalculate()に記述する理由

ここが、このインジケーターを自作する際に最もつまずきやすいポイントです。

スクリプト用の関数とインジケーター用の関数の違いを順番に確認していきます。

スクリプト専用のOnStart()をインジケーターで使ってはいけない理由

注意

元記事はOnStart()関数に記述する形で紹介されていましたが、

OnStart()はスクリプト専用の関数であり、

カスタムインジケーターでは呼び出されません。

インジケーターでは、

価格データが更新されるたびに呼ばれる

OnCalculate()関数に処理を書く必要があります。

始値・高値・安値・終値を格納する変数を用意する

まず、最初にローソク足それぞれの値を格納する変数を作成します。

double open,high,low,close;//それぞれの変数

iOpen・iHigh・iLow・iCloseで値を取得してCommentで表示する

そしてそれぞれの変数にローソク足の関数情報を格納します。

ローソク足の関数については以下の記事を参照してください。

【MQL】ローソク足のレートを取得する関数『iOpen・iClose・iHigh・iLow』についてわかりやすく説明してみた
open = iOpen(NULL,0,0);//現在の始値
high = iHigh(NULL,0,1);//一つ前の足の高値
low = iLow(NULL,PERIOD_H1,0);//1時間足の現在の安値
close = iClose("USDJPY",0,0);//ドル円現在の終値

格納した情報をコメントで表示させましょう。

Comment("現在の始値 = ",open,
        "\n一つ前の足の高値 = ",high,
        "\n1時間足の現在の安値 = ",low,
        "\nドル円の現在の終値 = ",close);

これでOnCalculate()関数の記述は完了です。

double open,high,low,close;//それぞれの変数

open = iOpen(NULL,0,0);//現在の始値
high = iHigh(NULL,0,1);//一つ前の足の高値
low = iLow(NULL,PERIOD_H1,0);//1時間足の現在の安値
close = iClose("USDJPY",0,0);//ドル円現在の終値

Comment("現在の始値 = ",open,
        "\n一つ前の足の高値 = ",high,
        "\n1時間足の現在の安値 = ",low,
        "\nドル円の現在の終値 = ",close);

OnDeinit()でインジケーター削除時にコメントを消す

最後に、インジケーターをチャートから外したときの後始末を記述します。

OnDeinit()関数の記述をしましょう。

今回はCommentを活用するので削除する際もCommentを活用します。

これでOnDeinit()関数の記述は完了です。

Comment("");//チャート削除後非表示

Candle-infoの動くソースコード全体

Candle-infoのソースコード全体は以下に記載しています。

//+------------------------------------------------------------------+
//|                                                  Candle-info.mq4 |
//|                     Copyright 2020, FX-EA System Project Creator |
//|                        https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, FX-EA System Project Creator"
#property link      "https://creator.fx-ea-system-project.com/"
#property version   "1.01"
#property strict
#property indicator_chart_window
//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- indicator buffers mapping

//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");//チャート削除後非表示
  }
//+------------------------------------------------------------------+
//| 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[])
  {
//---
   double o,h,l,c;//それぞれの変数

   o = iOpen(NULL,0,0);//現在の始値
   h = iHigh(NULL,0,1);//一つ前の足の高値
   l = iLow(NULL,PERIOD_H1,0);//1時間足の現在の安値
   c = iClose("USDJPY",0,0);//ドル円現在の終値

   //表示
   Comment("現在の始値 = ",o,
           "\n一つ前の足の高値 = ",h,
           "\n1時間足の現在の安値 = ",l,
           "\nドル円の現在の終値 = ",c);

//--- return value of prev_calculated for next call
   return(rates_total);
  }
//+------------------------------------------------------------------+
補足

元記事のコードは変数名が

OnCalculate()の引数名(open/high/low/close)と

衝突していたため、

o/h/l/cに変更しています。

MQL4では関数の引数と同じ名前のローカル変数を宣言するとコンパイルエラーになるため、

この点も合わせて確認してください。

コンパイルしてチャートに表示されるか確認する

最後に実際にコンパイルし、チャート上に情報が表示されるかを確認します。

コンパイルしましょう。以下の画像のようにチャート上に情報が表示されていたら完成です。

MQL インジケーター作成 ローソク足の情報表示

あわせて読みたい: 【MQL】チャート上にスプレッドを表示するインジケーター【初級編】

あわせて読みたい: 【MQL】前日の高値・安値を表示するインジケーター【初級編】

【MQL】ローソク足の情報を取得して表示するインジケーター【初級編】:まとめ

ローソク足の情報を表示させることができましたね!!

情報表示させるインジケーターはだいぶ慣れてきたと思います!!

関連記事