MQLプログラミングによく使う時間についてまとめて勉強しておきます。
時間の定義
データ型定義
まずはデータ型のDatetimeを思い出します。
Datetime型の定義
datetime d1 = D'2014.01.01 12:00:01';
StrToTime()文字列で変換
作成した文字列で時間変数を定義する方法です。
(本によるとStringConcatenateが+演算よりパフォーマンス早いとのことです。
改めて検証したいと思います。)
string d2 = "2014.11.18 " + "01:21:04"; string d3 = StringConcatenate(y, ".", m, ".", d, " ", h, ":", min, ":", s); StrToTime(d3);
表示
TimeToStr()関数
datetime型はそのままMessageBoxとPrintなど出すと、分かりにくい整数です。
システムで取得したdatetime型変数と自分で定義した変数同様です。
datetime d1 = D'2014.11.18 01:21:04'; MessageBox(OrderCloseTime()); MessageBox(d1);
datetime d1 = D'2014.11.18 01:21:04'; MessageBox(TimeToStr(d1)); MessageBox(TimeToStr(OrderCloseTime()));
年月日と時分秒の取得
現在時間 | 指定時間 TimeXxx(datetime型指定時間) | |
Year() | TimeYear(datetime) | 年 |
Month() | TimeMonth(datetime) | 月 |
Day() | TimeDay(datetime) | 月の日付 |
DayOfWeek() | TimeDayOfWeek(datetime) | 曜日。0…6=日…土 |
DayOfYear() | TimeDayOfYear(datetime) | 年初からの日数 |
Hour() | TimeHour(datetime) | 時 |
Minute() | TimeMinute(datetime) | 分 |
Seconds() | TimeSeconds(datetime) | 秒 |
計算と比較
マクロ定義で時間計算をスムーズに
現在から1時間後とか4時間前とかを計算するとき、
datetime型変数に秒数を足し算引き算すればいいです。
でも毎回1時間が何秒であるかを計算するのか面倒です。
予めよく使う時間をマクロを定義したほうがお勧めです。
後からコードを見直すときも分かりやすいです。
#define SEC_H1 3600 #define SEC_H4 14400 #define SEC_D1 86400
DayOfWeek()で取得した曜日も分かりにくいなら、マクロ定義できます。
#define SUNDAY 0 #define MONDAY 1 #define TUESDAY 2 #define WEDNESDAY 3 #define THURSDAY 4 #define FRIDAY 5 #define SATURDAY 6
計算と比較
計算と比較が簡単に整数感覚ですればいいです。
見出しを「計算と比較」と掲げて実際に書くことがないです。
マクロの定義で計算コードを書きやすくすることが覚えておいたほうが大事です。
時間が取得できる関数
システム時間
常用関数の記事で勉強した各種時間の中に使えそうのが下記四つです。
datetime TimeCurrent([MqlDateTime]) | 最後の取得したサーバ時刻 |
datetime TimeTradeServer([MqlDateTime]) | 取引サーバの時刻 |
datetime TimeLocal([MqlDateTime]) | パソコン時間 |
datetime TimeGMT([MqlDateTime]) | GMT時刻 |
取引情報の時間
OrderSelect()関数でオーダーを選択後、オーダーの時間情報が照会できます。
戻り値 | 関数名 | 意味 | 説明 |
---|---|---|---|
datetime | OrderOpenTime() | 注文時間 | |
datatime | OrderCloseTime() | 決済時間 | 未決済は0 |
datetime | OrderExpiration() | 有効期限 | 指値・逆指値だけ |
iTime()でチャート上のバーとテクニカル指標の時間を取得
チャートのバーもテクニカル指標も、時間のフレームとシフトで取得しているので、
同じフレームとシフトでバーとテクニカルの時間を取得できます。
(取得しても整数型なので、表示するにはTimeToStr()が必要ですね)
iTime(string 通貨ペア, int 時間枠, int シフト);
例:
// ドル円の1時間チャートの4本前のローソクの開始時間(時間の近い順で5本目) iTime("USDJPY", PERIOD_H1, 4);
時間構造体 MqlDateTime
定義と初期化
定義:
MqlDateTime time1;
注意:構造体時間の初期化
定義直後の構造体変数は値がなく、年メンバーに初期値を渡してから使えます。
初期値で年だけを渡す場合、他のメンバー変数がその年最大になります。
でも、この値が危険なので、システムで取得した時間で初期化しないといけません。
(なんで危険だというと、この値のday_of_yearも最大で、262796568です。。。)
time1.year = 2014; // yearを初期化したので、'2014.12.31 23.59'になります。
メンバー変数
- year:年
- mon:月
- day:日
- hour:時
- min:分
- sec:秒
- day_of_week:曜日、0が日曜日
- day_of_year:年の日数
構造体時間の関数
システム時間関数
C++の参照引数のように、初期化したい構造体を渡せば、時間がこの構造体に入ります。
MqlDateTime date1; TimeCurrent(date1);
構造体時間とdatetime型の変換
datetime型 => 構造体
MqlDateTime TimeToStruct(datetime)
構造体 => datetime型
datetime StructToTime(MqlDateTime)