「記事通りにコードをコピペしてコンパイルできたのに、チャートに何も表示されない」——ローソク足情報インジケーターでよくあるつまずきです。原因の多くは、インジケーターなのにスクリプト用の関数を使ってしまっていることにあります。
この記事では、ローソク足の始値・高値・安値・終値を取得してチャート上に表示するインジケーターの作り方を、実際にMetaEditorでコンパイルして動作する形で解説します。
ローソク足の情報を取得して表示するインジケーター
今回はローソク足の情報を取得して表示するインジケーターを作成していきます。
- 現在の始値
- 1つ前の足の高値
- 1時間足の現在の安値
- ドル円現在の終値
メタエディタ(MetaEditor)を立ち上げる
メタエディタ(MetaEditor)を立ち上げましょう。操作は以下に記載しています。

今回は名前を「Candle-info」で作成します。ウィザードでは「Custom Indicator」を選び、`#property indicator_chart_window`(チャートウィンドウにサブウィンドウを作らず直接表示するモード)を指定して進めてください。
OnCalculate()関数に記述する
元記事はOnStart()関数に記述する形で紹介されていましたが、OnStart()はスクリプト専用の関数であり、カスタムインジケーターでは呼び出されません。インジケーターでは、価格データが更新されるたびに呼ばれる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);
これで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.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では関数の引数と同じ名前のローカル変数を宣言するとコンパイルエラーになるため、この点も合わせて確認してください。
コンパイルする
コンパイルしましょう。以下の画像のようにチャート上に情報が表示されていたら完成です。

まとめ
ローソク足の情報を表示させることができましたね!!
情報表示させるインジケーターはだいぶ慣れてきたと思います!!
コメント