<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>時間関数 アーカイブ - 自動売買を作ろう！</title>
	<atom:link href="https://mql-programing.com/archives/tag/%E6%99%82%E9%96%93%E9%96%A2%E6%95%B0/feed/" rel="self" type="application/rss+xml" />
	<link>https://mql-programing.com/archives/tag/時間関数/</link>
	<description>MQLプログラミング学習サイト</description>
	<lastBuildDate>Wed, 01 Apr 2026 02:36:31 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://mql-programing.com/main29/wp-content/uploads/2021/02/cropped-ブログアイコン-32x32.jpg</url>
	<title>時間関数 アーカイブ - 自動売買を作ろう！</title>
	<link>https://mql-programing.com/archives/tag/時間関数/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>【MQL4】時間関数の完全ガイド｜TimeCurrent・TimeLocal・TimeToStruct・StructToTimeの使い方</title>
		<link>https://mql-programing.com/archives/13003/%e3%80%90mql4%e3%80%91%e6%99%82%e9%96%93%e9%96%a2%e6%95%b0%e3%81%ae%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%89%ef%bd%9ctimecurrent%e3%83%bbtimelocal%e3%83%bbtimetostruct%e3%83%bbstructtotime/</link>
		
		<dc:creator><![CDATA[朝日奈りさ]]></dc:creator>
		<pubDate>Mon, 06 Apr 2026 01:00:00 +0000</pubDate>
				<category><![CDATA[【中級編】MQLプログラムの読み方・書き方]]></category>
		<category><![CDATA[MQL4]]></category>
		<category><![CDATA[EA開発]]></category>
		<category><![CDATA[時間関数]]></category>
		<category><![CDATA[TimeCurrent]]></category>
		<category><![CDATA[TimeToStruct]]></category>
		<guid isPermaLink="false">https://mql-programing.com/?p=13003</guid>

					<description><![CDATA[<p>EA（自動売買）を開発していると、「東京時間だけトレードしたい」「金曜日はエントリーを避けたい」など、時間や曜日によって処理を切り替えたい場面が必ず出てきます。 MQL4には時間を扱うための便利な関数がいくつも用意されて [&#8230;]</p>
<p>投稿 <a href="https://mql-programing.com/archives/13003/%e3%80%90mql4%e3%80%91%e6%99%82%e9%96%93%e9%96%a2%e6%95%b0%e3%81%ae%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%89%ef%bd%9ctimecurrent%e3%83%bbtimelocal%e3%83%bbtimetostruct%e3%83%bbstructtotime/">【MQL4】時間関数の完全ガイド｜TimeCurrent・TimeLocal・TimeToStruct・StructToTimeの使い方</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></description>
										<content:encoded><![CDATA[<p>EA（自動売買）を開発していると、「東京時間だけトレードしたい」「金曜日はエントリーを避けたい」など、<strong>時間や曜日によって処理を切り替えたい場面</strong>が必ず出てきます。</p>
<p>MQL4には時間を扱うための便利な関数がいくつも用意されていますが、サーバー時間とローカル時間の違いや、datetime型と構造体の変換方法など、最初は混乱しやすいポイントも多いです。</p>
<p>この記事では、MQL4の時間関数の中でも特に重要な<strong>TimeCurrent・TimeLocal・TimeGMT・TimeToStruct・StructToTime</strong>の5つを中心に、基本の使い方から実践的な時間帯フィルター・曜日フィルターの実装まで、まとめて解説します。</p>
<h2><span id="toc1">datetime型とは？</span></h2>
<p>MQL4で日時を扱うときの基本データ型が<strong>datetime型</strong>です。これは<strong>1970年1月1日 00:00:00（UTC）からの経過秒数</strong>を整数値として格納する型です。</p>
<pre><code class="language-mql4">// datetime型の基本
datetime now = TimeCurrent();
Print(now);             // 例: 1718000000（経過秒数）
Print(TimeToString(now)); // 例: "2024.06.10 12:00:00"（文字列に変換）
</code></pre>
<p>内部的にはただの数値なので、秒単位の計算が簡単にできます。例えば「1日後」を求めたければ <code>now + 86400</code>（60秒×60分×24時間）とするだけです。</p>
<p>ただし、datetime型のままでは「今は何月？」「何曜日？」といった情報を直接取り出せません。そこで後述する<strong>MqlDateTime構造体</strong>と<strong>TimeToStruct()</strong>関数が活躍します。</p>
<h2><span id="toc2">現在時刻を取得する3つの関数</span></h2>
<p>MQL4で「今の時刻」を取得する関数は3つあります。それぞれ返す時刻の基準が異なるため、目的に応じて使い分けることが重要です。</p>
<h3><span id="toc3">TimeCurrent() ― サーバー時刻</span></h3>
<p><strong>TimeCurrent()</strong>は、ブローカーのサーバー時刻を返します。EA開発では最も頻繁に使う関数で、チャート上のローソク足の時刻もこのサーバー時刻が基準になっています。</p>
<p>注意点として、サーバー時刻のタイムゾーンはブローカーによって異なります。GMT+2やGMT+3を採用しているブローカーが多いですが、必ず自分が使っているブローカーのタイムゾーンを確認しましょう。</p>
<h3><span id="toc4">TimeLocal() ― PC（ローカル）時刻</span></h3>
<p><strong>TimeLocal()</strong>は、MetaTraderが動作しているPC自体の時刻を返します。日本のPCであれば日本時間（GMT+9）が返ります。</p>
<h3><span id="toc5">TimeGMT() ― GMT時刻</span></h3>
<p><strong>TimeGMT()</strong>は、グリニッジ標準時（GMT/UTC）を返します。タイムゾーンの違いを気にせず統一的な基準で時刻を扱いたい場合に便利です。</p>
<h3><span id="toc6">3つの関数を比較するコード</span></h3>
<pre><code class="language-mql4">void OnTick()
{
    datetime server_time = TimeCurrent();
    datetime local_time  = TimeLocal();
    datetime gmt_time    = TimeGMT();

    Print("サーバー時刻: ", TimeToString(server_time, TIME_DATE | TIME_SECONDS));
    Print("ローカル時刻: ", TimeToString(local_time, TIME_DATE | TIME_SECONDS));
    Print("GMT時刻:      ", TimeToString(gmt_time, TIME_DATE | TIME_SECONDS));
}
</code></pre>
<p>このコードを実行すると、それぞれの時刻の差を確認できます。例えば日本のPCでGMT+2のブローカーを使っている場合、ローカル時刻はサーバー時刻より7時間進んでいるはずです。</p>
<h2><span id="toc7">MqlDateTime構造体で時刻を分解する</span></h2>
<p>datetime型は経過秒数という1つの数値ですが、「年」「月」「日」「時」「分」「秒」「曜日」などの個別情報を取り出したい場面は多くあります。そこで使うのが<strong>MqlDateTime構造体</strong>です。</p>
<p>MqlDateTime構造体には以下の<strong>8つのメンバ</strong>があり、すべてint型で格納されます。</p>
<pre><code class="language-mql4">// MqlDateTime構造体のメンバ一覧
struct MqlDateTime
{
    int year;         // 年（例: 2024）
    int mon;          // 月（1〜12）
    int day;          // 日（1〜31）
    int hour;         // 時（0〜23）
    int min;          // 分（0〜59）
    int sec;          // 秒（0〜59）
    int day_of_week;  // 曜日（0=日曜, 1=月曜, ..., 6=土曜）
    int day_of_year;  // 年初からの通算日数（1月1日=0）
};
</code></pre>
<p><strong>day_of_week</strong>は0が日曜日で始まる点に注意してください。月曜日は1、金曜日は5です。FXの取引日で考えると、月曜（1）〜金曜（5）が平日の取引時間帯になります。</p>
<h2><span id="toc8">TimeToStruct() ― datetime型を構造体に変換</span></h2>
<p><strong>TimeToStruct()</strong>は、datetime型の値をMqlDateTime構造体に分解する関数です。「今は何時？」「何曜日？」といった情報を取り出すときに使います。</p>
<pre><code class="language-mql4">void OnTick()
{
    datetime now = TimeCurrent();
    MqlDateTime dt;

    // datetime型 → MqlDateTime構造体に変換
    TimeToStruct(now, dt);

    Print("年: ", dt.year);
    Print("月: ", dt.mon);
    Print("日: ", dt.day);
    Print("時: ", dt.hour);
    Print("分: ", dt.min);
    Print("秒: ", dt.sec);
    Print("曜日: ", dt.day_of_week, "（0=日, 1=月, ..., 6=土）");
}
</code></pre>
<p>TimeToStruct()の戻り値はbool型で、変換に成功するとtrueを返します。通常の使い方では失敗することは稀ですが、堅牢なコードを書くなら戻り値をチェックするのがベターです。</p>
<h2><span id="toc9">StructToTime() ― 構造体をdatetime型に変換</span></h2>
<p><strong>StructToTime()</strong>はTimeToStruct()の逆で、MqlDateTime構造体の内容をdatetime型に変換します。特定の日時を組み立てたいときに非常に便利です。</p>
<p>例えば、「今日の15時00分00秒」というdatetime値を作りたい場合、次のように書けます。</p>
<pre><code class="language-mql4">// 今日の指定時刻をdatetime型で作成する
datetime GetTodayTime(int target_hour, int target_min)
{
    MqlDateTime dt;
    TimeToStruct(TimeCurrent(), dt);  // 現在のサーバー時刻を分解

    // 時・分・秒を上書き
    dt.hour = target_hour;
    dt.min  = target_min;
    dt.sec  = 0;

    return StructToTime(dt);  // MqlDateTime → datetime型に変換
}

void OnTick()
{
    datetime start_time = GetTodayTime(9, 0);   // 今日の09:00
    datetime end_time   = GetTodayTime(18, 30);  // 今日の18:30

    Print("開始: ", TimeToString(start_time));
    Print("終了: ", TimeToString(end_time));
}
</code></pre>
<p>このテクニックはEAの時間帯フィルターを作るときに欠かせません。次のセクションで実践的な使い方を見ていきましょう。</p>
<h2><span id="toc10">【実践】時間帯フィルターの実装</span></h2>
<p>EA開発でよくある要件が「特定の時間帯だけエントリーする」というフィルターです。以下のコードは、<strong>開始時刻と終了時刻をパラメータで設定でき、日またぎにも対応</strong>した実用的な時間帯フィルターです。</p>
<pre><code class="language-mql4">// --- 入力パラメータ ---
input int StartHour = 9;    // 開始時（サーバー時間）
input int StartMin  = 0;    // 開始分
input int EndHour   = 17;   // 終了時（サーバー時間）
input int EndMin    = 30;   // 終了分

// 取引可能な時間帯かどうかを判定する関数
bool IsTradeTime()
{
    MqlDateTime dt;
    TimeToStruct(TimeCurrent(), dt);

    // 現在時刻を「分」に換算して比較
    int current_minutes = dt.hour * 60 + dt.min;
    int start_minutes   = StartHour * 60 + StartMin;
    int end_minutes     = EndHour * 60 + EndMin;

    // 日またぎ対応（例: 22:00〜03:00 の場合）
    if(start_minutes <= end_minutes)
    {
        // 通常パターン（例: 09:00〜17:30）
        return (current_minutes >= start_minutes && current_minutes < end_minutes);
    }
    else
    {
        // 日またぎパターン（例: 22:00〜03:00）
        return (current_minutes >= start_minutes || current_minutes < end_minutes);
    }
}

void OnTick()
{
    if(!IsTradeTime())
    {
        // 取引時間外なので何もしない
        return;
    }

    // ここに通常のエントリーロジックを記述
    // ...
}
</code></pre>
<p>ポイントは<strong>時刻を「分」に換算して比較</strong>している点です。こうすることで、時と分をまとめて1つの数値として扱えるので、条件分岐がシンプルになります。また、日またぎ（開始時刻 ＞ 終了時刻）のケースにも対応しています。</p>
<h2><span id="toc11">【実践】曜日フィルターの実装</span></h2>
<p>「金曜日はポジションが週末に持ち越されるリスクがあるからエントリーしない」など、曜日で制御したい場合はMqlDateTimeの<strong>day_of_week</strong>を使います。</p>
<pre><code class="language-mql4">// --- 入力パラメータ ---
input bool TradeMon = true;   // 月曜トレード
input bool TradeTue = true;   // 火曜トレード
input bool TradeWed = true;   // 水曜トレード
input bool TradeThu = true;   // 木曜トレード
input bool TradeFri = false;  // 金曜トレード

// 取引可能な曜日かどうかを判定する関数
bool IsTradeDay()
{
    MqlDateTime dt;
    TimeToStruct(TimeCurrent(), dt);

    switch(dt.day_of_week)
    {
        case 1: return TradeMon;  // 月曜
        case 2: return TradeTue;  // 火曜
        case 3: return TradeWed;  // 水曜
        case 4: return TradeThu;  // 木曜
        case 5: return TradeFri;  // 金曜
        default: return false;    // 土日
    }
}

void OnTick()
{
    if(!IsTradeDay() || !IsTradeTime())
        return;

    // エントリーロジック
    // ...
}
</code></pre>
<p>input変数をbool型にしているので、MetaTraderのパラメータ設定画面からチェックボックスで簡単にON/OFFを切り替えられます。先ほどの時間帯フィルターと組み合わせれば、「月〜木の9:00〜17:30だけトレードする」といった細かい制御が可能です。</p>
<h2><span id="toc12">注意点とTips</span></h2>
<h3><span id="toc13">サーバー時間と日本時間のズレに注意</span></h3>
<p>ブローカーによってサーバー時間のタイムゾーンは異なります。多くの海外ブローカーはGMT+2（冬時間）/ GMT+3（夏時間）を採用しています。日本時間はGMT+9なので、<strong>日本時間との差は6〜7時間</strong>になります。</p>
<p>日本時間基準で制御したい場合は、TimeLocal()を使うか、TimeCurrent()に時差を加算する方法があります。ただし、次の注意点も合わせて把握しておきましょう。</p>
<h3><span id="toc14">バックテスト時のTimeLocal()の挙動</span></h3>
<p>ストラテジーテスター（バックテスト）では、<strong>TimeLocal()はTimeCurrent()と同じ値を返します</strong>。これはバックテスト時にはPCの現在時刻ではなく、テスト中の仮想時刻が使われるためです。</p>
<p>そのため、TimeLocal()を使ったEAはバックテストでは正確に時間帯フィルターが機能しない場合があります。バックテストとの互換性を考えるなら、<strong>TimeCurrent()をベースにして時差をパラメータで調整する設計</strong>がおすすめです。</p>
<h3><span id="toc15">旧来のHour()・Minute()関数との比較</span></h3>
<p>MQL4には<strong>Hour()</strong>や<strong>Minute()</strong>といった、現在のサーバー時間の時・分を直接返す関数もあります。簡単な用途にはこちらでも十分ですが、TimeToStruct()を使う方法には以下のメリットがあります。</p>
<ul>
<li>任意のdatetime値に対して使える（過去の時刻の分析にも対応）</li>
<li>曜日や通算日数など、より多くの情報を一度に取得できる</li>
<li>MQL5への移行時にもほぼ同じコードが使える</li>
</ul>
<p>新しくコードを書く場合は、TimeToStruct()を使った方法を推奨します。</p>
<h2><span id="toc16">まとめ</span></h2>
<p>この記事で紹介した関数・構造体を一覧表で整理します。</p>
<table>
<thead>
<tr>
<th>関数・型</th>
<th>役割</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>TimeCurrent()</strong></td>
<td>ブローカーのサーバー時刻を取得（最も基本）</td>
</tr>
<tr>
<td><strong>TimeLocal()</strong></td>
<td>PCのローカル時刻を取得</td>
</tr>
<tr>
<td><strong>TimeGMT()</strong></td>
<td>GMT（UTC）時刻を取得</td>
</tr>
<tr>
<td><strong>TimeToStruct()</strong></td>
<td>datetime型 → MqlDateTime構造体に分解</td>
</tr>
<tr>
<td><strong>StructToTime()</strong></td>
<td>MqlDateTime構造体 → datetime型に変換</td>
</tr>
<tr>
<td><strong>MqlDateTime</strong></td>
<td>年・月・日・時・分・秒・曜日を格納する構造体</td>
</tr>
</tbody>
</table>
<p>EA開発での基本パターンは以下の3ステップです。</p>
<ol>
<li><strong>TimeCurrent()</strong>で現在のサーバー時刻を取得する</li>
<li><strong>TimeToStruct()</strong>で年・月・日・時・分・秒・曜日に分解する</li>
<li>分解した情報を使って時間帯や曜日の条件判定を行う</li>
</ol>
<p>逆に特定の日時をdatetime型で組み立てたいときは、MqlDateTime構造体に値をセットしてから<strong>StructToTime()</strong>で変換します。</p>
<p>時間関数をマスターすれば、取引時間の制御だけでなく、年末年始の停止処理や重要指標発表時間の回避など、より高度なEAの制御が可能になります。ぜひ実際のコードに組み込んで、使い方を身につけてください。</p>
<p>投稿 <a href="https://mql-programing.com/archives/13003/%e3%80%90mql4%e3%80%91%e6%99%82%e9%96%93%e9%96%a2%e6%95%b0%e3%81%ae%e5%ae%8c%e5%85%a8%e3%82%ac%e3%82%a4%e3%83%89%ef%bd%9ctimecurrent%e3%83%bbtimelocal%e3%83%bbtimetostruct%e3%83%bbstructtotime/">【MQL4】時間関数の完全ガイド｜TimeCurrent・TimeLocal・TimeToStruct・StructToTimeの使い方</a> は <a href="https://mql-programing.com">自動売買を作ろう！</a> に最初に表示されました。</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
