English

MQL5の書き方(for MQL4デザイナー)

 

時間の取り扱い

構造体を使用した時間の扱い

この記事ではMqlDateTime構造体を利用した時間の取得方法を解説します。

 

MQL5にない関数

EAの作成・開発に時間は非常に重要な要素のひとつです。
MQL4には時間を取得する方法が、サーバー時間を戻す関数を利用する方法、関数にdatetime型の値を渡し取得する方法、そしてMqlDateTime構造体を利用する方法と大きく3種類ありました。
MQL4デザイナーの多くは関数を使用して時間を取得しています。
しかし、MQL5には時間関連の関数がなくなりました。
時間を取得するにはMqlDateTime構造体を利用します。

 

MQL5になくなった時間関連のMQL4の関数一覧

サーバー時間を取得する関数

int Day()
int DayOfWeek()
int DayOfYear()
int Hour()
int Minute()
int Month()
int Seconds()
int Year()
                            

datetime型で指定した時間を取得する関数

int TimeDay(datetime date)
int TimeDayOfWeek(datetime date)
int TimeDayOfYear(datetime date)
int TimeHour(datetime time)
int TimeMinute(datetime time)
int TimeMonth(datetime time)
int TimeSeconds(datetime time)
int TimeYear(datetime time)
                                

 

MqlDateTime構造体

MqlDateTime構造体を確認します。
この構造体は定義済みで、9個のメンバーを持ちます。

struct MqlDateTime{
    int year;         
    int mon;           
    int day;           
    int hour;           
    int min;           
    int sec;           
    int day_of_week;   
    int day_of_year;   
};
                    

 

MqlDateTimeを使用した時間の取得例

それでは実際の使用例を紹介します。

void OnTick(){
    MqlDateTime Now; 
    TimeToStruct(TimeCurrent(),Now);
    Print("Hour: ",Now.hour);
}
                    

解説)

 

MqlDateTime Now;

Nowを宣言します。宣言後はNow.hourやNow.minといったメンバーを使用できます。
宣言時点ではNow.hourなどすべてのメンバーに値は入っていません。

 

TimeToStruct(TimeCurrent(),Now);

TimeToStruct()はdatetime型の時間をMqlDateTime型に代入します。
ここではNowに現在のサーバー時間TimeCurrent()の値を入れています。
Now.hourやNow.minなどすべてのメンバーにサーバー時間が入りました。

Print("Hour: ",Now.hour);
確認のため現在の時間をエキスパートに出力しています。

 

datetime型の関数

MQL5にはdatetime型を返す4つの関数があります。
datetime型は1970年1月1日0時からの経過した秒を整数で格納します。

datetime型の関数

TimeCurrent() 最後に受信したサーバー時間
TimeTradeServer() サーバー時間(PCの時間に依存)
TimeLocal() PCのローカル時間
TimeGMT() PCのローカル時間を返します。DSTを考慮します。

 

TimeToStruct()関数の省略

また、上記関数はTimeToStruct()を使わずに直接MqlDateTime型構造体に値を入れることができます。
先程の使用例を直接入れた場合以下のようになります。

void OnTick(){
    MqlDateTime Now;
    TimeCurrent(Now);
    Print("Hour: ",Now.hour);
}
                    

TimeToStruct(TimeCurrent(),Now); は TimeCurrent(Now); としても同じ結果になります。

MqlDateTime構造体は現在のBUILDのMQL4で使用できますので、
常にMqlDateTime構造体を利用することで、MQL4、MQL5の共通化が図れます。

 

執筆者
林貴晴

林 貴晴(AMSER株式会社代表取締役)

内資系薬品会社で約10年勤務の後、
外資系製薬会社(現IQVIA及びGSK)で合計約10年を勤務
その後EA AMSERを開発し、その成績を評価され、株式会社ゴゴジャンの部長として抜擢。
現在はAMSER株式会社代表取締役、株式会社トリロジー他で役員を兼任。