ホーム » ソース共通化 » 日付と時刻 » datetimeから年月日、曜日、経過日数 – 日付と時刻

datetimeから年月日、曜日、経過日数 – 日付と時刻

日付と時刻

日付と時刻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での実行結果
MT5での実行結果

サーバ最終受信時刻から年、月、日、曜日、経過日数を順にログに出力します。

MT4での実行結果
MT4での実行結果

余談

ヒナタ
ヒナタ

経過日数とかどうやって使うの?

ITサービス屋
ITサービス屋

そうね
もういくつ寝るとお正月か知りたい時かな?

ヒナタ
ヒナタ

は?
寝ときゃ数えなくてもくるでええゎ・・・💤

コメント

タイトルとURLをコピーしました