既刊の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でのコンパイル・バックテスト手順
実際に動かすまでの手順です。
- MetaEditorで新規Expert Advisor「GatorWidthBreakoutEA」を作成し、上のコードを貼り付ける
- F7キー(またはコンパイルボタン)でコンパイルし、「0 error(s), 0 warning(s)」になることを確認する
- ストラテジーテスターでこのEAを選択し、任意の通貨ペア・期間でバックテストを実行する
- 「結果」タブで、高値・安値の突破と広がりの増加が重なった直後にエントリーが発生していることを確認する
- 既刊の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つで、
調整できる構成にしています。
コメント