日付と時刻のTimeYear()、TimeMonth()、TimeDay()、TimeDayOfWeek()、TimeDayOfYear()について、MQL4とMQL5のソースコード共通化する方法を説明しています。
関数定義
MQL4の定義
int TimeYear(
datetime date // date and time
);
int TimeMonth(
datetime date // date and time
);
int TimeDay(
datetime date // date and time
);
int TimeDayOfWeek(
datetime date // date and time
);
int TimeDayOfYear(
datetime date // date and time
);
MQL5の定義
定義なし
MQL5にdatetime構造体から年、月、日、曜日、経過日数を求める関数が定義されていません。
共通化方法
ソース共通化
対処方法
共通化するためにMQL5用の定義をします。
#ifdef __MQL5__ ~ #endifを使用することでMQL5のコンパイルにのみ有効となります。
MQL4の場合は「__MQL4__」を使用しますが、今回使用していないためMQL4は既存で組み込まれた組込み関数が利用されます。
#ifdef __MQL5__
///////////////////////////////////////////////////////////////////////////////
// 年
int TimeYear(datetime date)
{
MqlDateTime mqlDateTime = {};
TimeToStruct(date, mqlDateTime);
return mqlDateTime.year;
}
///////////////////////////////////////////////////////////////////////////////
// 月
int TimeMonth(datetime date)
{
MqlDateTime mqlDateTime = {};
TimeToStruct(date, mqlDateTime);
return mqlDateTime.mon;
}
///////////////////////////////////////////////////////////////////////////////
// 日
int TimeDay(datetime date)
{
MqlDateTime mqlDateTime = {};
TimeToStruct(date, mqlDateTime);
return mqlDateTime.day;
}
///////////////////////////////////////////////////////////////////////////////
// 曜日
int TimeDayOfWeek(datetime date)
{
MqlDateTime mqlDateTime = {};
TimeToStruct(date, mqlDateTime);
return mqlDateTime.day_of_week;
}
///////////////////////////////////////////////////////////////////////////////
// 経過日数(1年の)
int TimeDayOfYear(datetime date)
{
MqlDateTime mqlDateTime = {};
TimeToStruct(date, mqlDateTime);
return mqlDateTime.day_of_year;
}
#endif
使用例
サーバ最終受信時刻の年、月、日、曜日、経過日数を表示します。
int OnInit()
{
#ifdef __MQL5__
Print("これはMT5で動作しています");
#else //__MQL4__
Print("これはMT4で動作しています");
#endif
return(INIT_SUCCEEDED);
}
void OnTick()
{
static bool bIsPrint = false;
if (bIsPrint) {
} else {
datetime dtNowCurrent = TimeCurrent();
Print("年:", TimeYear(dtNowCurrent));
Print("月:", TimeMonth(dtNowCurrent));
Print("日:", TimeDay(dtNowCurrent));
Print("曜日:", TimeDayOfWeek(dtNowCurrent));
Print("経過日数:", TimeDayOfYear(dtNowCurrent));
bIsPrint = true;
}
}
MT5での実行結果
サーバ最終受信時刻から年、月、日、曜日、経過日数を順にログに出力します。
MT4での実行結果
余談
ヒナタ
経過日数とかどうやって使うの?
ITサービス屋
そうね
もういくつ寝るとお正月か知りたい時かな?
ヒナタ
は?
寝ときゃ数えなくてもくるでええゎ・・・💤
コメント