前日の高値・安値をチャートに水平線で表示するインジケーターを作成します。
この記事のコードは、`ObjectCreate`や`ObjectSet`といった
オブジェクト操作関数が古い書き方
(chart_id引数を省略した旧式のシグネチャ)で書かれています。
今のMQL4でもコンパイルは通りますが、非推奨(レガシー)扱いの関数のため、
将来のMT4ビルドで警告が出たり、
複数チャートを同時に扱う場面で挙動が不安定になるリスクがあります。
この記事では、現行の書き方に統一したコードを紹介します。
MetaEditorでの準備(新規作成とグローバル変数)
まず、カスタムインジケーターの新規作成と、前日の高値・安値を格納する変数の準備を行います。
メタエディタ(MetaEditor)を立ち上げる
メタエディタ(MetaEditor)を立ち上げましょう。
「ファイル」→「新規作成」→「カスタムインジケーター」の順に進み、
今回は名前を「HL-line」で作成します。
グローバル変数を記述する
グローバル変数を記述しましょう。
- 前日の高値を格納する変数:Yhigh
- 前日の安値を格納する変数:Ylow
の2つ用意しましょう。
double Yhigh;//前日高値の変数 double Ylow;//前日安値の変数
これでグローバル変数の記述は完了です。
OnDeinit関数でラインを削除する処理
次に、インジケーターを外したときにラインを消す後片付けの処理を書きます。
OnDeinit()関数を記述しましょう。
OnDeinit()関数を記述することでインジケーターを削除すると表示が消えます。
今回は高値のYhighlineと安値のYlowlineの
2本のラインを削除するように記述します。
ObjectDelete(0, "Yhighline");//Yhighlineを削除 ObjectDelete(0, "Ylowline");//Ylowlineを削除
ObjectDelete(name)という1引数だけの書き方も動きますが、
最初のチャートID(0を指定すれば現在のチャート)を明示する2引数版が現行の書き方です。
これでOnDeinit()関数の記述は完了です。
OnCalculate関数で水平線を描画する処理
ここからが本体です。
前日の高値・安値を取得し、水平線として描画する処理を順番に書いていきます。
前日の高値・安値を取得する
OnCalculate()関数を記述します。
Yhighには前日の高値の関数を格納します。Ylowには前日の安値の関数を格納します。
Yhigh = iHigh(NULL, PERIOD_D1, 1);//前日高値 Ylow = iLow(NULL, PERIOD_D1, 1);//前日安値
shiftを1にすることで「1つ前の確定した日足」、つまり前日のデータを取得しています。
週足以上では描写しないための判定
Period()とは時間足のことで、W1は週足という意味です。
週足以上の足を表示しないようにします。
if (Period() < PERIOD_W1)
ObjectDeleteでは過去の必要ではなくなった水平ラインを削除して初期化しています。
こうすることで、毎回同じ名前のオブジェクトが重複して残ることを防いでいます。
ObjectDelete(0, "Yhighline"); //前日高値ラインの初期化
ObjectCreateで水平線を描画する
ObjectCreateではラインの情報を記載します。
チャートID, オブジェクト名, オブジェクトタイプ,
ウィンドウ, 時間, 価格という順番です。
ObjectCreate(0, "Yhighline", OBJ_HLINE, 0, Time[0], Yhigh); //ObjectCreate(チャートID, オブジェクト名, オブジェクトタイプ, ウィンドウ, 時間, 価格);
ObjectSetIntegerで色とスタイルを設定する
色や線の種類は、ObjectSetInteger()で設定します。
元記事にあったObjectSet()も動きますが非推奨のため、こちらを使いましょう。
ObjectSetInteger(0, "Yhighline", OBJPROP_STYLE, STYLE_SOLID); ObjectSetInteger(0, "Yhighline", OBJPROP_COLOR, clrWhite);
高値と同様に安値も同じように記述します。
//前日安値ラインの描写 ObjectDelete(0, "Ylowline");//前日安値ラインの初期化 ObjectCreate(0, "Ylowline", OBJ_HLINE, 0, Time[0], Ylow); ObjectSetInteger(0, "Ylowline", OBJPROP_STYLE, STYLE_SOLID); ObjectSetInteger(0, "Ylowline", OBJPROP_COLOR, clrWhite);
これでOnCalculate()関数の記述は完了です。
Yhigh = iHigh(NULL, PERIOD_D1, 1);//前日高値
Ylow = iLow(NULL, PERIOD_D1, 1);//前日安値
if (Period() < PERIOD_W1)//週足か月足の場合は描写しない
{
//前日高値ラインの描写
ObjectDelete(0, "Yhighline"); //前日高値ラインの初期化
ObjectCreate(0, "Yhighline", OBJ_HLINE, 0, Time[0], Yhigh);
ObjectSetInteger(0, "Yhighline", OBJPROP_STYLE, STYLE_SOLID);
ObjectSetInteger(0, "Yhighline", OBJPROP_COLOR, clrWhite);
//前日安値ラインの描写
ObjectDelete(0, "Ylowline");//前日安値ラインの初期化
ObjectCreate(0, "Ylowline", OBJ_HLINE, 0, Time[0], Ylow);
ObjectSetInteger(0, "Ylowline", OBJPROP_STYLE, STYLE_SOLID);
ObjectSetInteger(0, "Ylowline", OBJPROP_COLOR, clrWhite);
}
コンパイルして動作を確認する手順
最後に、実際にコンパイルしてチャートへ適用し、動作を確認します。
・MetaEditorの「コンパイル」(Ctrl+F7)で成功を確認する
・チャートにドラッグ&ドロップして白いラインが2本表示されるか確認する
コンパイルしましょう。MetaEditorの「コンパイル」(Ctrl+F7)で
「0 error(s), 0 warning(s)」になることを確認します。
チャートにドラッグ&ドロップして白いラインが2本表示されていたら完成です。

前日高値・安値ラインを描画するコード全体(chart_id引数統一版)
HL-lineのソースコード全体は以下に記載してあります。
ObjectCreate/ObjectSet/ObjectDeleteをすべて
現行のchart_id引数付きシグネチャに統一済みです。
//+------------------------------------------------------------------+
//| HL-line.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
double Yhigh;//前日高値の変数
double Ylow;//前日安値の変数
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
ObjectDelete(0, "Yhighline");//Yhighlineを削除
ObjectDelete(0, "Ylowline");//Ylowlineを削除
}
//+------------------------------------------------------------------+
//| 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[])
{
Yhigh = iHigh(NULL, PERIOD_D1, 1);//前日高値
Ylow = iLow(NULL, PERIOD_D1, 1);//前日安値
if(Period() < PERIOD_W1)//週足か月足の場合は描写しない
{
//前日高値ラインの描写
ObjectDelete(0, "Yhighline"); //前日高値ラインの初期化
ObjectCreate(0, "Yhighline", OBJ_HLINE, 0, Time[0], Yhigh);
ObjectSetInteger(0, "Yhighline", OBJPROP_STYLE, STYLE_SOLID);
ObjectSetInteger(0, "Yhighline", OBJPROP_COLOR, clrWhite);
//前日安値ラインの描写
ObjectDelete(0, "Ylowline");//前日安値ラインの初期化
ObjectCreate(0, "Ylowline", OBJ_HLINE, 0, Time[0], Ylow);
ObjectSetInteger(0, "Ylowline", OBJPROP_STYLE, STYLE_SOLID);
ObjectSetInteger(0, "Ylowline", OBJPROP_COLOR, clrWhite);
}
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
あわせて読みたい: 【MQL】チャート上にスプレッドを表示するインジケーター【初級編】
【MQL】前日の高値・安値を表示するインジケーター【初級編】:まとめ
前日の高値・安値を水平線で表示するインジケーターの作り方を、
現行のオブジェクト関数シグネチャに統一したコードとあわせて紹介しました。
コメント