iGatorは、Bill Williamsが考案したGatorオシレーターの値を、

MQL4で直接取得できる組み込み関数です。

既刊のテクニカルインジケーター関数一覧記事で名前だけは触れていましたが、

このサイトではまだiGator単独の解説記事がありませんでした。

この記事では、iGatorの引数と戻り値を整理したうえで、アリゲーターの「口」

が閉じた状態から開き始めた瞬間を検知する、実際に動くインジケーターの作り方を解説します。

この記事で分かること
・iGatorの12個の引数と戻り値の意味
・既刊アリゲーター系2記事との表示形態の違い
・口が閉じた状態から開き始めた瞬間の検知方法
・実際に動くコード全体

設計思想: アリゲーターの「開閉」を数値化する

まず、Gatorが既刊のアリゲーター系記事と何が違うのかを整理します。

既刊iAlligator・既刊alligator-alignment-indicatorとの表示形態の違い

既刊iAlligator記事は、

顎・歯・唇の3本線をそのままチャート上に表示する方法を解説しました。

既刊alligator-alignment-indicator記事は、

その3本線の並び順(唇>歯>顎等)を判定する方法を解説しました。

Gatorは、その3本線の「間隔」そのものをヒストグラムとして数値化します。

記事 表示する情報 向いている使い方
iAlligator(既刊) 顎・歯・唇の3本線そのもの 線の位置関係を目で確認する
alligator-alignment-indicator(既刊) 3本線の並び順の判定結果 トレンドが整った瞬間を判定する
iGator(本記事) 線同士の間隔(開閉度) アリゲーターが「寝ている」か「起きた」かを判定する

3本線の並び順ではなく、

線と線の距離がどれだけ開いているかに注目するのが、

Gatorの特徴です。

上下2つのヒストグラムが示す意味

上ヒストグラムは「顎と歯の間隔」、下ヒストグラムは「歯と唇の間隔」をそれぞれ表します。

口の開閉の読み方
・両方のヒストグラムが小さい(間隔が狭い):アリゲーターが寝ている=レンジ相場
・両方のヒストグラムが大きくなっていく(間隔が広がる):口が開き始めた=トレンドの始まり
・色の変化(拡大中か縮小中か)も合わせて見ると、口の開閉の勢いが分かる

3本線が絡み合っている状態ほどヒストグラムは小さくなり、

3本線が大きく離れるほどヒストグラムは大きくなります。

iGator関数の引数と戻り値

公式リファレンス(MQL4 Reference: iGator)の内容を整理します。

12個の引数の意味

double iGator(
   string symbol,        // 通貨ペア名(NULLで現在のチャート)
   int    timeframe,     // 時間足(0で現在の時間足)
   int    jaw_period,    // 顎(Jaw)の期間
   int    jaw_shift,     // 顎のシフト
   int    teeth_period,  // 歯(Teeth)の期間
   int    teeth_shift,   // 歯のシフト
   int    lips_period,   // 唇(Lips)の期間
   int    lips_shift,    // 唇のシフト
   int    ma_method,     // 移動平均の計算方法(MODE_SMMA等)
   int    applied_price, // 適用価格(PRICE_MEDIAN等)
   int    mode,          // MODE_UPPER(上ヒストグラム)/MODE_LOWER(下ヒストグラム)
   int    shift           // 何本前のバーの値を取得するか
);

既刊iAlligator記事と同じ顎・歯・唇のパラメーターに加え、

modeとshiftが追加された12引数という、

本サイトで扱った関数の中でも引数の多い関数です。

MQL5版との違い: ハンドル化と引数構成の変化

MQL4のiGatorは、値をdoubleで直接返します。

一方、MQL5のiGator(MQL5 Reference: iGator)は、

値ではなくインジケーターのハンドル(int)を返します。

MQL5移行時の注意
・MQL5版はハンドルを返すだけで、値そのものは返さない
・mode/shift引数が廃止され、バッファ番号(0=上、2=下)で指定する
・実際の値はCopyBuffer()で別途取得する必要がある

既刊のMQL4→MQL5移行チェックリストで扱った、

「mode引数がバッファインデックスに変わる」パターンの、

本サイトで最も引数の多い実例です。

サンプルインジケーター: 口が開き始めた瞬間を検知する設計

上下ヒストグラムの値を取得し、両方が同時に広がり始めた瞬間だけ矢印で知らせます。

上下ヒストグラムの値を取得する

double upper = iGator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_UPPER, i);
double lower = iGator(NULL, 0, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN, MODE_LOWER, i);

MODE_UPPERとMODE_LOWERをそれぞれ別の呼び出しで取得する点が、

既刊iEnvelopes記事の取得方法と共通しています。

「寝ている」から「起きた」への転換判定ロジック

直近N本の上下ヒストグラムの絶対値の合計が小さい状態(寝ている)から、

現在の合計が明確に大きくなった(起きた)瞬間だけを検知します。

本記事での判定設計
・直近5本の上下ヒストグラム合計の平均を「寝ている基準値」とする
・現在の合計がその基準値の1.5倍を超えたら「起きた」と判定
・倍率(1.5倍)は目安であり、通貨ペアや時間足に応じて調整することをおすすめする

倍率による判定のため、相場環境によって検知の感度が変わる点は留意してください。

実際に動くコード全体

実際にMetaEditorでコンパイルできる、Gatorの上下ヒストグラムと「起きた」

矢印を表示するインジケーターです。

//+------------------------------------------------------------------+
//|                                        GatorWakeupIndicator.mq4  |
//|                     Copyright 2026, FX-EA System Project Creator |
//|                        https://creator.fx-ea-system-project.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2026, FX-EA System Project Creator"
#property link      "https://creator.fx-ea-system-project.com/"
#property version   "1.00"
#property strict
#property indicator_separate_window
#property indicator_buffers 3
#property indicator_color1 Lime
#property indicator_color2 Red
#property indicator_color3 Yellow
#property indicator_width3 2

input int InpJawPeriod   = 13;
input int InpJawShift    = 8;
input int InpTeethPeriod = 8;
input int InpTeethShift  = 5;
input int InpLipsPeriod  = 5;
input int InpLipsShift   = 3;
input double InpWakeupRatio = 1.5; //寝ている基準値に対する倍率

double UpperBuffer[];
double LowerBuffer[];
double WakeupArrow[];

int OnInit()
  {
   SetIndexBuffer(0, UpperBuffer);
   SetIndexStyle(0, DRAW_HISTOGRAM);
   SetIndexBuffer(1, LowerBuffer);
   SetIndexStyle(1, DRAW_HISTOGRAM);

   SetIndexBuffer(2, WakeupArrow);
   SetIndexStyle(2, DRAW_ARROW, EMPTY, 2);
   SetIndexArrow(2, 217);
   SetIndexEmptyValue(2, EMPTY_VALUE);

   IndicatorShortName("Gator Wakeup Detector");
   return(INIT_SUCCEEDED);
  }

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
  {
   int needed = InpJawPeriod + InpJawShift + 10;
   if(rates_total < needed)
      return(0);

   int limit = (prev_calculated == 0) ? rates_total - needed : rates_total - prev_calculated + 1;

   for(int i = limit; i >= 0; i--)
     {
      double upper = iGator(NULL, 0, InpJawPeriod, InpJawShift, InpTeethPeriod, InpTeethShift,
                             InpLipsPeriod, InpLipsShift, MODE_SMMA, PRICE_MEDIAN, MODE_UPPER, i);
      double lower = iGator(NULL, 0, InpJawPeriod, InpJawShift, InpTeethPeriod, InpTeethShift,
                             InpLipsPeriod, InpLipsShift, MODE_SMMA, PRICE_MEDIAN, MODE_LOWER, i);
      UpperBuffer[i] = upper;
      LowerBuffer[i] = lower;
      WakeupArrow[i] = EMPTY_VALUE;

      if(i + 6 >= rates_total)
         continue;

      double sleepingSum = 0;
      for(int k = i + 1; k <= i + 5; k++)
        {
         double u = iGator(NULL, 0, InpJawPeriod, InpJawShift, InpTeethPeriod, InpTeethShift,
                            InpLipsPeriod, InpLipsShift, MODE_SMMA, PRICE_MEDIAN, MODE_UPPER, k);
         double l = iGator(NULL, 0, InpJawPeriod, InpJawShift, InpTeethPeriod, InpTeethShift,
                            InpLipsPeriod, InpLipsShift, MODE_SMMA, PRICE_MEDIAN, MODE_LOWER, k);
         sleepingSum += MathAbs(u) + MathAbs(l);
        }
      double sleepingAvg = sleepingSum / 5.0;
      double currentSum  = MathAbs(upper) + MathAbs(lower);

      if(sleepingAvg > 0 && currentSum > sleepingAvg * InpWakeupRatio)
         WakeupArrow[i] = upper + 10 * Point;
     }

   return(rates_total);
  }

MetaEditorでのコンパイル・実行手順

実際にMT4で動かすまでの手順です。

  1. MetaEditorで新規インジケーター「GatorWakeupIndicator」を作成し、上のコードを貼り付けてコンパイルする
  2. エラー・警告が0件であることを確認する
  3. サブウィンドウに上下2つのヒストグラムが表示されることを確認する
  4. 間隔が急に広がったバーに黄色い矢印が出ることを確認する
  5. InpWakeupRatioの値を大きく(例: 2.0)して矢印の頻度が減ることを確認する

よくあるエラーと注意点

実装でつまずきやすいポイントをまとめます。

modeを両方取得し忘れる

iGatorはiEnvelopesやiBandsと同じく、

MODE_UPPERとMODE_LOWERをそれぞれ、

別の呼び出しで取得する必要があります。

アリゲーターの3線と設定を揃えないと整合しない

既刊iAlligator記事のインジケーターと見比べる場合は、

jaw/teeth/lipsの期間・シフトを同じ値に揃えないと、

2つのインジケーターが示す内容がズレてしまいます。

MQL5移植時にバッファインデックスの対応を忘れる

前述のとおり、MQL5版はmode/shiftの代わりにバッファインデックスを使うため、

MQL4のMODE_UPPER/MODE_LOWERをそのまま渡すと、

コンパイルエラーになります。

既刊のアリゲーター系記事との使い分け

似た目的の記事が複数あるため、使い分けを整理します。

記事 表示する情報 向いている使い方
本記事(iGator) 線同士の間隔(開閉度) トレンドの始まり・レンジの継続を判定
iAlligator記事(既刊) 顎・歯・唇の3本線そのもの 線の位置関係を目で確認
alligator-alignment-indicator記事(既刊) 3本線の並び順判定 トレンドが整った瞬間を判定

よくある質問

iGatorについて、よくある疑問に回答します。

iGatorとiAlligator、どちらを使うべきですか?

目的によって使い分けます。

3本線の位置そのものを見たいならiAlligator、口の開閉という「間隔の変化」

を見たいならiGatorが向いています。

両方を併用し、片方で方向、片方で勢いを確認する使い方もできます。

このインジケーターをEAのフィルターに使えますか?

使えます。

「寝ている→起きた」の判定部分だけを関数化すれば、

既刊alligator-alignment-ea-mt4のような、

トレンドフォローEAのエントリーフィルターに組み込めます。

InpWakeupRatioはどれくらいの値が適切ですか?

通貨ペアや時間足によって適切な値は変わります。

まずは既定値の1.5から始め、

チャートを見ながら矢印の頻度が多すぎないか少なすぎないかを、

調整することをおすすめします。

【MQL4】iGator(ゲーターオシレーター)でアリゲーターの「口の開閉」を検知するインジケーターの作り方:まとめ

iGatorは、

既刊アリゲーター系2記事とは違い、

3本線の並び順ではなく線同士の間隔(開閉度)をヒストグラムで数値化する関数です。

「寝ている」状態から「起きた」瞬間を検知することで、

トレンドの始まりをいち早く捉える手がかりになります。

MQL5では戻り値がハンドルに変わり、

mode/shift引数がバッファインデックスに置き換わる点に注意してください。

関連記事