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

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

MQL5のiLowest関数は、指定したバーの範囲内で「最も低い値」を持つバーのインデックス(番号)を取得するための関数です。

実務開発において、初心者が最もつまずきやすいポイントは、「この関数が返すのは価格そのものではなく、場所(インデックス)である」という点です。最安値の価格を取得したい場合は、まずiLowestで場所を特定し、その番号を使って価格データにアクセスするという2ステップの手順が必要になります。

実務での主な活用例:
* ストップロスの設定: 直近20本のローソク足の最安値に損切りラインを置く。
* 逆張りエントリー: 一定期間の安値を更新したタイミングを検知する。
* チャネルトレード: ドンチャンチャネル(ハイローバンド)の下限ラインを算出する。

単純に「現在の安値」を見るのではなく、「過去数本分の安値」を動的に監視することで、相場のボラティリティに応じた柔軟なロジックを組むことが可能になります。

2. 構文と戻り値

iLowest関数の構文は以下の通りです。

int  iLowest(
   string           symbol,          // 通貨ペア(NULLで現在のチャート)
   ENUM_TIMEFRAMES  timeframe,       // 時間足(0またはPERIOD_CURRENTで現在)
   ENUM_SERIES_GROUPS type,          // データの種類(通常はMODE_LOW)
   int              count=WHOLE_ARRAY, // 検索対象にするバーの数
   int              start=0          // 検索を開始する位置
   );

パラメーター解説

  1. symbol: 対象の通貨ペア名。
  2. timeframe: 5分足、1時間足などの時間足。
  3. type: どの値を比較するか。通常は安値を表す MODE_LOW を使用しますが、始値(MODE_OPEN)や終値(MODE_CLOSE)なども指定可能です。
  4. count: 何本のバーを調べるか。10と入れれば「開始位置から10本分」を調べます。
  5. start: どこから遡るか。0なら現在の最新のバー、1なら1本前の確定足からです。

戻り値

  • 指定された範囲内で最小値が見つかったバーのインデックス番号を返します。
  • エラーが発生した場合は -1 を返します。

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

以下は、直近20本のローソク足(確定足)の中から最安値を検索し、その価格を取得してチャートに表示する実践的なコード例です。

//+------------------------------------------------------------------+
//|                                              Sample_iLowest.mq5  |
//+------------------------------------------------------------------+
void OnTick()
{
   // 検索範囲(直近20本)
   int range = 20;
   // 開始位置(1にすることで、現在動いている足ではなく、1本前の確定足から数える)
   int start = 1;

   // 1. 最安値がある「位置(インデックス)」を取得
   int lowestIndex = iLowest(_Symbol, _Period, MODE_LOW, range, start);

   if(lowestIndex != -1)
   {
      // 2. 取得したインデックスを使って、実際の「価格」を取得する
      // MQL5では iLow関数を使用して特定のバーの安値を取得できる
      double lowestPrice = iLow(_Symbol, _Period, lowestIndex);

      // 3. 結果をチャート上にコメントで表示
      Comment("直近 ", range, " 本の最安値のインデックス: ", lowestIndex, "\n",
              "最安値の価格: ", DoubleToString(lowestPrice, _Digits));

      // 実務ではここでの lowestPrice を StopLoss などに代入して注文を出す
   }
   else
   {
      Print("エラー: 最安値のインデックス取得に失敗しました。");
   }
}

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

① 価格そのものが返ってくると勘違いする

前述の通り、iLowestが返すのは「0, 1, 2…」といったバーの番号です。double price = iLowest(...) と書いても価格は取得できません。必ず iLow()CopyLow() と組み合わせて使用してください。

② ヒストリーデータの不足

EAを稼働させた直後や、バックテストの開始直後などは、指定した本数(例:500本)のデータがチャート上に存在しない場合があります。この場合、iLowest-1 を返すか、期待しない値を返すことがあります。実運用では、必ず戻り値が -1 でないかチェックする処理を入れましょう。

③ インデックスの数え方

MQL5では、最新のバーが「0」、その一つ前が「1」と数えます(時系列インデックス)。start パラメーターに 0 を指定すると、現在リアルタイムで動いているバーも含めて計算されます。現在の足は価格が変動し続けるため、シグナルを確定させたい場合は start = 1(1本前の確定足から)とするのが一般的です。

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

どれほど完璧なアルゴリズムをiLowestで組み上げたとしても、それを動かす「環境」が貧弱であれば、シストレで利益を出すことは不可能です。自宅のPCや一般的な光回線でEAを稼働させることは、プロの視点から見ると極めてリスクが高い行為です。家庭用回線には避けられないネットワーク遅延(レイテンシ)が存在し、数ミリ秒の遅れがスリッページを引き起こし、本来得られるはずだった利益を削り取ります。

特にボラティリティが高い局面では、一瞬の注文遅延が致命的な損失に直結します。約定スピードを極限まで高め、24時間365日安定したトレードを継続するには、FX業者のサーバーに近いロケーションに設置された「専用のVPS(仮想専用サーバー)」の導入が必須です。プロのクオンツが自宅PCでメインシステムを回すことはありません。安定したインフラこそが、勝つための最低条件です。

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

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

コメント

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