既刊のアリゲーター並び順インジケーターの記事は、顎・歯・唇3本の並び順が整った瞬間にヒストグラムを出す、
表示専用の設計でした。
では、ヒストグラムに気づいて自分で発注する手間を、
そのままEAの発注条件に置き換えてしまえばどうなるでしょうか。
この記事では、並び順の判定ロジックを発注条件に転用し、
損切り必須・ポジション重複防止を備えたトレンドフォローEAに仕立てる方法を解説します。
・既刊インジケーターの判定ロジックをEA化する考え方
・並び順が崩れた状態から整った状態への切り替わりをエントリー条件にする設計
・損切り必須
・ポジション重複防止の書き方
・実際に動くEAのコード全体
既刊インジケーターとの関係(表示専用から発注条件へ)
まず、インジケーターと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でのコンパイル・実行手順
- MetaEditorで新規Expert Advisor「AlligatorAlignmentEA」を作成し、上のコードを貼り付けてコンパイルする
- F7キーでコンパイルし、「0 error(s), 0 warning(s)」になることを確認する
- ストラテジーテスターでこのEAを選択し、任意の通貨ペア・期間でバックテストを実行する
- 「結果」タブで、並び順確定直後にエントリーが発生していることを確認する
よくあるエラーと注意点
実際に運用する前に、確認しておきたい点です。
レンジ相場でエントリーと損切りを繰り返す
・アリゲーターの並び順は絡み合いから整うまでに時間がかかる分、エントリーが遅れがち
・整った直後に失速する「ダマシ」も発生する
・既刊の効率比
・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の発注条件に転用する方法を解説しました。
損切り必須・ポジション重複防止という最低限の安全策を備えつつ、
手仕舞いのロジックは今後の改善点として残しています。
コメント