DayOfWeek()やHour()といった時刻関数の書式を調べても、実際に組み合わせてどう使うのか分からない——という人向けの記事です。

この記事では、各時刻関数の説明に加えて、実際にMetaEditorでコンパイルしてチャート上に現在時刻を表示できるサンプルコードを紹介します。

時刻関数

今回は日付と時間を扱う時刻の関数系をご紹介したいと思います。

DayOfWeek()

DayOfWeekは、現在の曜日の関数になります。0から始まる点に注意してください(1からではありません)。

int DayOfWeek();//0:日曜日、1:月曜日、2:火曜日、3:水曜日、4:木曜日、5:金曜日、6:土曜日

Year()

Year()は現在の年の関数になります。

int Year();

Month()

int Month();

Day()

Day()は現在の日の関数になります。

int Day();

Hour()

Hour()は現在の時間の関数になります。

int Hour();

Minute()

Minute()は現在の分数の関数になります。

int Minute();

Seconds()

Seconds()の現在の秒数の関数になります。

int Seconds();

TimeCurrent()

TimeCurrent() は現在のサーバーの時刻です。

  • OnTick()で呼び出し:tick受信した時間を返す
  • OnInit()関数, OnDeinit()関数, OnTimer()関数:クォート受信時間を返す
datetime TimeCurrent();

TimeLocal()

TimeLocal()は実行しているコンピュータのローカル時間を返します。

datetime TimeLocal();

時刻関数を組み合わせてチャートに現在時刻を表示する

ここまでの関数を組み合わせて、サーバー時刻をチャート左上に1秒ごとに表示するインジケーターを作ってみましょう。

//+------------------------------------------------------------------+
//|                                                 TimeLabel.mq4    |
//+------------------------------------------------------------------+
#property strict
#property indicator_chart_window

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   EventSetTimer(1);//1秒ごとにOnTimer()を呼び出す
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Custom indicator deinitialization function                       |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   EventKillTimer();
   ObjectDelete(0, "TimeLabel");
  }

//+------------------------------------------------------------------+
//| Timer function                                                   |
//+------------------------------------------------------------------+
void OnTimer()
  {
   string text = StringFormat("%04d/%02d/%02d %02d:%02d:%02d (曜日:%d)",
                               Year(), Month(), Day(), Hour(), Minute(), Seconds(), DayOfWeek());

   if(ObjectFind(0, "TimeLabel") < 0)
     {
      ObjectCreate(0, "TimeLabel", OBJ_LABEL, 0, 0, 0);
      ObjectSetInteger(0, "TimeLabel", OBJPROP_CORNER, CORNER_LEFT_UPPER);
      ObjectSetInteger(0, "TimeLabel", OBJPROP_XDISTANCE, 10);
      ObjectSetInteger(0, "TimeLabel", OBJPROP_YDISTANCE, 20);
     }
   ObjectSetString(0, "TimeLabel", OBJPROP_TEXT, text);
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
int start()
  {
   return(0);
  }
//+------------------------------------------------------------------+
Copy

ポイントはEventSetTimer(1)OnTimer()の組み合わせです。OnTick()は新しいティックが来ないと呼ばれませんが、EventSetTimer()で登録した秒数ごとにOnTimer()が呼ばれるため、値動きがない時間帯でも時刻表示を更新し続けられます。OnDeinit()で必ずEventKillTimer()を呼んでタイマーを解除し、表示していたラベルも削除しておきましょう。

まとめ

今回は時刻関数についてご紹介しました。これらの関数を活用することで、

インジケーターやEAなどを時間制御することが可能になります。

関連記事