日付と時刻のYear()、Month()、Day()、DayOfWeek()、DayOfYear()について、MQL4とMQL5のソースコード共通化する方法を説明しています。
関数定義
MQL4の定義
int Year();
int Month();
int Day();
int DayOfWeek();
int DayOfYear();
MQL5の定義
定義なし
MQL5に年、月、日、曜日、経過日数を求める関数が定義されていません。
共通化方法
ソース共通化
対処方法
共通化するためにMQL5用の定義をします。
#ifdef __MQL5__ ~ #endifを使用することでMQL5のコンパイルにのみ有効となります。
MQL4の場合は「__MQL4__」を使用しますが、今回使用していないためMQL4は既存で組み込まれた組込み関数が利用されます。
#ifdef __MQL5__
///////////////////////////////////////////////////////////////////////////////
// 年
int Year()
{
MqlDateTime tm;
TimeCurrent(tm);
return (tm.year);
}
///////////////////////////////////////////////////////////////////////////////
// 月
int Month()
{
MqlDateTime tm;
TimeCurrent(tm);
return (tm.mon);
}
///////////////////////////////////////////////////////////////////////////////
// 日
int Day()
{
MqlDateTime tm;
TimeCurrent(tm);
return (tm.day);
}
///////////////////////////////////////////////////////////////////////////////
// 曜日
int DayOfWeek()
{
MqlDateTime tm;
TimeCurrent(tm);
return (tm.day_of_week);
}
///////////////////////////////////////////////////////////////////////////////
// 経過日数(1年の)
int DayOfYear()
{
MqlDateTime tm;
TimeCurrent(tm);
return (tm.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 {
Print("年:", Year());
Print("月:", Month());
Print("日:", Day());
Print("曜日:", DayOfWeek());
bIsPrint = true;
}
}
MT5での実行結果
年、月、日、曜日を順にログに出力します。
MT4での実行結果
余談
ヒナタ
これくらいMQL5に組み込んでおいてくれよな
ITサービス屋
まあ、そういう意見も当然あるよね
ヒナタ
DayOfYear()の使用例がないんだが?
ITサービス屋
バレテル・・・
漏れに気付いて、後から関数追加したんです・・・
ヒナタ
スクショるの面倒だったんでしょうよ・・・💤
コメント