1. iTime関数の概要と実務での活用法
MQL5のiTime関数は、指定した通貨ペアおよび時間足において、特定のバーが「いつ開始されたか(オープン時間)」を取得するための非常に重要な関数です。
実務開発、特にEA(エキスパートアドバイザー)のロジック構築において、iTimeは主に以下の用途で活用されます。
- 新しい足(確定足)の発生検知: 毎ティック動くEAにおいて、「新しい1分足や1時間足が始まった瞬間」にのみエントリー判断を行いたい場合に必須となります。
- マルチタイムフレーム(MTF)分析: 例えば「5分足で動作しているEAが、1時間足の現在のオープン時間を参照して上位足のトレンド転換を確認する」といった処理が容易になります。
- 計算負荷の軽減: 毎ティック重い計算をするのではなく、特定のバーの開始時刻が変わったときだけ計算を実行させることで、CPU負荷を劇的に抑えることができます。
初心者が特につまずきやすい点は、MQL4とMQL5での挙動の違いです。MQL5ではヒストリーデータが準備されていない場合、iTimeは「0」を返すことがあります。これを見越したエラーハンドリングが、堅牢なシステム構築の第一歩となります。
2. 構文と戻り値
iTime関数の基本的な構文は以下の通りです。
datetime iTime(
string symbol, // 通貨ペア名(NULLまたは_Symbolで現在のチャート)
ENUM_TIMEFRAMES timeframe, // 時間足(PERIOD_M1, PERIOD_H1など)
int shift // シフト(0が現在の足、1が1つ前の足)
);
パラメーター解説
- symbol: 取得したい通貨ペアを指定します。自身のチャートであれば
_Symbolを指定します。 - timeframe: 参照したい時間軸を指定します。現在のチャートの時間足なら
_Periodを指定します。 - shift: どのバーの時間を取得するかを指定します。最新の足(形成中)なら
0、一つ前の確定足なら1を指定します。
戻り値
- 成功した場合:指定されたバーのオープン時間を
datetime型(1970年1月1日からの経過秒数)で返します。 - 失敗した場合:
0を返します。データがまだ読み込まれていない時などに発生します。
3. 具体的な使い方・実践サンプルコード
以下は、iTimeを使って「新しいバーが生成された瞬間」を検知し、そのタイミングでログを出力する実用的なEAのテンプレートです。
//+------------------------------------------------------------------+
//| NewBarDetector.mq5 |
//| Copyright 2024, Quant Engineer |
//| https://example.com |
//+------------------------------------------------------------------+
#property strict
// 直前のバーの開始時刻を保持する変数
static datetime last_bar_time = 0;
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
// 現在のチャートの最新の足(インデックス0)の開始時刻を取得
datetime current_bar_time = iTime(_Symbol, _Period, 0);
// データの取得に失敗(0が返ってきた)した場合は処理をスキップ
if(current_bar_time == 0)
{
Print("データの準備ができていません。");
return;
}
// 保存されている時刻と現在の時刻が異なる場合、新しいバーが発生したと判断
if(last_bar_time != current_bar_time)
{
// 初回起動時(last_bar_timeが0)の誤作動防止
if(last_bar_time != 0)
{
Print("新しいバーが発生しました: ", TimeToString(current_bar_time));
// --- ここにエントリーロジックやインジケータ計算を記述 ---
// 例: CheckEntrySignal();
}
// 比較用の時刻を更新
last_bar_time = current_bar_time;
}
}
このコードのポイントは、static 変数を使ってティックをまたいで時刻を保持している点です。これにより、一瞬のチャンスを逃さず、かつ無駄な重複処理を防ぐことができます。
4. 使用上の注意点とよくあるエラー
-
データの未ロード(戻り値0)の罠
EAをチャートに適用した直後や、MT5を起動した直後は、ヒストリーデータがメモリ上に展開されていないことがあります。この時iTimeは0を返します。これをチェックせずに計算に使うと、意図しないバグ(1970年として扱われるなど)の原因になります。 -
別通貨・別時間足の参照
自身のチャート以外のデータ(例:EURUSDで稼働中にUSDJPYの時間を取得)を参照する場合、その通貨ペアのデータが同期されるまで時間がかかることがあります。ループ等で数回リトライするか、SeriesInfoInteger等で同期状態を確認するのがクオンツ流の作法です。 -
MQL4とのインデックスの違い
MQL4では配列としてTime[0]のようにアクセスできましたが、MQL5ではiTime関数を呼び出すのが標準です。パフォーマンスを極限まで追求する場合はCopyTime関数を使ってバルク(一括)で取得する方法もありますが、単一の時間を知るだけならiTimeが最もシンプルで可読性に優れています。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズム取引において、iTimeで正確なシグナルを検知できたとしても、それを注文として執行する環境が劣悪であれば、すべては水の泡となります。FX市場はミリ秒(1000分の1秒)単位で価格が変動しており、自宅のPCから一般的なインターネット回線を通じて注文を出す行為は、プロのクオンツから見れば極めてリスクの高い行為です。家庭用回線特有のネットワーク遅延(レイテンシ)や、物理的な距離による伝達ロスは、スリッページを増大させ、バックテストの結果を大きく下回る「負けの原因」を無意識のうちに作り出します。
約定スピードを極限まで高め、意図した価格で確実に約定させるためには、FX業者の取引サーバーと同じデータセンター内、あるいは至近距離に位置する専用のVPS(仮想専用サーバー)を利用することが必須条件です。24時間安定稼働し、物理的な距離による遅延を最小化するVPS環境は、単なる便利ツールではなく、自動売買エンジニアがマーケットで生き残るための「最低限のインフラ」であると認識すべきです。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント