既刊のアリゲーター並び順インジケーターの記事は、顎・歯・唇3本の並び順が整った瞬間にヒストグラムを出す、

表示専用の設計でした。

では、ヒストグラムに気づいて自分で発注する手間を、

そのままEAの発注条件に置き換えてしまえばどうなるでしょうか。

この記事では、並び順の判定ロジックを発注条件に転用し、

損切り必須・ポジション重複防止を備えたトレンドフォローEAに仕立てる方法を解説します。

この記事で分かること
・既刊インジケーターの判定ロジックをEA化する考え方
・並び順が崩れた状態から整った状態への切り替わりをエントリー条件にする設計
・損切り必須
・ポジション重複防止の書き方
・実際に動くEAのコード全体
  1. 既刊インジケーターとの関係(表示専用から発注条件へ)
    1. 既刊アリゲーター並び順インジケーターの振り返り
    2. 「並び順が整った瞬間」をエントリー条件にする設計
    3. 順張りEAとしての位置づけ
  2. iAlligator関数と並び順判定関数
    1. iAlligatorのシグネチャとMODE定数
    2. 並び順を判定するGetAlignmentState関数
    3. 絡み合い状態(0)はエントリーしない
  3. 発注条件・損切り・ポジション重複の防止
    1. 並び順が整った”瞬間”を検知する
    2. 損切り・利確を必ず指定する
    3. ポジション重複を防ぐチェック
  4. 実際に動くアリゲーター並び順EAのコード全体
    1. MetaEditorでのコンパイル・実行手順
  5. よくあるエラーと注意点
    1. レンジ相場でエントリーと損切りを繰り返す
    2. コンパイルエラーになる
    3. 利確に達する前にトレンドが終わってしまう
  6. MQL4とMQL5の違い
    1. MQL4は値を直接返す方式
    2. MQL5はハンドル方式に変わる
    3. 並び順の判定ロジックはMQL5でも応用可能
  7. このEAの使いどころと限界
    1. 絡み合いから抜け出す初動に強い
    2. 手仕舞いのロジックは別途必要
  8. よくある質問
    1. 既刊インジケーターと同時に使う必要がありますか?
    2. 口の開き具合(強さ)は考慮されていますか?
    3. 逆張りEAと同時に動かしても大丈夫ですか?
    4. パーフェクトオーダー系のEAとの違いは何ですか?
  9. 【MQL4】アリゲーターの「並び順」が確定した瞬間にエントリーするトレンドフォローEAの作り方(損切り必須・ポジション重複防止つき):まとめ
    1. 関連記事

既刊インジケーターとの関係(表示専用から発注条件へ)

まず、インジケーターとEAで判定ロジックをどう使い分けるかを整理します。

既刊アリゲーター並び順インジケーターの振り返り

既刊の記事では、顎(JAW)・歯(TEETH)・唇(LIPS)3本の値の大小関係から、

「唇 > 歯 > 顎」なら上昇の並び、「唇 < 歯 < 顎」なら下降の並び、どちらでもなければ絡み合い(レンジ)と判定しました。

「並び順が整った瞬間」をエントリー条件にする設計

本記事のEAは、この判定関数をそのまま`OnTick()`内に移し、

ヒストグラムの代わりに発注を実行させます。

補足
・このEAは並び順が整った瞬間にエントリーする順張り設計
・『いつ並び順が崩れてトレンドが終わるか』は判定していない
・利確
・トレーリングストップの設定で手仕舞いのタイミングを補う必要がある

順張りEAとしての位置づけ

既刊のCCI逆張りEA・Williams%R逆張りEA等とは逆方向の発想で、

トレンドが続く方向へ乗っていく、順張り型のEAです。

iAlligator関数と並び順判定関数

発注条件の土台になる判定ロジックを確認します。

iAlligatorのシグネチャとMODE定数

double iAlligator(
   string symbol,
   int    timeframe,
   int    jaw_period,
   int    jaw_shift,
   int    teeth_period,
   int    teeth_shift,
   int    lips_period,
   int    lips_shift,
   int    ma_method,
   int    applied_price,
   int    mode,
   int    shift
);

`mode`に`MODE_GATORJAW`・`MODE_GATORTEETH`・

`MODE_GATORLIPS`を指定すると、

それぞれ顎・歯・唇の値が取得できます。

標準パラメーターは13/8・8/5・5/3、

`ma_method`は`MODE_SMMA`、

`applied_price`は`PRICE_MEDIAN`です。

並び順を判定するGetAlignmentState関数

int GetAlignmentState(int shift)
  {
   double jaw   = iAlligator(NULL, 0, InpJawPeriod, InpJawShift,
                              InpTeethPeriod, InpTeethShift,
                              InpLipsPeriod, InpLipsShift,
                              MODE_SMMA, PRICE_MEDIAN, MODE_GATORJAW, shift);
   double teeth = iAlligator(NULL, 0, InpJawPeriod, InpJawShift,
                              InpTeethPeriod, InpTeethShift,
                              InpLipsPeriod, InpLipsShift,
                              MODE_SMMA, PRICE_MEDIAN, MODE_GATORTEETH, shift);
   double lips  = iAlligator(NULL, 0, InpJawPeriod, InpJawShift,
                              InpTeethPeriod, InpTeethShift,
                              InpLipsPeriod, InpLipsShift,
                              MODE_SMMA, PRICE_MEDIAN, MODE_GATORLIPS, shift);

   if(jaw == 0 || teeth == 0 || lips == 0)
      return(0);

   if(lips > teeth && teeth > jaw)
      return(1);
   if(lips < teeth && teeth < jaw)
      return(-1);
   return(0);
  }

既刊インジケーターと同じ、唇・歯・顎の大小関係だけを見る関数です。

絡み合い状態(0)はエントリーしない

3本が絡み合っている状態(戻り値0)は、既刊インジケーターと同様にレンジ相場として扱い、

このEAでも新規エントリーの対象にはしません。

発注条件・損切り・ポジション重複の防止

判定だけでは発注にならないため、安全策を組み込みます。

並び順が整った”瞬間”を検知する

bool BuySignal()
  {
   return(GetAlignmentState(1) == 1 && GetAlignmentState(2) != 1);
  }

bool SellSignal()
  {
   return(GetAlignmentState(1) == -1 && GetAlignmentState(2) != -1);
  }

確定済みの1本前(shift=1)が整っていて、

2本前(shift=2)はまだ整っていなかった場合だけを、

エントリーのシグナルにします。

形成中の0番目の足を基準にしないのは、既刊のバンドウォークEAと同じく、

リペイント(後からサインが変わる現象)を避けるための設計です。

損切り・利確を必ず指定する

double sl = Ask - InpStopLossPips * point;
double tp = Ask + InpTakeProfitPips * point;
OrderSend(_Symbol, OP_BUY, InpLots, Ask, 3, sl, tp, "AlligatorAlign", InpMagic, 0, clrBlue);

損切り(`sl`)・利確(`tp`)を発注時点で必ず指定し、未設定のまま放置しません。

ポジション重複を防ぐチェック

bool HasOpenPosition()
  {
   for(int i = 0; i < OrdersTotal(); i++)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) &&
         OrderSymbol() == _Symbol && OrderMagicNumber() == InpMagic)
         return(true);
     }
   return(false);
  }

同じマジックナンバー・同じ通貨ペアでポジションが既にあるかを確認し、

あれば新規エントリーをスキップします。

実際に動くアリゲーター並び順EAのコード全体

ここまでの要素をまとめた、EAの全体です。

//+------------------------------------------------------------------+
//|                                   AlligatorAlignmentEA.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

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 InpLots           = 0.1;  //発注ロット数
input int    InpStopLossPips   = 300;  //損切り(pips)
input int    InpTakeProfitPips = 600;  //利確(pips)
input int    InpMagic          = 20261018; //マジックナンバー

int GetAlignmentState(int shift)
  {
   double jaw   = iAlligator(NULL, 0, InpJawPeriod, InpJawShift,
                              InpTeethPeriod, InpTeethShift,
                              InpLipsPeriod, InpLipsShift,
                              MODE_SMMA, PRICE_MEDIAN, MODE_GATORJAW, shift);
   double teeth = iAlligator(NULL, 0, InpJawPeriod, InpJawShift,
                              InpTeethPeriod, InpTeethShift,
                              InpLipsPeriod, InpLipsShift,
                              MODE_SMMA, PRICE_MEDIAN, MODE_GATORTEETH, shift);
   double lips  = iAlligator(NULL, 0, InpJawPeriod, InpJawShift,
                              InpTeethPeriod, InpTeethShift,
                              InpLipsPeriod, InpLipsShift,
                              MODE_SMMA, PRICE_MEDIAN, MODE_GATORLIPS, shift);

   if(jaw == 0 || teeth == 0 || lips == 0)
      return(0);

   if(lips > teeth && teeth > jaw)
      return(1);
   if(lips < teeth && teeth < jaw)
      return(-1);
   return(0);
  }

bool BuySignal()
  {
   return(GetAlignmentState(1) == 1 && GetAlignmentState(2) != 1);
  }

bool SellSignal()
  {
   return(GetAlignmentState(1) == -1 && GetAlignmentState(2) != -1);
  }

bool HasOpenPosition()
  {
   for(int i = 0; i < OrdersTotal(); i++)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) &&
         OrderSymbol() == _Symbol && OrderMagicNumber() == InpMagic)
         return(true);
     }
   return(false);
  }

void OnTick()
  {
   if(HasOpenPosition())
      return;

   double point = _Point;
   if(_Digits == 3 || _Digits == 5)
      point *= 10;

   if(BuySignal())
     {
      double sl = Ask - InpStopLossPips * point;
      double tp = Ask + InpTakeProfitPips * point;
      int ticket = OrderSend(_Symbol, OP_BUY, InpLots, Ask, 3, sl, tp,
                             "AlligatorAlign", InpMagic, 0, clrBlue);
      if(ticket < 0)
         Print("買い発注に失敗しました。エラーコード: ", GetLastError());
     }
   else if(SellSignal())
     {
      double sl = Bid + InpStopLossPips * point;
      double tp = Bid - InpTakeProfitPips * point;
      int ticket = OrderSend(_Symbol, OP_SELL, InpLots, Bid, 3, sl, tp,
                             "AlligatorAlign", InpMagic, 0, clrRed);
      if(ticket < 0)
         Print("売り発注に失敗しました。エラーコード: ", GetLastError());
     }
  }

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

  1. MetaEditorで新規Expert Advisor「AlligatorAlignmentEA」を作成し、上のコードを貼り付けてコンパイルする
  2. F7キーでコンパイルし、「0 error(s), 0 warning(s)」になることを確認する
  3. ストラテジーテスターでこのEAを選択し、任意の通貨ペア・期間でバックテストを実行する
  4. 「結果」タブで、並び順確定直後にエントリーが発生していることを確認する

よくあるエラーと注意点

実際に運用する前に、確認しておきたい点です。

レンジ相場でエントリーと損切りを繰り返す

注意
・アリゲーターの並び順は絡み合いから整うまでに時間がかかる分、エントリーが遅れがち
・整った直後に失速する「ダマシ」も発生する
・既刊の効率比
・ADX系インジケーターと組み合わせたフィルターの追加を推奨する

コンパイルエラーになる

`iAlligator()`の引数を12個すべて指定しているか確認してください。

唇だけ欲しい場合でも、顎・歯の期間とシフトは省略できません。

利確に達する前にトレンドが終わってしまう

固定pipsの利確(`InpTakeProfitPips`)では、

トレンドが利確ラインに届く前に終わることがあります。

トレーリングストップへの変更も検討してください。

MQL4とMQL5の違い

アリゲーターの扱い方に関する2言語の違いを確認します。

MQL4は値を直接返す方式

MQL4の`iAlligator()`は、

呼び出すたびに顎・歯・唇のいずれか1本の値を直接返します。

MQL5はハンドル方式に変わる

MQL5では`iAlligator()`がハンドルを返す方式になり、

バッファ番号0(顎)・1(歯)・2(唇)を

`CopyBuffer()`で取得する設計に変わります。

並び順の判定ロジックはMQL5でも応用可能

「3本の大小関係だけを比較する」という考え方自体は、

MQL5にハンドル方式で移植する場合でも、

そのまま応用できます。

このEAの使いどころと限界

得意な場面と、単独では対応しきれない場面を整理します。

絡み合いから抜け出す初動に強い

長い絡み合い(レンジ)の後に並び順が整うケースであれば、

トレンドの初動を捉えやすくなります。

手仕舞いのロジックは別途必要

このEAは「乗る」ことに特化しており、「いつ降りるか」は固定の利確・損切りに任せています。

より精緻な手仕舞いをしたい場合は、並び順が崩れた時点で決済する関数を追加してください。

よくある質問

アリゲーター並び順EAについて、よく検索される疑問に回答します。

実践アドバイス
・既刊インジケーターと同時に使えば、判定の根拠を目視でも確認できる
・InpStopLossPips/InpTakeProfitPipsは通貨ペア
・時間足でバックテストして調整する
・絡み合いが長いほど、整った直後のエントリーが遅れやすい点を理解しておく

既刊インジケーターと同時に使う必要がありますか?

必須ではありません。

このEAは判定ロジックを内部に持っているため単独で動作しますが、

目視で経過を確認したい場合は既刊インジケーターを併用してください。

口の開き具合(強さ)は考慮されていますか?

このEAは並び順(方向)だけを見ており、既刊のiAlligator関数の使い方の記事で扱った「口の開き具合(強さ)」

は条件に含めていません。

強さのフィルターを追加したい場合は、

顎と唇の差が一定pips以上あることを条件に加える改造が有効です。

逆張りEAと同時に動かしても大丈夫ですか?

マジックナンバーを別の値にしておけば、

既刊のCCI逆張りEA等と同じ口座で同時に動かすこと自体は可能です。

ただし、同じ通貨ペアで逆方向のEAを動かすと、

意図がぶつかる場面があるため注意してください。

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

考え方自体は「短期・中期・長期の並び順で方向を見る」という共通点がありますが、

このEAはアリゲーター専用の平滑化移動平均(SMMA)と未来シフトを使う点が異なります。

【MQL4】アリゲーターの「並び順」が確定した瞬間にエントリーするトレンドフォローEAの作り方(損切り必須・ポジション重複防止つき):まとめ

この記事では、既刊のアリゲーター並び順インジケーターの判定ロジックを、

そのままEAの発注条件に転用する方法を解説しました。

損切り必須・ポジション重複防止という最低限の安全策を備えつつ、

手仕舞いのロジックは今後の改善点として残しています。

関連記事