MQL4でEAやインジケーターを作っていると、「1時間足の移動平均線を取得したい」「日足のローソク足データを参照したい」といった場面が頻繁に出てきます。そんなときに使うのが時間足定数(ENUM_TIMEFRAMES)です。
この記事では、MQL4で使える時間足定数をすべて一覧で紹介し、基本的な使い方からマルチタイムフレーム分析への応用まで、実践的なコード例とともに解説します。
ENUM_TIMEFRAMESとは?
ENUM_TIMEFRAMESは、MetaTraderのチャート時間足を表す列挙型(enum)です。列挙型とは、あらかじめ決められた名前付きの定数をグループ化したもので、「どの時間足か」をプログラム上でわかりやすく指定するために使います。
例えば、1時間足を指定するときに数値の 60 と書くよりも、PERIOD_H1 と書いたほうが圧倒的に読みやすいですよね。これが時間足定数を使う最大のメリットです。
時間足定数の一覧(MQL4)
MQL4で使用できる時間足定数は、特殊な PERIOD_CURRENT を含めて全部で10個です。以下の表にまとめました。
| 定数名 | 整数値 | 意味 | 1本あたりの秒数 |
|---|---|---|---|
| PERIOD_CURRENT | 0 | 現在のチャートの時間足 | (チャートに依存) |
| PERIOD_M1 | 1 | 1分足 | 60秒 |
| PERIOD_M5 | 5 | 5分足 | 300秒 |
| PERIOD_M15 | 15 | 15分足 | 900秒 |
| PERIOD_M30 | 30 | 30分足 | 1,800秒 |
| PERIOD_H1 | 60 | 1時間足 | 3,600秒 |
| PERIOD_H4 | 240 | 4時間足 | 14,400秒 |
| PERIOD_D1 | 1440 | 日足 | 86,400秒 |
| PERIOD_W1 | 10080 | 週足 | 604,800秒 |
| PERIOD_MN1 | 43200 | 月足 | 約2,592,000秒 |
MQL4の整数値は「分」を基準にしています。例えば PERIOD_H1 は60分なので整数値が60、PERIOD_D1 は1440分(24時間×60分)なので1440です。この規則を覚えておくと、値の意味がすぐに理解できます。
MQL5との違いに注意
MQL4からMQL5へコードを移植する際に、最もハマりやすいポイントの一つがこの時間足定数の整数値の違いです。
MQL5ではビットシフトを用いた全く異なる整数値が割り当てられています。
| 定数名 | MQL4の整数値 | MQL5の整数値 |
|---|---|---|
| PERIOD_M1 | 1 | 1 |
| PERIOD_M5 | 5 | 5 |
| PERIOD_H1 | 60 | 16385 |
| PERIOD_D1 | 1440 | 16408 |
| PERIOD_W1 | 10080 | 32769 |
| PERIOD_MN1 | 43200 | 49153 |
分足(M1〜M30)まではMQL4とMQL5で同じ値ですが、H1以上は完全に異なります。定数名(PERIOD_H1など)を使っていれば問題ありませんが、整数値をハードコードしていると移植時にバグの原因になります。常に定数名を使う習慣をつけましょう。
基本的な使い方
iMA()で別の時間足の移動平均線を取得する
最もよく使うパターンが、iMA() などのテクニカル指標関数に時間足を指定するケースです。
// 現在の通貨ペアの1時間足で、20期間の単純移動平均線を取得
double ma_h1 = iMA(NULL, PERIOD_H1, 20, 0, MODE_SMA, PRICE_CLOSE, 0);
// 日足の20期間移動平均線を取得
double ma_d1 = iMA(NULL, PERIOD_D1, 20, 0, MODE_SMA, PRICE_CLOSE, 0);
第1引数の NULL は現在の通貨ペアを意味し、第2引数に時間足定数を指定します。
iClose()で別の時間足の終値を取得する
// 日足の1本前(昨日)の終値を取得
double yesterday_close = iClose(NULL, PERIOD_D1, 1);
// 4時間足の現在のバーの始値を取得
double h4_open = iOpen(NULL, PERIOD_H4, 0);
Period()で現在の時間足を取得する
// 現在のチャートの時間足を取得
int current_tf = Period();
// 現在の時間足が1時間足かどうか判定
if(Period() == PERIOD_H1)
{
Print("現在のチャートは1時間足です");
}
Period() 関数は現在のチャートの時間足を整数値で返します。PERIOD_CURRENTを指定したときと同じ時間足のデータが取得されます。
実践テクニック
inputパラメーターでドロップダウン選択にする
EAのパラメーターに ENUM_TIMEFRAMES 型を使うと、MetaTraderのパラメーター設定画面でドロップダウンリストから時間足を選択できるようになります。これは非常に便利なテクニックです。
input ENUM_TIMEFRAMES InpTimeframe = PERIOD_H1; // 分析する時間足
input int InpMAPeriod = 20; // 移動平均線の期間
void OnTick()
{
double ma = iMA(NULL, InpTimeframe, InpMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
// ユーザーが選択した時間足のMAを使って売買判断
}
ユーザーが数値を手入力する必要がなく、選択ミスも防げるので、EA配布時にも親切な設計になります。
PeriodSeconds()で時間足を秒数に変換する
// 現在の時間足の1本あたりの秒数を取得
int seconds = PeriodSeconds(PERIOD_H1);
Print("1時間足の1本 = ", seconds, "秒"); // 3600秒
// 引数を省略すると現在のチャートの時間足が使われる
int current_seconds = PeriodSeconds();
時間計算を行う場面(例:「次のバーが生成されるまで何秒か」など)で非常に役立ちます。
マルチタイムフレーム分析のEAサンプル
実践的な例として、日足のトレンド方向を確認してからエントリーする簡易EAのロジックを紹介します。
input ENUM_TIMEFRAMES InpEntryTF = PERIOD_H1; // エントリー判断の時間足
input ENUM_TIMEFRAMES InpFilterTF = PERIOD_D1; // トレンドフィルターの時間足
input int InpMAPeriod = 20; // MA期間
void OnTick()
{
// 上位足(日足)のMAでトレンド方向を判定
double ma_filter = iMA(NULL, InpFilterTF, InpMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
double price_filter = iClose(NULL, InpFilterTF, 0);
bool uptrend = (price_filter > ma_filter);
bool downtrend = (price_filter < ma_filter);
// エントリー足のMAでエントリーシグナルを判定
double ma_entry = iMA(NULL, InpEntryTF, InpMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 0);
double price_entry = iClose(NULL, InpEntryTF, 0);
// 日足が上昇トレンド かつ 1時間足で価格がMAを上抜け → 買いシグナル
if(uptrend && price_entry > ma_entry)
{
// 買い注文のロジック
Print("買いシグナル検出!");
}
// 日足が下降トレンド かつ 1時間足で価格がMAを下抜け → 売りシグナル
if(downtrend && price_entry < ma_entry)
{
// 売り注文のロジック
Print("売りシグナル検出!");
}
}
このように、時間足定数を活用すればマルチタイムフレーム分析のロジックを簡潔に書くことができます。
よくある注意点・トラブル
整数値の直書きは避ける
以下のように整数値を直接書くのは避けましょう。
// ❌ 悪い例:何を意味しているのかわかりにくい
double ma = iMA(NULL, 60, 20, 0, MODE_SMA, PRICE_CLOSE, 0);
// ✅ 良い例:PERIOD_H1と書けば一目で1時間足とわかる
double ma = iMA(NULL, PERIOD_H1, 20, 0, MODE_SMA, PRICE_CLOSE, 0);
可読性が下がるだけでなく、MQL5へ移植する際にバグの原因になります。
ヒストリーデータ不足に注意
別の時間足のデータを参照するとき、MetaTraderにその時間足のヒストリーデータが十分にダウンロードされていない場合があります。特にバックテスト時に、上位足のデータが不足していると正しい結果が得られません。
必要な時間足のチャートを一度開いてデータを読み込ませるか、スクリプトで事前にデータの存在を確認する処理を入れておくと安心です。
PERIOD_CURRENTと0の違い
PERIOD_CURRENT の整数値は 0 です。関数に 0 を渡しても PERIOD_CURRENT を渡しても同じ動作になりますが、コードの意図を明確にするために PERIOD_CURRENT を使うことをおすすめします。
まとめ
MQL4の時間足定数(ENUM_TIMEFRAMES)について、重要なポイントを整理します。
- PERIOD_M1〜PERIOD_MN1の9つの時間足定数と、PERIOD_CURRENT(現在のチャートの時間足)が使える
- MQL4の整数値は「分」が基準(H1=60, D1=1440など)
- MQL5ではH1以上の整数値が全く異なるため、移植時は必ず定数名を使う
input ENUM_TIMEFRAMESでパラメーター化すると、ドロップダウン選択が自動生成されて便利PeriodSeconds()で時間足を秒数に変換でき、時間計算に活用できる- マルチタイムフレーム分析では、上位足のデータ(ヒストリー)が十分にあるか確認が必要
時間足定数はEA開発で日常的に使う基本中の基本です。まずは iMA() や iClose() に異なる時間足を指定するところから試してみてください。マルチタイムフレーム分析ができるようになると、EA戦略の幅が大きく広がりますよ!

