【MQL5】iAlligator関数の使い方と自動売買実装コード

1. iAlligator関数の概要と実務での活用法

ビル・ウィリアムズによって考案された「アリゲーター(Alligator)」は、3本の移動平均線を用いてトレンドの発生と方向性を視覚化するインジケーターです。MQL5のiAlligator関数は、これら3本のライン(Jaw:顎、Teeth:歯、Lips:唇)の計算値を効率的に取得するための組み込み関数です。

実務での活用法

実務においては、単なるゴールデンクロス・デッドクロスの判定ではなく、「相場のボラティリティの収束と拡散」を捉えるために使用します。
睡眠期(レンジ): 3本のラインが絡み合っている状態。トレードを控えるべき時期。
覚醒期(トレンド発生): 3本のラインが上下に乖離し始めた状態。トレンドの初動。
捕食期(トレンド継続): ラインが綺麗なパーフェクトオーダーを描いている状態。

開発者がつまずきやすいポイント

MQL4ではiAlligatorを呼び出すだけで直接数値が返ってきましたが、MQL5では「ハンドル(識別番号)」を取得し、その後CopyBuffer関数を使って配列に値をコピーするという2ステップの手順が必要です。この設計変更に戸惑う中級者の方は非常に多いため、ハンドル管理の理解が実装の鍵となります。


2. 構文と戻り値

関数プロトタイプ

int  iAlligator(
   string              symbol,            // 通貨ペア名(NULLで現在のチャート)
   ENUM_TIMEFRAMES     period,            // 時間軸(0で現在の時間軸)
   int                 jaw_period,        // ジョーズ(青線)の期間
   int                 jaw_shift,         // ジョーズのシフト
   int                 teeth_period,      // ティース(赤線)の期間
   int                 teeth_shift,       // ティースのシフト
   int                 lips_period,       // リップス(緑線)の期間
   int                 lips_shift,        // リップスのシフト
   ENUM_MA_METHOD      ma_method,         // 平滑化方式(通常はMODE_SMMA)
   ENUM_APPLIED_PRICE  applied_price      // 適用価格(通常はPRICE_MEDIAN)
   );

戻り値

  • 成功すれば、インジケーターのハンドル(int型)を返します。
  • 失敗した場合は INVALID_HANDLE を返します。

バッファ番号(CopyBufferで使用)

  • 0 (GATORJAW_LINE): Jaw(顎:青色)
  • 1 (GATORTEETH_LINE): Teeth(歯:赤色)
  • 2 (GATORLIPS_LINE): Lips(唇:緑色)

3. 具体的な使い方・実践サンプルコード

以下は、iAlligatorを使用して、現在のトレンドが「上昇(パーフェクトオーダー)」であるかを判定するEAの基礎コードです。

//+------------------------------------------------------------------+
//|                                              SimpleAlligator.mq5 |
//+------------------------------------------------------------------+
#property strict

// ハンドル保持用変数
int handle_alligator;

// 初期化関数
int OnInit()
{
    // アリゲーターのハンドルを取得(標準的なパラメーター:13, 8, 8, 5, 5, 3)
    handle_alligator = iAlligator(_Symbol, _Period, 13, 8, 8, 5, 5, 3, MODE_SMMA, PRICE_MEDIAN);

    // ハンドル取得に失敗した場合はエラーを出力
    if(handle_alligator == INVALID_HANDLE)
    {
        Print("iAlligatorの作成に失敗しました。エラーコード:", GetLastError());
        return(INIT_FAILED);
    }
    return(INIT_SUCCEEDED);
}

// ティック毎の処理
void OnTick()
{
    double jaw[], teeth[], lips[];

    // 時系列として最新の足から取得するように設定
    ArraySetAsSeries(jaw, true);
    ArraySetAsSeries(teeth, true);
    ArraySetAsSeries(lips, true);

    // バッファから値をコピー(最新から3本分)
    if(CopyBuffer(handle_alligator, 0, 0, 3, jaw) < 0 ||
       CopyBuffer(handle_alligator, 1, 0, 3, teeth) < 0 ||
       CopyBuffer(handle_alligator, 2, 0, 3, lips) < 0)
    {
        Print("データのコピーに失敗しました。");
        return;
    }

    // 上昇トレンドの判定(Lips > Teeth > Jaw)
    if(lips[0] > teeth[0] && teeth[0] > jaw[0])
    {
        Comment("アリゲーターは食事中です(上昇トレンド)");
    }
    // 下降トレンドの判定(Jaw > Teeth > Lips)
    else if(jaw[0] > teeth[0] && teeth[0] > lips[0])
    {
        Comment("アリゲーターは食事中です(下降トレンド)");
    }
    else
    {
        Comment("アリゲーターは眠っています(レンジ)");
    }
}

// 終了処理
void OnDeinit(const int reason)
{
    // ハンドルを解放してメモリを節約
    IndicatorRelease(handle_alligator);
}

4. 使用上の注意点とよくあるエラー

  1. ハンドルの作成は一度だけ行う:
    OnTick関数内で毎回iAlligatorを呼び出さないでください。PCのリソースを著しく消費し、プラットフォームの動作が重くなる原因となります。必ずOnInitで一度だけ生成し、変数に保存してください。
  2. 計算未完了のチェック:
    インジケーターの計算は非同期で行われることがあります。EA起動直後にCopyBufferがエラーを返す場合や、値がEMPTY_VALUE(非常に大きな値)になっている場合があるため、必ず戻り値をチェックするロジックを入れましょう。
  3. シフト(Shift)の意味:
    アリゲーターの最大の特徴は「未来方向へのシフト」です。jaw_shiftなどで設定した数値分、計算値が右側にずれて表示されます。CopyBufferで取得する値は、すでにそのシフトを考慮した「現在の足における値」となります。

5. 【重要】自動売買における約定スピードと環境の罠

アルゴリズムトレードにおいて、ロジックの優位性と同じか、それ以上に重要なのが「実行環境」です。自宅のPCや一般的な光回線でEAを稼働させることは、プロのクオンツの視点からは極めてリスクが高いと言わざるを得ません。家庭用回線では、プロバイダー経由の複雑な経路によるネットワーク遅延(レイテンシ)が発生し、MT5の画面上でシグナルが出てからブローカーのサーバーに注文が届くまでに致命的なタイムラグが生じます。

このわずか数百ミリ秒の遅延が、スリッページを引き起こし、バックテストでは利益が出ていたロジックを「負けトレード」へと変貌させます。特にアリゲーターのようなトレンドフォロー戦略では、ブレイクアウトの瞬間にいかに速く約定させるかが収益の分岐点となります。約定スピードを極限まで高め、物理的な距離による損失を排除するためには、ブローカーのデータセンターに近接した専用のFX用VPS(仮想専用サーバー)の利用が必須条件です。安定した電源と超低遅延なネットワーク環境を確保することこそが、システムトレーダーとしての第一歩です。

💡 この記事の内容を実運用で活かすには?

この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント

タイトルとURLをコピーしました