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

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

iFractalsは、ビル・ウィリアムズが考案した「フラクタル」というテクニカル指標の値を算出するための関数です。フラクタルは、中央のバーの安値(または高値)がその前後の2本ずつのバーよりも低い(または高い)場合にシグナルが発生する仕組みで、相場の「転換点」を視覚化するのに非常に適しています。

実務での活用法と開発者の落とし穴
実務では、主に「直近のサポート・レジスタンスラインの特定」や「損切り(ストップロス)の位置決定」に多用されます。しかし、初心者が最もつまずきやすいのが「フラクタルの確定タイミング」です。

フラクタルは構造上、中央のバーの確定にその後2本のバーを必要とします。つまり、現在の足(インデックス0)でフラクタルが確定することはあり得ず、最短でも「2本前の足」にシグナルが出る仕組みです。これを理解せずに「シグナルが出た瞬間にエントリー」というロジックを組むと、実際には過去のデータに対してバックテストを行っていることになり、リアル環境で全く約定しない、あるいは大きな乖離(リペイント)に悩まされることになります。


2. 構文と戻り値

MQL5におけるiFractals関数は、インジケーターの「ハンドル」を返す設計になっています。MQL4のように直接価格を取得するのではなく、一度ハンドルを作成し、そのハンドルを介してデータをバッファから読み取る手順が必要です。

構文

int  iFractals(
   string           symbol,     // 通貨ペア(NULLは現在の通貨)
   ENUM_TIMEFRAMES  period      // 時間軸(0は現在の時間軸)
   );

戻り値

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

バッファの仕様

iFractalsには2つのバッファが存在します。
0番バッファ (UPPER_LINE): 上フラクタル(高値の反転ポイント)
1番バッファ (LOWER_LINE): 下フラクタル(安値の反転ポイント)
※値が存在しないバーには、非常に大きな値(EMPTY_VALUE)が格納されています。


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

以下は、EA内でiFractalsのハンドルを作成し、最新のフラクタル値を取得してログに出力する実用的なコード例です。

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

int handle; // iFractalsのハンドルを格納する変数

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
    // iFractalsのハンドルを作成(現在の通貨ペア・時間軸)
    handle = iFractals(_Symbol, _Period);

    if(handle == INVALID_HANDLE)
    {
        Print("iFractalsハンドルの作成に失敗しました。");
        return(INIT_FAILED);
    }
    return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
    double upperBuf[]; // 上フラクタル格納用
    double lowerBuf[]; // 下フラクタル格納用

    // 配列を時系列順(最新がインデックス0)に設定
    ArraySetAsSeries(upperBuf, true);
    ArraySetAsSeries(lowerBuf, true);

    // 過去5本分のデータをコピー
    if(CopyBuffer(handle, 0, 0, 5, upperBuf) < 0 || 
       CopyBuffer(handle, 1, 0, 5, lowerBuf) < 0)
    {
        Print("データのコピーに失敗しました。");
        return;
    }

    // フラクタルは構造上、インデックス2(2本前)が最短の確定ポイント
    // EMPTY_VALUEでないか確認して値を取得
    if(upperBuf[2] != EMPTY_VALUE)
    {
        Print("上フラクタル確定: ", upperBuf[2]);
    }

    if(lowerBuf[2] != EMPTY_VALUE)
    {
        Print("下フラクタル確定: ", lowerBuf[2]);
    }
}

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

  1. ハンドルの作成はOnInitで行うこと
    OnTickの中で毎回iFractals関数を呼び出してはいけません。メモリを大量に消費し、PCやサーバーの動作を著しく低下させます。一度作成したハンドルを使い回すのがMQL5の鉄則です。
  2. EMPTY_VALUEのチェック
    フラクタルは全てのバーに出現するわけではありません。CopyBufferで取得した配列には、フラクタルがない箇所にEMPTY_VALUE(1.797…e+308のような膨大な数値)が入っています。これを除外せずに計算(例:移動平均の算出など)に使用すると、計算結果が壊れてしまいます。必ず if(value != EMPTY_VALUE) というチェックを入れてください。
  3. インデックスの理解
    フラクタルの中央の山は、前後の足が確定して初めて山として認識されます。したがって、ライブトレードでフラクタルを利用する場合、利用できる最新の確定値は「インデックス2」であることを肝に銘じてください。

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

アルゴリズムトレードにおいて、どれだけ優れたロジックを組んだとしても、実行環境が脆弱であればそれは「絵に描いた餅」に過ぎません。特にフラクタルを用いたブレイクアウト戦略や損切り注文を出す際、自宅のPCから家庭用インターネット回線を経由して発注を行うと、数百ミリ秒(ms)単位のネットワーク遅延(レイテンシ)が発生します。この遅延の間に価格が滑り、バックテスト通りの利益が得られない「スリッページ」という致命的な損失を生むことになります。

プロのクオンツや専業トレーダーにとって、ブローカーの取引サーバーの至近距離に位置する「専用VPS(仮想専用サーバー)」を利用することはもはや常識です。物理的な距離を縮めることでレイテンシを極限まで抑え、ミリ秒単位の優位性を確保しなければ、機関投資家や高速取引(HFT)アルゴリズムがひしめくマーケットで生き残ることは不可能です。安定した電源、24時間の稼働保証、そして超低遅延なネットワーク環境。このインフラ投資を怠ることは、自動売買エンジニアにとって最大の戦略ミスと言えるでしょう。

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

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

コメント

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