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

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

MQL5のiLow関数は、指定した通貨ペアおよび時間足において、特定のローソク足の最安値を取得するための関数です。

実務レベルのEA(エキスパートアドバイザー)開発において、最安値の情報は単にチャートを確認するためだけではなく、「損切りライン(ストップロス)の決定」「ブレイクアウト戦略のトリガー」「直近安値の更新確認」など、ロジックの根幹を支える非常に重要なデータとして活用されます。

多くの初心者がつまずくポイントは、MQL4時代のようなLow[]という配列形式でのアクセスと、MQL5の関数形式でのアクセスの違いです。MQL5ではデータの同期状態(ヒストリカルデータが正しく読み込まれているか)を考慮する必要があり、単純に関数を呼び出すだけでは、データ未ロード時に「0.0」が返ってきてしまい、予期せぬ計算エラー(ゼロ除算など)を引き起こすリスクがあります。プロの現場では、この「データの有効性チェック」を含めた実装が必須となります。


2. 構文と戻り値

iLow関数の基本的な構文は以下の通りです。

double iLow(
   string           symbol,          // 通貨ペア名(NULLなら現在のチャート)
   ENUM_TIMEFRAMES  timeframe,       // 時間足(PERIOD_CURRENTなら現在の時間足)
   int              shift            // シフト(0は現在の足、1は1本前の足)
);

パラメーターの詳細

  • symbol: "EURUSD""USDJPY" などの文字列を指定します。_Symbol または NULL を指定すると、現在EAを適用している通貨ペアになります。
  • timeframe: PERIOD_M15(15分足)や PERIOD_H1(1時間足)のように指定します。0 または _Period を指定すると現在の時間足になります。
  • shift: 取得したいローソク足のインデックスです。0が最新(現在形成中)の足、1が1本前の確定した足となります。

戻り値

  • 指定したローソク足の最安値を double 型で返します。
  • データの取得に失敗した場合(歴史データがまだダウンロードされていない場合など)は 0.0 を返します。

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

以下のコードは、1本前のローソク足の安値を下回った(安値更新した)瞬間にログを出力する、非常にシンプルかつ実践的な例です。

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

// 毎ティックごとに動作する関数
void OnTick()
{
    // 1本前(確定足)の安値を取得
    double previousLow = iLow(_Symbol, PERIOD_CURRENT, 1);

    // データの取得に失敗していないかチェック
    if(previousLow <= 0)
    {
        Print("データの取得に失敗しました。待機中です...");
        return;
    }

    // 現在の価格(Bid)を取得
    double currentBid = SymbolInfoDouble(_Symbol, SYMBOL_BID);

    // ロジック:現在の価格が前の足の安値を下回った場合
    if(currentBid < previousLow)
    {
        // 実務ではここにエントリー注文やトレールストップの処理を記述します
        Print("安値を更新しました! 現在値: ", currentBid, " 前の安値: ", previousLow);
    }
}

このコードでは、iLowから返ってきた値が 0 以下でないかを確認するガード句を入れています。これにより、起動直後の不安定な状態で誤ったシグナルが出るのを防いでいます。


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

  1. データ未ロードによる「0.0」の返却:
    特にバックテスト開始時や、EAをチャートに適用した直後は、過去のデータがターミナルに読み込まれていないことがあります。iLow0 を返した際の例外処理を必ず記述してください。

  2. MQL4との混同:
    MQL4では Low[i] で簡単に取得できましたが、MQL5では iLow() 関数を呼ぶか、CopyLow() 関数を使って配列にデータをコピーする手法が一般的です。大規模な解析を行う場合は、CopyLow() を使って一括で配列に格納する方が処理速度(パフォーマンス)の面で有利です。

  3. マルチ通貨監視の罠:
    EAを動かしている通貨ペア以外の iLow(例:USDJPYのチャートでEURUSDの安値を取得)を呼び出す場合、その通貨ペアのデータが裏側で同期されている必要があります。別通貨のデータを参照する場合は、事前に SeriesInfoInteger 等でデータの準備ができているか確認するのがプロの作法です。


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

自動売買プログラムにおいて、iLowで正確な安値を検知できたとしても、それを実際の利益に結びつけるには「執行スピード」という高い壁が存在します。ご自宅の一般的な光回線やWi-Fi環境PCから発注を行う場合、ブローカーのサーバーまでの物理的な距離により、数十から数百ミリ秒のネットワーク遅延(レイテンシ)が発生します。このわずかな遅れが、急変時のスリッページを引き起こし、期待した価格での約定を阻害します。

特にボラティリティが高い局面での安値更新を狙うロジックでは、コンマ数秒の遅延が致命的な損失に直結します。プロのクオンツエンジニアが例外なくブローカーのデータセンターに近い場所にある「専用VPS(仮想専用サーバー)」を利用するのは、精神論ではなく純粋に技術的な最適解だからです。安定した稼働環境と、ミリ秒単位の約定速度を確保することは、アルゴリズムを改善することと同等、あるいはそれ以上に収益性に直結する重要なファクターであることを忘れないでください。

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

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

コメント

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