MT4標準の「アリゲーター(ワニ)」
インジケーターは、顎(あご)・歯・唇という3本の移動平均線が
絡み合っているか大きく開いているかで、
レンジ相場かトレンド相場かを判断する裁量トレーダーに人気の指標です。
ところがこれをコードで`iAlligator()`から取得しようとすると、
引数が10個もある長い関数で、
しかも顎(JAW)・歯(TEETH)・唇(LIPS)のどれが
どのモード定数に対応するのか混乱しがちです。
さらに厄介なのは、唇の値1本だけが欲しい場合でも、
顎と歯の期間・シフトまで省略できず、
毎回フルセットで渡さなければならない点です。
この記事では、この10引数の書式を迷わず書けるようにする覚え方と、
3本の値から「口の開き具合」
を1本の数値に変換して、
環境認識(トレンドの強さ判定)に使う実際に動くインジケーターを解説します。
iAlligator関数の書式
double iAlligator( string symbol, //通貨ペア(NULLで現在のチャート) int timeframe, //時間足(0で現在のチャートの時間足) int jaw_period, //顎(青)の期間、標準13 int jaw_shift, //顎の水平シフト、標準8 int teeth_period, //歯(赤)の期間、標準8 int teeth_shift, //歯の水平シフト、標準5 int lips_period, //唇(緑)の期間、標準5 int lips_shift, //唇の水平シフト、標準3 int ma_method, //平滑化の方法、標準MODE_SMMA int applied_price, //適用価格、標準PRICE_MEDIAN int mode, //MODE_GATORJAW/MODE_GATORTEETH/MODE_GATORLIPS int shift //何本前の足を見るか );
引数の数自体は多いものの、期間とシフトの組み合わせが「顎→歯→唇」
の順に3セット並んでいるだけ、
と分解して覚えると混乱しにくくなります。
3本の名前と役割を取り違えないための覚え方
顎・歯・唇は、動物の口の構造をそのままイメージすると役割を思い出しやすくなります。
- 顎(JAW): 一番外側にあり、期間が最も長い(13本)。動きが一番ゆっくりで、口の外枠にあたる
- 歯(TEETH): 真ん中の期間(8本)。顎と唇の中間の動き
- 唇(LIPS): 一番内側にあり、期間が最も短い(5本)。動きが一番速く、価格に一番近い位置にくる
「期間が長い(=動きが遅い)ものほど外側、
期間が短い(=動きが速い)ものほど内側で価格に近い」
という関係を覚えておけば、モード定数と役割を取り違えにくくなります。
double jaw = iAlligator(NULL,0,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_GATORJAW,0); double teeth = iAlligator(NULL,0,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_GATORTEETH,0); double lips = iAlligator(NULL,0,13,8,8,5,5,3,MODE_SMMA,PRICE_MEDIAN,MODE_GATORLIPS,0);
唇の値だけが欲しい場合でも、
顎・歯の期間とシフト(第3〜第6引数)を省略することはできません。
これは`iAlligator()`が内部で
3本すべてを同じ関数で計算する設計になっているためで、
省略可能な引数ではない点に注意してください。
なお、3本の線はチャート上で未来方向にシフトして表示されますが、
既存記事(一目均衡表の雲抜けインジケーター)の先行スパンと同様に、
`iAlligator()`は内部でシフト済みの値を返す関数のため、
`shift`引数に自分で`jaw_shift`等を足す必要はありません。
3本から「口の開き具合」を数値化する
裁量トレードでは「3本が絡み合っている(口を閉じている)ときはレンジ、
大きく開いている(口を開けている)ときはトレンド」
という見方をしますが、これを目視ではなく数値として扱えると、
他の条件と組み合わせたフィルターとして使いやすくなります。
もっとも単純な数値化は、一番外側の顎と一番内側の唇の差(pips換算)です。
double mouthWidthPoints = MathAbs(jaw - lips) / Point;
この値が小さいほど3本が絡み合っている(レンジ)状態に近く、
大きいほど3本が大きく開いている(トレンド)状態に近いと解釈できます。
実際に動くコード全体(口の開き具合をヒストグラム表示)
顎と唇の差をpips換算し、
サブウィンドウにヒストグラムで表示する、
実際にMetaEditorでコンパイルできるインジケーターです。
//+------------------------------------------------------------------+
//| AlligatorMouthWidth.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 1
#property indicator_color1 Lime
#property indicator_minimum 0
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 MouthWidth[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
SetIndexBuffer(0,MouthWidth);
SetIndexStyle(0,DRAW_HISTOGRAM,STYLE_SOLID,2);
SetIndexEmptyValue(0,EMPTY_VALUE);
IndicatorShortName("Alligator Mouth Width");
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 lips = iAlligator(NULL,0,JawPeriod,JawShift,TeethPeriod,TeethShift,LipsPeriod,LipsShift,MODE_SMMA,PRICE_MEDIAN,MODE_GATORLIPS,i);
if(jaw==0 || lips==0)
{
MouthWidth[i]=EMPTY_VALUE;
continue;
}
MouthWidth[i] = MathAbs(jaw-lips)/Point;
}
return(rates_total);
}
//+------------------------------------------------------------------+
MetaEditorで実際に動かす手順
- MT4のMetaEditorで「ファイル」→「新規作成」→「カスタムインディケータ」を選ぶ
- 「AlligatorMouthWidth」という名前で作成し、テンプレートの中身をすべて削除してコード全体を貼り付ける
- F7キーでコンパイルし、「0 error(s), 0 warning(s)」になることを確認する
- チャートへ適用し、MT4標準のアリゲーターインジケーターも同時に表示する
- 標準アリゲーターの3本が絡み合っている場面でヒストグラムが小さく、大きく開いている場面で高くなることを目視で確認する
この数値の使いどころと限界
「口の開き具合」はあくまでトレンドの強さ(相場が動いているかどうか)を示す値であり、
方向(上か下か)は分かりません。
エントリーの根拠にする場合は、
この記事の環境認識用の数値と、
移動平均線のクロスやRSIのような方向を示す指標を組み合わせて使ってください。
また顎・歯・唇はいずれも未来方向にシフトして表示される指標のため、
`i`が浅い(直近に近い)値ほど、
実際にはまだ確定していない未来側の描画位置を含んでいる可能性がある点も、
EAに組み込む際は考慮が必要です。
よくあるエラー・意図と違う値になるとき
- コンパイルエラーになる: `iAlligator()`の引数を省略していないか。唇だけ欲しい場合でも顎・歯の期間とシフト(第3〜第6引数)は省略できず、10個すべて指定する必要がある
- 顎と唇の値が想定と逆に見える: `MODE_GATORJAW`(顎、一番外側・長期)と`MODE_GATORLIPS`(唇、一番内側・短期)を取り違えていないか
- ヒストグラムが常に0付近: `Point`の桁数(5桁ブローカーかどうか)によって見た目の数値スケールが変わる。桁数を確認したうえで、必要ならしきい値を調整する
- 値がEMPTY_VALUEのままになる: 表示直後でヒストリーデータの本数が`neededBars`に届いていない可能性がある。しばらく待つか履歴データをダウンロードし直す
まとめ
`iAlligator()`は引数が10個ある長い関数ですが、
「顎・歯・唇それぞれの期間とシフトが3セット並んでいるだけ」
と分解すれば書き方自体は難しくありません。
取り違えやすいのは顎(外側・長期)と唇(内側・短期)の役割で、
一番外側が一番期間が長いという関係を覚えておくと迷いにくくなります。
3本の差を数値化すれば、裁量では目視で判断していた「口の開き具合」
を、EAの環境認識フィルターとしてもそのまま使えるようになります。
コメント