【MQL5】iClose関数の使い方と自動売買実装コード

1. iClose関数の概要と実務での活用法

MQL5におけるiClose関数は、指定した通貨ペアおよび時間足の「終値(Close)」を取得するための組み込み関数です。

FXのシステムトレード(EA開発)において、終値は最も頻繁に利用されるデータの一つです。例えば、「前の足の終値が移動平均線を上抜けたらエントリー」といったロジックや、ボラティリティの計算、さらにはマルチタイムフレーム(上位足)の相場分析を行う際に必須となります。

実務での活用とつまずきポイント:
MQL5を始めたばかりの方が最初につまずくのが、「MQL4との違い」です。MQL4ではClose[0]のように配列として直感的に書けましたが、MQL5では本来、CopyClose関数を使って配列にデータをコピーする手順が必要です。
しかし、このiClose関数はMQL4に近い感覚で「1行でサクッと特定の終値を取得できる」ように用意された便利なショートカット関数です。開発スピードを優先する実務の現場でも、特定の1点のみの価格が必要な場合には非常によく使われます。


2. 構文と戻り値

iClose関数の基本的な書き方は以下の通りです。

double iClose(
   string           symbol,          // 通貨ペア名(銘柄)
   ENUM_TIMEFRAMES  timeframe,       // 時間足
   int              shift            // シフト(何本前の足か)
);

パラメーターの解説

  1. symbol: _Symbol(現在のチャート)や "USDJPY" などを指定します。
  2. timeframe: PERIOD_M1(1分足)や PERIOD_H1(1時間足)など、取得したい時間足を指定します。PERIOD_CURRENTを指定すると現在のチャートの時間足になります。
  3. shift: 取得したい足の位置です。
  4. 0: 現在形成中の足
  5. 1: 1本前の確定足
  6. 2: 2本前の足

戻り値

  • 成功した場合:指定された足の終値(double型)を返します。
  • 失敗した場合:0.0 を返します。データが準備できていない場合などに発生します。

3. 具体的な使い方・実践サンプルコード

以下は、1本前の終値と2本前の終値を比較して、価格が上昇しているか判定するシンプルなEAのサンプルコードです。

//+------------------------------------------------------------------+
//|                                              Sample_iClose.mq5   |
//|                                  Copyright 2023, Quant Engineer  |
//+------------------------------------------------------------------+
#property strict

// ティック毎に実行される関数
void OnTick()
{
    // 1本前(直近で確定した足)の終値を取得
    double lastClose = iClose(_Symbol, PERIOD_CURRENT, 1);

    // 2本前の終値を取得
    double prevClose = iClose(_Symbol, PERIOD_CURRENT, 2);

    // データが正常に取得できているかチェック(0.0はエラーを意味する)
    if(lastClose == 0 || prevClose == 0)
    {
        Print("データの取得に失敗しました。次ティックで再試行します。");
        return;
    }

    // ロジック判定:1本前の終値が2本前の終値より高ければ「上昇」とみなす
    if(lastClose > prevClose)
    {
        Comment("相場は上昇傾向です。 1本前: ", lastClose, " > 2本前: ", prevClose);
    }
    else if(lastClose < prevClose)
    {
        Comment("相場は下落傾向です。 1本前: ", lastClose, " < 2本前: ", prevClose);
    }
    else
    {
        Comment("価格は横ばいです。");
    }
}

4. 使用上の注意点とよくあるエラー

iClose関数は便利ですが、以下の点に注意しないと予期せぬバグの原因になります。

  1. 戻り値「0.0」のハンドリング
    MT5を起動した直後や、バックテストの開始直後は、過去データのロードが完了しておらず、iClose0.0 を返すことがあります。この状態で計算を行うと計算エラーが発生するため、必ず if(price == 0) のようなチェックを入れるのがプロの作法です。

  2. シフト(インデックス)の数え方
    MT5は、最新の足が「0」、過去に遡るほど数字が大きくなります(時系列配列)。これを逆に覚えてしまうと、過去のデータを見ているつもりが未来のデータ(存在しないインデックス)を参照しようとしてエラーになります。

  3. マルチタイムフレームでの遅延
    現在のチャート(例:5分足)から1時間足の終値を取得する場合、1時間足のデータがローカルPCにダウンロードされていないと取得に時間がかかったり、古いデータを返したりすることがあります。


5. 【重要】自動売買における約定スピードと環境の罠

アルゴリズムトレードにおいて、iCloseなどの関数を駆使してどれだけ精緻なエントリーロジックを組み上げたとしても、実行環境が「自宅のPC」であれば、その努力は水の泡になる危険性があります。自宅のインターネット回線は、FX業者のサーバーとの間に数百ものネットワークハブを経由しており、物理的な距離と通信経路の複雑さから、致命的な「ネットワーク遅延(レイテンシ)」が発生するためです。

この遅延は、画面上の価格とサーバー上の実勢価格の乖離(スリッページ)を生みます。特にボラティリティが高い局面では、ミリ秒単位の遅れが数pipsの損失に直結し、バックテストでは利益が出ているロジックがリアル口座では破綻するという現象を引き起こします。プロのクオンツや専業トレーダーにとって、FX業者のデータセンターに近い環境に位置する「専用VPS(仮想専用サーバー)」の使用は、もはやオプションではなく、勝つための「インフラ的な大前提」です。極限まで約定スピードを高め、不慮の停電やPCフリーズのリスクを排除することこそが、システムトレードの成功率を決定づける最重要ファクターとなります。

💡 この記事の内容を実運用で活かすには?

この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント

タイトルとURLをコピーしました