「記事通りにコードをコピペしてコンパイルできたのに、チャートに何も表示されない」——ローソク足情報インジケーターでよくあるつまずきです。原因の多くは、インジケーターなのにスクリプト用の関数を使ってしまっていることにあります。

この記事では、ローソク足の始値・高値・安値・終値を取得してチャート上に表示するインジケーターの作り方を、実際にMetaEditorでコンパイルして動作する形で解説します。

ローソク足の情報を取得して表示するインジケーター

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

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

メタエディタ(MetaEditor)を立ち上げる

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

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

今回は名前を「Candle-info」で作成します。ウィザードでは「Custom Indicator」を選び、`#property indicator_chart_window`(チャートウィンドウにサブウィンドウを作らず直接表示するモード)を指定して進めてください。

OnCalculate()関数に記述する

元記事はOnStart()関数に記述する形で紹介されていましたが、OnStart()はスクリプト専用の関数であり、カスタムインジケーターでは呼び出されません。インジケーターでは、価格データが更新されるたびに呼ばれるOnCalculate()関数に処理を書く必要があります。

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

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

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

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

【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);
Copy

OnDeinit()関数の記述をする

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

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

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

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

ソースコード全体

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);
  }
//+------------------------------------------------------------------+
Copy

元記事のコードは変数名がOnCalculate()の引数名(open/high/low/close)と衝突していたため、o/h/l/cに変更しています。MQL4では関数の引数と同じ名前のローカル変数を宣言するとコンパイルエラーになるため、この点も合わせて確認してください。

コンパイルする

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

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

まとめ

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

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

関連記事