[MQL]最新ロウソク足より右にオブジェクトを描画する場合の時刻(座標)指定方法

MT4のインジケータを作成していると、最新のロウソク足よりも右、つまり少し未来の位置にオブジェクトを表示したい場合があります。

でもどうやってその位置を指定したらいいんだろう?ちょっと困りますよね(私は以前に困った経験があります)。

この記事では、MQLで最新のローソク足よりも右側の時刻(座標)を取得・指定する方法を説明します。

分かりやすいように現在のロウソクより左の場合と右の場合に分けて説明します。

最新ロウソク足より左に表示する方法

最新のロウソク足よりも左(過去側)の時刻を指定する場合はシンプルにTime[]配列またはiTime()関数を使って時刻を取得します。

例として最新のロウソク足より5本過去の位置に垂直線を作成するコードを下に示します。

左に垂直線

Time[]配列を使用する場合

// 5本(左:過去側へ)
int n = 5;
// 最新ロウソク足のn(=5)本前の時刻を取得
datetime time = Time[n];
// 5本前の時刻に垂直線を作成
ObjectCreate(0, "test_left1", OBJ_VLINE, 0, time, 0);

iTime()関数を使用する場合

// 5本(左過去側へ)
int n = 5;
// 最新ロウソク足のn(=5)本前の時刻を取得
datetime time = iTime(NULL, 0, n);
// 5本前の時刻に垂直線を作成
ObjectCreate(0, "test_left2", OBJ_VLINE, 0, time, 0);

最新のロウソク足より左(過去側)にオブジェクトを表示するのは、Time[]iTime()を使えばすんなりいけますね。

では次に最新のロウソク足より右(未来側)に表示する方法を説明します。

最新ロウソク足より右に表示する方法

現在のロウソク足よりも右(未来側)の時刻を指定する場合には、最新ロウソク足の時刻に希望のバー本数分の時間を加えて(未来の)時刻を算出します。

例として最新のロウソク足より5本未来の位置に垂直線を引くコードを下に示します。

右に垂直線

// 5本(右:未来側へ)
int n = 5;
// 最新バーのn(=5)本未来の時刻を取得
datetime time = Time[0] + ChartPeriod(0) * 60 * n;
// 5本分未来の時刻に垂直線を作成
ObjectCreate(0, "test_right", OBJ_VLINE, 0, time, 0);

2行目がポイントです。2行目で使用しているChartPeriod()はチャートのタイムフレームを取得する関数です。

ChartPeriod()は、チャートのタイムフレームを分単位の数値で返します。例えば1分足チャートなら1、1時間足チャートなら60、日足チャートなら1440を返します。

2行目でやっていることを分解すると以下の意味になります。

  1. 最新ロウソク足の時刻をTime[0]で取得(①)
  2. ChartPeriod()で取得した値(分)に60を掛けてローソク足1本の秒数を算出(②)
  3. ②にnをかけることでロウソク足n本分の秒数を計算(③)
  4. ①に③を加えることで、最新バーからn本右(未来)の時刻を算出

要するに、最新のローソク足の時刻に、ローソク足N本分の時間を足すことで未来の座標を指定するというわけです。

必要な関数とやり方さえ分かれば単純な話ですね。

このコードを使ったインジケーターのサンプルを作りました。インジを組む時の具体例として参考になるのではないかと思います。下の記事にコードを載せてありますのでどうぞ。

サンプルスクリプト

上で説明した3種類の方法をスクリプトにしたサンプルを全文載せておきます。このスクリプトをチャートに適用すると、最新バーの右または左に垂直線が描画されます。

最新バーの左に垂直線 Time[]を使用

最新バーの5本左に垂直線を引くスクリプトです。Time[]配列を使っています。


//+------------------------------------------------------------------+
//|                                                        left1.mq4 |
//|                                                     minagachi fx |
//|                                            https://minagachi.com |
//+------------------------------------------------------------------+
#property copyright "minagachi fx"
#property link      "https://minagachi.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   // 5本(左:過去側へ)
   int n = 5;
   // 最新ロウソク足のn(=5)本前の時刻を取得
   datetime time = Time[n];
   // 5本前の時刻に垂直線を作成
   ObjectCreate(0, "test_left1", OBJ_VLINE, 0, time, 0);
}

最新バーの左に垂直線 iTime()を使用

これも最新バーの5本左に垂直線を引くスクリプトです。今度はiTime()関数を使っています。


//+------------------------------------------------------------------+
//|                                                        left2.mq4 |
//|                                                     minagachi fx |
//|                                            https://minagachi.com |
//+------------------------------------------------------------------+
#property copyright "minagachi fx"
#property link      "https://minagachi.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   // 5本(左過去側へ)
   int n = 5;
   // 最新ロウソク足のn(=5)本前の時刻を取得
   datetime time = iTime(NULL, 0, n);
   // 5本前の時刻に垂直線を作成
   ObjectCreate(0, "test_left2", OBJ_VLINE, 0, time, 0);
}

最新バーの右に垂直線

最新バーの5本右に垂直線を引くスクリプトです。


//+------------------------------------------------------------------+
//|                                                        right.mq4 |
//|                                                     minagachi fx |
//|                                            https://minagachi.com |
//+------------------------------------------------------------------+
#property copyright "minagachi fx"
#property link      "https://minagachi.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
{
   // 5本(右:未来側へ)
   int n = 5;
   // 最新バーのn(=5)本未来の時刻を取得
   datetime time = Time[0] + ChartPeriod(0) * 60 * n;
   // 5本分未来の時刻に垂直線を作成
   ObjectCreate(0, "test_right", OBJ_VLINE, 0, time, 0);
}

まとめ

最新のローソク足よりも右の時刻(座標)を取得する方法を説明しました。

MQLには便利な関数が多く用意されています。それらの関数を組み合わせることで、大抵の機能は実装することができます。

時間があるときにMQLのリファレンスをざっと見てみると意外と使える関数が見つかるかもしれませんよ。

コメント

この記事へのコメント(0 件)