iAlligator関数の使い方の記事では、顎・歯・唇3本の「開き具合」

を数値化し、トレンドの強さを判定する方法を解説しました。

ただし「強さ」が分かっても、「上に向かっているのか下に向かっているのか」

という方向までは分かりません。

この記事では、3本の値そのものではなく、3本の「並び順」だけに注目し、

上昇の並び・下降の並び・絡み合いの3状態を判定して、

ヒストグラムで表示するインジケーターを解説します。

「並び順」で方向が分かる理由

アリゲーターの3本は、期間の長さが異なります。

唇(LIPS)が一番短期で価格に近く、

歯(TEETH)が中期、

顎(JAW)が一番長期です。

上昇トレンドでは、短期の平均線ほど価格に近い位置まで素早く追随するため、

「唇 > 歯 > 顎」という並びになりやすくなります。

逆に下降トレンドでは、この並びが反転し「唇 < 歯 < 顎」になります。

要点: 3本の値の大小関係そのものが、

移動平均線が短期・中期・長期の順に

きれいに並んでいるかを意味する

「パーフェクトオーダー」の考え方と同じです。

顎・歯・唇はもともと期間の異なる移動平均線なので、

この判定方法がそのまま使えます。

3状態を判定する関数

iAlligator関数の使い方の記事で解説した通り、

3本の値は`MODE_GATORJAW`・`MODE_GATORTEETH`、

`MODE_GATORLIPS`で取得できます。

上昇の並び・下降の並びを判定する

3本の値を比較し、

「唇 > 歯 > 顎」なら上昇の並び、

「唇 < 歯 < 顎」なら下降の並びと判定します。

if(lips > teeth && teeth > jaw)
   state = 1;//上昇の並び
else if(lips < teeth && teeth < jaw)
   state = -1;//下降の並び
else
   state = 0;//絡み合っている(並び順が崩れている)

どちらでもない場合は「絡み合い」として扱う

3本の値がこの2パターンのどちらにも当てはまらない場合は、

3本が絡み合っているレンジ状態と判定します。

補足: 絡み合い状態を「エラー」や「判定不能」として

除外するのではなく、

第3の状態として明示的に扱うことで、

「今はどちらにも偏っていない」という情報自体を

トレードフィルターとして活用できます。

実際に動くコード全体(並び順をヒストグラム表示)

上昇の並びを緑、下降の並びを赤のヒストグラムで、サブウィンドウに表示する、

実際にMetaEditorでコンパイルできるインジケーターです。

//+------------------------------------------------------------------+
//|                                AlligatorAlignment.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 2
#property indicator_color1 Lime
#property indicator_color2 Red
#property indicator_minimum -1.2
#property indicator_maximum 1.2

input int JawPeriod   = 13;//顎の期間
input int JawShift    = 8;//顎のシフト
input int TeethPeriod = 8;//歯の期間
input int TeethShift  = 5;//歯のシフト
input int LipsPeriod  = 5;//唇の期間
input int LipsShift   = 3;//唇のシフト

double BullBuffer[];
double BearBuffer[];

//+------------------------------------------------------------------+
//| Custom indicator initialization function                         |
//+------------------------------------------------------------------+
int OnInit()
  {
   SetIndexBuffer(0,BullBuffer);
   SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,4);
   SetIndexEmptyValue(0,EMPTY_VALUE);

   SetIndexBuffer(1,BearBuffer);
   SetIndexStyle(1,DRAW_HISTOGRAM,STYLE_SOLID,4);
   SetIndexEmptyValue(1,EMPTY_VALUE);

   IndicatorShortName("Alligator Alignment");
   return(INIT_SUCCEEDED);
  }

//+------------------------------------------------------------------+
//| Custom indicator iteration function                              |
//+------------------------------------------------------------------+
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 neededBars = JawPeriod+JawShift+3;
   if(rates_total < neededBars)
      return(0);

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

   for(int i=limit;i>=0;i--)
     {
      double jaw   = iAlligator(NULL,0,JawPeriod,JawShift,TeethPeriod,TeethShift,LipsPeriod,LipsShift,MODE_SMMA,PRICE_MEDIAN,MODE_GATORJAW,i);
      double teeth = iAlligator(NULL,0,JawPeriod,JawShift,TeethPeriod,TeethShift,LipsPeriod,LipsShift,MODE_SMMA,PRICE_MEDIAN,MODE_GATORTEETH,i);
      double lips  = iAlligator(NULL,0,JawPeriod,JawShift,TeethPeriod,TeethShift,LipsPeriod,LipsShift,MODE_SMMA,PRICE_MEDIAN,MODE_GATORLIPS,i);

      if(jaw==0 || teeth==0 || lips==0)
        {
         BullBuffer[i]=EMPTY_VALUE;
         BearBuffer[i]=EMPTY_VALUE;
         continue;
        }

      if(lips > teeth && teeth > jaw)
        {
         BullBuffer[i]=1;
         BearBuffer[i]=EMPTY_VALUE;
        }
      else if(lips < teeth && teeth < jaw)
        {
         BearBuffer[i]=-1;
         BullBuffer[i]=EMPTY_VALUE;
        }
      else
        {
         BullBuffer[i]=EMPTY_VALUE;
         BearBuffer[i]=EMPTY_VALUE;
        }
     }

   return(rates_total);
  }
//+------------------------------------------------------------------+

MetaEditorで実際に動かす手順

  1. MT4のMetaEditorで「ファイル」→「新規作成」→「カスタムインディケータ」を選ぶ
  2. 「AlligatorAlignment」という名前で作成し、テンプレートの中身をすべて削除してコード全体を貼り付ける
  3. F7キーでコンパイルし、「0 error(s), 0 warning(s)」になることを確認する
  4. チャートへ適用し、MT4標準のアリゲーターインジケーターも同時に表示する
  5. 標準アリゲーターの3本がきれいに並んでいる場面で緑または赤のヒストグラムが出ることを目視で確認する

この判定の使いどころと限界

このインジケーターは「今の並び順」だけを見ており、口の開き具合の記事で解説した「強さ」

の情報は含んでいません。

並び順が上昇でも、

3本がわずかな差でしか並んでいなければ、

トレンドとしてはまだ弱い可能性があります。

注意: 方向(並び順)と強さ(口の開き具合)は、

別々のインジケーターとして分けて実装しています。

両方を1本のEAの条件式に組み込むことで、

「上昇の並びで、かつ口の開き具合が一定以上」

というように、方向と強さの両方を条件にできます。

よくあるエラー・意図と違う動きになるとき

  • コンパイルエラーになる: `iAlligator()`の引数を10個すべて指定しているか確認する。唇だけ欲しい場合でも顎・歯の期間とシフトは省略できない
  • ヒストグラムがほとんど表示されない: 3本が絡み合っている(レンジ)状態が続いている可能性がある。標準アリゲーターを同時に表示し、実際の並びと見比べる
  • 方向がすぐに切り替わって安定しない: レンジ相場でダマシが起きやすい仕様のため、切り替わりの回数をカウントして「一定本数以上続いたら」というフィルターを追加する改造が有効
  • 値がEMPTY_VALUEのままになる: 表示直後でヒストリーデータの本数が`neededBars`に届いていない可能性がある。しばらく待つか履歴データをダウンロードし直す

よくある質問

アリゲーターの並び順判定でよく検索されている疑問を、3つにまとめて回答します。

パーフェクトオーダーとの違いは何ですか?

移動平均線のパーフェクトオーダーは、

一般的に3本の単純移動平均線(SMA)を使いますが、

このインジケーターはアリゲーター専用の

平滑化移動平均(SMMA)と未来シフトを使う点が異なります。

考え方自体はどちらも「短期・中期・長期の並び順で方向を見る」

という共通点があります。

EAのエントリー条件にそのまま使えますか?

この記事のコードは表示専用のインジケーターです。

`state`の値を計算する部分(if文)だけを、

EAの`OnTick()`内にそのままコピーすれば、

エントリー条件として使えます。

上位足の並び順を確認する方法はありますか?

`iAlligator()`の第2引数(timeframe)に、

`PERIOD_H4`等の上位足を指定すれば、

下位足のチャートのまま上位足の並び順を取得できます。

マルチタイムフレームで環境認識をしたい場合に応用してください。

【MQL4】アリゲーターの顎・歯・唇「並び順」だけを判定してヒストグラム表示するインジケーター:まとめ

この記事では、アリゲーターの顎・歯・唇3本の値そのものではなく、

「並び順」だけに注目して、

上昇の並び・下降の並び・絡み合いの3状態を判定するインジケーターを解説しました。

ポイントは、絡み合っている状態を判定不能として捨てるのではなく、

明示的な第3の状態として扱うことです。

口の開き具合の記事と組み合わせれば、

「方向」と「強さ」の両方を数値で判定できるようになり、

裁量トレードでもEA開発でも使える環境認識の材料が揃います。

関連記事