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

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

MQL5のiCustom関数は、メタトレーダー5(MT5)に標準搭載されていない「カスタムインジケーター」の計算結果を、EA(エキスパートアドバイザー)や別のインジケーターから取得するための関数です。

実務開発において、iCustomは最も頻繁に使用される関数の一つですが、同時に多くの開発者がつまずくポイントでもあります。標準のiMA(移動平均線)などとは異なり、呼び出し先のインジケーターに合わせて「引数の数や型」を動的に合わせる必要があるためです。

実務での主な活用シーン:
* ネット上で公開されている優秀なサインツールをEA化する。
* 複雑なロジックを持つ独自のインジケーターを外部化し、EA側のコードを軽量化する。
* マルチタイムフレーム(MTF)分析を組み込む。

初心者のうちは「計算ロジックをすべてEA内に書き込もう」としがちですが、計算部分をカスタムインジケーターとして切り分け、iCustomで呼び出す構成にすることで、バックテストの高速化やコードの保守性(メンテナンスのしやすさ)が劇的に向上します。


2. 構文と戻り値

iCustom関数の構文は以下の通りです。

int iCustom(
   string           symbol,     // 通貨ペア名(NULLで現在の通貨)
   ENUM_TIMEFRAMES  period,     // 時間軸(0で現在の時間軸)
   string           name,       // カスタムインジケーターのパス・ファイル名
   ...                          // インジケーターの入力パラメーター(任意)
);

戻り値

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

重要なポイント

MQL5のiCustomは、MQL4とは異なり「その瞬間の数値」を直接返すわけではありません。
1. iCustomで「ハンドル(計算指示書のようなもの)」を作成する。
2. そのハンドルを使って CopyBuffer 関数で数値を配列にコピーする。
という2ステップが必要になることを覚えておいてください。


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

以下は、カスタムインジケーター「ExampleIndi.ex5」の値を読み取り、条件を満たしたときにログを出力するシンプルなEAのサンプルです。

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

// 入力パラメーター
input int      InpPeriod = 14;      // インジケーターの期間設定
int            handle;              // インジケーターハンドルを格納する変数

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
    // 1. iCustomでハンドルを取得
    // "Examples\\ExampleIndi" は MQL5/Indicators/Examples/ExampleIndi.ex5 を指す
    handle = iCustom(_Symbol, _Period, "Examples\\ExampleIndi", InpPeriod);

    // ハンドルの取得に失敗した場合の処理
    if(handle == INVALID_HANDLE)
    {
        Print("ハンドルの取得に失敗しました。エラーコード:", GetLastError());
        return(INIT_FAILED);
    }

    return(INIT_SUCCEEDED);
}

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
    // 2. 使用済みのハンドルを解放してメモリを節約
    IndicatorRelease(handle);
}

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
    double buffer[];           // 値を格納する動的配列
    ArraySetAsSeries(buffer, true); // 最新のデータが0番目に来るように設定

    // 3. CopyBufferを使用して、ハンドルから値を取得
    // 第2引数はインジケーターのバッファ番号(通常0から始まる)
    // 0番目から2個分(最新とその1つ前)をコピー
    if(CopyBuffer(handle, 0, 0, 2, buffer) < 0)
    {
        Print("データのコピーに失敗しました。");
        return;
    }

    // 4. 取得した値を使ってロジック判定
    double lastValue = buffer[0];
    Comment("現在のインジケーター値: ", lastValue);
}

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

iCustomを利用する際に、初心者が最もハマりやすいポイントをまとめました。

  1. パラメーターの不一致
    iCustomの第4引数以降に渡すパラメーターは、呼び出し先インジケーターの「input(またはextern)」変数の順番と型に完全に一致させる必要があります。1つでも型が違ったり、数が足りなかったりすると、デフォルト値で動くか、最悪の場合フリーズします。

  2. インジケーターのパス指定
    MQL5では、MQL5/Indicators/ フォルダを起点としたパスを指定します。サブフォルダに入っている場合は "SubFolder\\IndicatorName" のようにバックスラッシュ(または円マーク)2つで区切る必要があります。

  3. バッファ番号の確認
    インジケーターには「上昇ライン=0番、下降ライン=1番」のように複数のデータ出力口(バッファ)がある場合があります。どの数値を取得したいのか、データウィンドウ等でバッファ番号を正確に把握してください。

  4. OnInitでのハンドル作成
    iCustomOnTick の中で毎回実行してはいけません。PCのリソースを激しく消費し、動作が極端に重くなります。必ず OnInit で一度だけ作成し、変数を使い回してください。


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

アルゴリズムトレードにおいて、ロジックの正しさと同じくらい重要なのが「実行環境」です。iCustomを用いて高度な分析を行っても、最終的な注文が市場に届くスピードが遅ければ、期待した利益は得られません。特に、自宅のPCや一般的な光回線を利用した自動売買には致命的なリスクが潜んでいます。

家庭用ネットワークは、動画視聴やWeb閲覧には適していますが、FX取引に必要な「ミリ秒単位の低遅延」は保証されていません。ネットワークの揺らぎ(ジッター)によって、一瞬の価格変動で滑り(スリッページ)が発生し、バックテスト結果とは乖離した損失を生む原因となります。プロのクオンツやトレーダーが専用のVPS(仮想専用サーバー)を利用するのは、物理的に取引サーバーに近い環境にEAを配置し、ネットワーク遅延を極限まで排除するためです。安定した利益を追求するのであれば、24時間稼働と高速なレスポンスを兼ね備えた専用VPSの導入は、必要経費ではなく「必須のインフラ」であると断言できます。

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

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

コメント

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