既刊のiGatorインジケーターの記事では、

顎・歯・唇の差をヒストグラムで可視化し、

口が開き始めた瞬間を検知する設計を解説しました。

この記事ではその値を発注の起点には使わず、

直近高値・安値のブレイクアウトという別の発注条件に、

口の広がりが増えているかどうかのフィルターとして組み込むEAを作ります。

この記事で分かること
・既刊アリゲーター整列EAとの判定軸の違い
・ブレイクアウト+広がりフィルターという2段構えの設計
・iGatorの幅(広がり)を計算する書き方
・実際に動くEAのコード全体

設計思想: なぜ整列判定ではなく「広がりの変化」を使うのか

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

既刊iGatorインジケーターのおさらい

既刊インジケーターは、

上下2本のヒストグラムの幅が、

直前バーより一定倍率以上増えた瞬間を、

「開き始め」として矢印で知らせる設計でした。

既刊アリゲーター整列EAとの違い

このサイトには、アリゲーター系の判定を、

発注条件にするEAが既にあります。

EA 判定方法 見ているもの
既刊アリゲーター整列EA 顎・歯・唇3本の並び順 3本線の位置関係
本記事(iGator幅フィルターEA) ブレイクアウト+幅の広がり 価格の突破+勢いの裏付け

既刊EAは、3本の並び順そのものを発注の起点にしていましたが、

本記事はiGatorの値を発注の起点にせず、

価格のブレイクアウトを裏付けるフィルターとして使います。

ブレイクアウト+フィルターという設計思想

補足
・価格のブレイクアウトだけだと、フェイク(すぐ戻る動き)に反応しやすい
・口が閉じた(狭まった)状態でのブレイクアウトは、勢いが伴っていない可能性がある
・口の広がりが同時に増えていれば、トレンドの勢いが裏付けとして伴っていると判断する

価格が直近高値・安値を突破しただけでは、

すぐに元の値動きへ戻ってしまう場面が少なくありません。

本記事は、その突破と同時に、

アリゲーターの口も広がっているかを確認します。

iGator関数のシグネチャ(既刊記事で確認済み)

既刊igator-mt4.mdで確認済みの引数構成を再掲します。

12個の引数の意味

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

既刊記事と同じ、顎・歯・唇の6引数構成をそのまま使います。

上下ヒストグラムの幅(広がり)を計算する

double upper     = iGator(_Symbol, 0, InpJawP, InpJawS, InpTeethP, InpTeethS, InpLipsP, InpLipsS, MODE_SMMA, PRICE_MEDIAN, MODE_UPPER, 1);
double lower     = iGator(_Symbol, 0, InpJawP, InpJawS, InpTeethP, InpTeethS, InpLipsP, InpLipsS, MODE_SMMA, PRICE_MEDIAN, MODE_LOWER, 1);
double upperPrev = iGator(_Symbol, 0, InpJawP, InpJawS, InpTeethP, InpTeethS, InpLipsP, InpLipsS, MODE_SMMA, PRICE_MEDIAN, MODE_UPPER, 2);
double lowerPrev = iGator(_Symbol, 0, InpJawP, InpJawS, InpTeethP, InpTeethS, InpLipsP, InpLipsS, MODE_SMMA, PRICE_MEDIAN, MODE_LOWER, 2);

double widthNow  = MathAbs(upper) + MathAbs(lower);
double widthPrev = MathAbs(upperPrev) + MathAbs(lowerPrev);
bool   widening  = (widthPrev > 0 && widthNow > widthPrev * InpWidenRatio);

上下の絶対値を足した合計が、

前のバーよりどれだけ増えたかで、広がりの勢いを判定します。

価格のブレイクアウト判定

double highestLevel = High[iHighest(_Symbol, 0, MODE_HIGH, InpBreakoutPeriod, 2)];
double lowestLevel  = Low[iLowest(_Symbol, 0, MODE_LOW, InpBreakoutPeriod, 2)];

bool breakoutUp   = (Close[1] > highestLevel);
bool breakoutDown = (Close[1] < lowestLevel);

直近バー(shift1)を含めない、

2本前からInpBreakoutPeriod本分の高値・安値を基準にします。

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

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

買い・売りの発注条件

bool buySignal  = (breakoutUp && widening);
bool sellSignal = (breakoutDown && widening);

ブレイクアウトと、口の広がりが同時に成立したときだけ発注します。

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

`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の全体です。

//+------------------------------------------------------------------+
//|                                   GatorWidthBreakoutEA.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    InpJawP             = 13;
input int    InpJawS             = 8;
input int    InpTeethP           = 8;
input int    InpTeethS           = 5;
input int    InpLipsP            = 5;
input int    InpLipsS            = 3;
input double InpWidenRatio       = 1.2;        //広がり判定の倍率
input int    InpBreakoutPeriod   = 20;         //ブレイクアウト判定の本数
input double InpLots             = 0.1;        //発注ロット数
input int    InpStopLossPips     = 300;        //損切り(pips)
input int    InpTakeProfitPips   = 600;        //利確(pips)
input int    InpMagic            = 20261106;   //マジックナンバー

datetime lastBarTime = 0;

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(Time[0] == lastBarTime)
      return;
   lastBarTime = Time[0];

   int needed = InpJawP + InpJawS + InpBreakoutPeriod + 5;
   if(Bars < needed)
      return;

   double upper     = iGator(_Symbol, 0, InpJawP, InpJawS, InpTeethP, InpTeethS, InpLipsP, InpLipsS, MODE_SMMA, PRICE_MEDIAN, MODE_UPPER, 1);
   double lower     = iGator(_Symbol, 0, InpJawP, InpJawS, InpTeethP, InpTeethS, InpLipsP, InpLipsS, MODE_SMMA, PRICE_MEDIAN, MODE_LOWER, 1);
   double upperPrev = iGator(_Symbol, 0, InpJawP, InpJawS, InpTeethP, InpTeethS, InpLipsP, InpLipsS, MODE_SMMA, PRICE_MEDIAN, MODE_UPPER, 2);
   double lowerPrev = iGator(_Symbol, 0, InpJawP, InpJawS, InpTeethP, InpTeethS, InpLipsP, InpLipsS, MODE_SMMA, PRICE_MEDIAN, MODE_LOWER, 2);

   double widthNow  = MathAbs(upper) + MathAbs(lower);
   double widthPrev = MathAbs(upperPrev) + MathAbs(lowerPrev);
   bool   widening  = (widthPrev > 0 && widthNow > widthPrev * InpWidenRatio);

   double highestLevel = High[iHighest(_Symbol, 0, MODE_HIGH, InpBreakoutPeriod, 2)];
   double lowestLevel  = Low[iLowest(_Symbol, 0, MODE_LOW, InpBreakoutPeriod, 2)];

   bool breakoutUp   = (Close[1] > highestLevel);
   bool breakoutDown = (Close[1] < lowestLevel);

   bool buySignal  = (breakoutUp && widening);
   bool sellSignal = (breakoutDown && widening);

   if(HasOpenPosition())
      return;

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

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

ブレイクアウトと広がりの両方が揃った瞬間だけ、新規エントリーが発生します。

MetaEditorでのコンパイル・バックテスト手順

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

  1. MetaEditorで新規Expert Advisor「GatorWidthBreakoutEA」を作成し、上のコードを貼り付ける
  2. F7キー(またはコンパイルボタン)でコンパイルし、「0 error(s), 0 warning(s)」になることを確認する
  3. ストラテジーテスターでこのEAを選択し、任意の通貨ペア・期間でバックテストを実行する
  4. 「結果」タブで、高値・安値の突破と広がりの増加が重なった直後にエントリーが発生していることを確認する
  5. 既刊のiGatorインジケーターを同時に表示し、エントリー時のヒストグラムの幅を目視で確認する

よくあるエラーと注意点

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

InpWidenRatioを厳しすぎる値にする

注意
・倍率を極端に大きくすると、何週間もエントリーが発生しなくなる
・まずは初期値1.2倍のまま過去チャートで頻度を確認する
・通貨ペアや時間足によって適切な倍率は変わる

ブレイクアウト幅の計算に直近バーを含めてしまう

highestLevel/lowestLevelの計算で、

shift1(直近確定バー)自体を含めてしまうと、

「そのバー自身を基準にそのバー自身を判定する」

という循環が起きるため、shift2から数えています。

既刊アリゲーター整列EAと混同する

既刊整列EAは、3本の並び順が整うまでエントリーしませんが、

本EAは並び順を一切見ておらず、

価格のブレイクアウトと幅の広がりだけで判定します。

両者は同時にシグナルを出すとは限りません。

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

似た「アリゲーター系」の記事が複数あるため、使い分けを整理します。

記事 判定方法 用途
本記事(iGator幅フィルターEA) ブレイクアウト+幅の広がり 勢いの裏付けがあるブレイクアウトだけ狙う
既刊アリゲーター整列EA 3本の並び順 トレンド方向が明確になってから追随する
既刊iGator記事(インジケーター) 幅の変化を矢印表示 開き始めを目視で確認する

よくある質問

iGator幅フィルターEAについて、よくある疑問に回答します。

既刊アリゲーター整列EAと何が違いますか?

判定の起点が違います。

既刊整列EAは3本の並び順そのものを発注条件にしていますが、

本記事は価格のブレイクアウトを発注条件にし、

iGatorの広がりはその裏付けフィルターとして使っています。

InpBreakoutPeriodはどれくらいが適切ですか?

本記事の初期値20本は目安です。

短くすると反応が早くなりますが、

フェイクブレイクに反応する頻度も増えるため、

チャートを見ながら調整してください。

口が閉じている(狭まっている)ときはどうなりますか?

widthPrevがwidthNowより大きいか同程度の場合、

wideningがfalseになるため、

ブレイクアウトが起きてもエントリーしません。

【MQL4】iGatorの「口の広がり」をブレイクアウトEAのフィルターに使う作り方(既刊アリゲーター整列EAとの判定軸の違いも解説):まとめ

この記事では、既刊iGatorインジケーターの値を発注の起点にせず、

直近高値・安値のブレイクアウトという発注条件に、

口の広がりが増えているかのフィルターとして組み込むEAを解説しました。

既刊アリゲーター整列EAが3本の並び順を発注の起点にしていたのに対し、

本記事は価格のブレイクアウトを起点にし、

iGatorの幅の変化を裏付けとして使う設計で差別化しています。

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

InpWidenRatio・InpBreakoutPeriodの2つで、

調整できる構成にしています。

関連記事