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

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

iIchimokuは、日本が生んだ世界的に有名なテクニカル指標「一目均衡表(Ichimoku Kinko Hyo)」のハンドルを取得するためのMQL5組み込み関数です。

一目均衡表は、転換線、基準線、先行スパンA、先行スパンB、遅行スパンの5本の線で構成されており、価格の均衡状態を一目で把握できるのが最大の特徴です。実務レベルの開発では、単なる「雲(先行スパン)のブレイク」を判定するだけでなく、「三役好転」などの複合的なトレンド判定や、先行スパンを動的なサポート・レジスタンス(支持・抵抗)として利用する際に重宝されます。

初心者が特につまずきやすいポイントは、「iIchimoku関数自体はインジケータの値を返さない」という点です。この関数が返すのはあくまで「計算設定へのハンドル(識別番号)」であり、実際の数値(価格)を取得するには、後述するCopyBuffer関数と組み合わせる必要があります。また、一目均衡表は「未来(先行)」や「過去(遅行)」に描画される線が含まれるため、インデックス(データの位置)の指定に独特の注意が必要です。


2. 構文と戻り値

iIchimoku関数の基本的な構文は以下の通りです。

int iIchimoku(
   string           symbol,            // 通貨ペア名(NULLで現在のチャート)
   ENUM_TIMEFRAMES  period,            // 時間軸(PERIOD_CURRENTで現在の時間軸)
   int              tenkan_sen,        // 転換線の期間(デフォルトは9)
   int              kijun_sen,         // 基準線の期間(デフォルトは26)
   int              senkou_span_b      // 先行スパンBの期間(デフォルトは52)
);

戻り値

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

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

取得したい値に応じて、以下のインデックス番号を指定します。
– 0: TENKAN_LINE(転換線)
– 1: KIJUN_LINE(基準線)
– 2: SENKOU_SPANA_LINE(先行スパンA)
– 3: SENKOU_SPANB_LINE(先行スパンB)
– 4: CHIKOUSPAN_LINE(遅行スパン)


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

以下は、iIchimokuを使用して「転換線が基準線を上抜いた(ゴールデンクロス)」かつ「価格が雲の上にある」という条件を判定するEAの基礎骨子です。

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

// グローバル変数
int handleIchimoku; // 一目均衡表のハンドル

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
    // 一目均衡表のハンドルを取得(9, 26, 52の標準設定)
    handleIchimoku = iIchimoku(_Symbol, _Period, 9, 26, 52);

    // ハンドルの取得に失敗した場合はエラー
    if(handleIchimoku == INVALID_HANDLE)
    {
        Print("一目均衡表ハンドルの取得に失敗しました。");
        return(INIT_FAILED);
    }

    return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
    // 最新の各値を格納するための配列
    double tenkan[], kijun[], spanA[], spanB[], closePrice[];

    // 時系列として(最新がインデックス0)セット
    ArraySetAsSeries(tenkan, true);
    ArraySetAsSeries(kijun, true);
    ArraySetAsSeries(spanA, true);
    ArraySetAsSeries(spanB, true);

    // 各バッファからデータをコピー
    // ※直近の確定足(インデックス1)を取得するのが一般的
    if(CopyBuffer(handleIchimoku, 0, 0, 3, tenkan) < 0 ||
       CopyBuffer(handleIchimoku, 1, 0, 3, kijun) < 0 ||
       CopyBuffer(handleIchimoku, 2, 0, 3, spanA) < 0 ||
       CopyBuffer(handleIchimoku, 3, 0, 3, spanB) < 0)
    {
        Print("データのコピーに失敗しました。");
        return;
    }

    // 現在の終値を取得
    double currentClose = iClose(_Symbol, _Period, 0);

    // ロジック例:ゴールデンクロス判定(1本前で転換線 > 基準線)
    bool isGoldenCross = (tenkan[1] > kijun[1]) && (tenkan[2] <= kijun[2]);

    // ロジック例:価格が雲(先行スパンA/Bの高い方)より上にいるか
    double cloudTop = MathMax(spanA[1], spanB[1]);
    bool isAboveCloud = (currentClose > cloudTop);

    if(isGoldenCross && isAboveCloud)
    {
        Print("買いシグナル:転換線が基準線をクロスし、かつ価格が雲の上にあります。");
        // ここにオーダー処理を記述
    }
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
    // ハンドルの解放(メモリ管理)
    IndicatorRelease(handleIchimoku);
}

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

1. 配列の時系列設定を忘れない

CopyBufferで取得したデータは、デフォルトでは古い順に格納されます。ArraySetAsSeries(array, true)を実行して、最新の足がインデックス[0]に来るように設定しないと、計算ロジックが破綻します。

2. 先行スパンの「表示ズレ」の理解

一目均衡表の「雲(先行スパン)」は、本来26日分未来に表示されています。MQL5のiIchimoku関数で取得できるspanAspanBのインデックス[0]の値は、「現在の足の位置に描画されている雲の値」です。つまり、内部的にはすでに26期間分シフトされた後の値が渡されるため、開発者が手動で26計算を足し引きする必要はありません。

3. 未確定足でのシグナル点灯

OnTick内でインデックス[0]を参照すると、ティックが動くたびに条件判定が変わり、「シグナルが点いたり消えたりする(リペイント)」現象が起きます。安定したシステムを作るなら、確定足であるインデックス[1](1本前の足)を使用しましょう。


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

アルゴリズムトレードにおいて、ロジックの正しさ以上に収益を左右するのが「実行環境」です。多くの開発者が自宅のPCでMT5を稼働させようとしますが、これはプロの視点から見ると非常にリスクが高い行為です。家庭用インターネット回線は、金融機関のサーバーとの間に数十〜数百のネットワークホップを介しており、この物理的な距離が生む「レイテンシ(遅延)」は、スリッページを増大させ、バックテストの結果を無意味なものにします。

特に一目均衡表のようなトレンドフォロー戦略では、ブレイクの瞬間に注文が通るかどうかが勝敗を分けます。コンマ数秒の遅延で有利な価格を逃せば、年間で計算すると数%〜数十%の期待値が削り取られることになります。プロレベルの約定スピードと24時間の安定稼働を確保するには、取引サーバーに物理的に近いデータセンター内に設置された「専用VPS」の活用が不可欠です。ネットワーク遅延を極限まで排除した環境を構築することこそが、クオンツエンジニアが最初に行うべき「勝つための投資」と言えるでしょう。

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

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

コメント

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