【EA開発ガイド】Part 4 MQL4開発応用 – Chapter 1 月末の日付を取得する

ごとうびの確認で月末を知りたかったのだが適当な関数が見つからなかった。ネットでサンプルコードを見つけたので実装し動作確認。参考にさせていただいたサイトはこちら。


参考
MQL4でEndOfMonth 月末日付を取得する。MT4&TradingView&株

注意事項

本記事はFXの自動売買に使用されるプログラムについて解説していますが内容を保証するものではありません。金銭にかかわる内容であるためご注意ください。参考にする場合は自己責任でお願いします。

留意事項

本記事ではMT4を使用する。

実行環境

FXDD – MetaTrader
・Version: 4.00 build 1322
・8Feb 2021

MetaEditor
・Version 5.00 build 2375
・7 Jan 2021

月末の取得

月末はEAの条件としてごとうびなどで使用される。

ごとうびと月末

ごとうびは5、10、15、20、25、月末、の6パターン。月末のごとうびは判断するには月末を判断する関数が必要となる。

月末日を取得するサンプルコード

年と月を入力しその月の月末日を取得する。

(1) 月末日取得

日付構造体を使って調べたい月の次月から-1秒して最終日を取得。シンプルだがよく考えられた作りである。

example-end-of-month.mqh

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
//+------------------------------------------------------------------+
//| example-end-month.mqh |
//| Copyright 2021, zerokara-blog. |
//| https://zerokara-blog.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, zerokara-blog."
#property link "https://zerokara-blog.com/"
#property strict
//指定月の最終日を取得
int getEndOfMonth(int year, int month)
{
// 日付時刻構造体
MqlDateTime work;
// 時刻を翌月の1日に変更
work.year = year;
work.mon = month + 1;
work.day = 1;
work.hour = 0;
work.min = 0 ;
work.sec = 0 ;
// 12月の場合は翌年の1月に変更
if( work.mon >= 13)
{
work.mon = 1;
work.year = work.year + 1;
}
// 日付変更した値datetime型に変換
datetime nextMonth = StructToTime(work);
// 翌月から-1秒して前月末を取得
int endOfMonth = TimeDay(nextMonth - 1);
return endOfMonth;
}
//+------------------------------------------------------------------+ //| example-end-month.mqh | //| Copyright 2021, zerokara-blog. | //| https://zerokara-blog.com/ | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, zerokara-blog." #property link "https://zerokara-blog.com/" #property strict //指定月の最終日を取得 int getEndOfMonth(int year, int month) { // 日付時刻構造体 MqlDateTime work; // 時刻を翌月の1日に変更 work.year = year; work.mon = month + 1; work.day = 1; work.hour = 0; work.min = 0 ; work.sec = 0 ; // 12月の場合は翌年の1月に変更 if( work.mon >= 13) { work.mon = 1; work.year = work.year + 1; } // 日付変更した値datetime型に変換 datetime nextMonth = StructToTime(work); // 翌月から-1秒して前月末を取得 int endOfMonth = TimeDay(nextMonth - 1); return endOfMonth; }
//+------------------------------------------------------------------+
//|                                            example-end-month.mqh |
//|                                   Copyright 2021, zerokara-blog. |
//|                                       https://zerokara-blog.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, zerokara-blog."
#property link      "https://zerokara-blog.com/"
#property strict

//指定月の最終日を取得
int getEndOfMonth(int year, int month)
{
    // 日付時刻構造体
    MqlDateTime work;
    
    // 時刻を翌月の1日に変更
    work.year = year;
    work.mon = month + 1;
    work.day = 1;
    work.hour = 0;
    work.min = 0 ;
    work.sec = 0 ;

    // 12月の場合は翌年の1月に変更
    if( work.mon >= 13)
    {
        work.mon = 1;
        work.year = work.year + 1;
    }
    
    // 日付変更した値datetime型に変換
    datetime nextMonth = StructToTime(work);
    
    // 翌月から-1秒して前月末を取得
    int endOfMonth = TimeDay(nextMonth - 1);
    
    return endOfMonth;
}

 

(2) 呼び出し処理

2月の月末が正しいか試すプログラム。

example-end-of-month.mq4

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
//+------------------------------------------------------------------+
//| example-end-of-month.mq4 |
//| Copyright 2021, zerokara-blog. |
//| https://zerokara-blog.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, zerokara-blog."
#property link "https://zerokara-blog.com/"
#property version "1.00"
#property strict
#include <example-end-of-month.mqh>
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
int ret;
ret = getEndOfMonth(2020, 2);
Print("2020年2月の月末は「",ret , "」です。");
ret = getEndOfMonth(2019, 2);
Print("2019年2月の月末は「",ret , "」です。");
ret = getEndOfMonth(2018, 2);
Print("2019年2月の月末は「",ret , "」です。");
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+ //| example-end-of-month.mq4 | //| Copyright 2021, zerokara-blog. | //| https://zerokara-blog.com/ | //+------------------------------------------------------------------+ #property copyright "Copyright 2021, zerokara-blog." #property link "https://zerokara-blog.com/" #property version "1.00" #property strict #include <example-end-of-month.mqh> //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- int ret; ret = getEndOfMonth(2020, 2); Print("2020年2月の月末は「",ret , "」です。"); ret = getEndOfMonth(2019, 2); Print("2019年2月の月末は「",ret , "」です。"); ret = getEndOfMonth(2018, 2); Print("2019年2月の月末は「",ret , "」です。"); //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ void OnDeinit(const int reason) { //--- } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ void OnTick() { //--- } //+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|                                         example-end-of-month.mq4 |
//|                                   Copyright 2021, zerokara-blog. |
//|                                       https://zerokara-blog.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2021, zerokara-blog."
#property link      "https://zerokara-blog.com/"
#property version   "1.00"
#property strict

#include <example-end-of-month.mqh>

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---

    int ret;
    ret = getEndOfMonth(2020, 2);
    Print("2020年2月の月末は「",ret , "」です。");
    
    ret = getEndOfMonth(2019, 2);
    Print("2019年2月の月末は「",ret , "」です。");
    
    ret = getEndOfMonth(2018, 2);
    Print("2019年2月の月末は「",ret , "」です。");
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+

 

(3) 実行結果の確認

2月の月末日を正しく取得できた。これでEAで月末を使ったテストができる。

まとめ

ごとうびの判定にどうしても月末が必要なので実装した。今回は運よくサンプルコードが落ちていたのでスムーズに完了。サンプルコードが無かったらちょっと手間だったかも。

ポイント
  • MQL4に月末日を取得する機能はない
  • 欲しい機能はまずネットでサンプルコードがないか確認
  • 日付構造体を使うと色々なことができそう

筆者は日付構造体を使うアイディアを思いつきませんでした。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です