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

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

MQL5のCustomTicksAddは、ユーザーが定義した「カスタム銘柄(Custom Symbol)」に対して、ティックデータを手動で追加するための関数です。

実務での主な活用シーンは以下の通りです。
合成通貨ペアのバックテスト: 複数の通貨を組み合わせて作った独自のインデックス(例:ドルインデックスや通貨強弱指標)をチャート化し、EAで検証する。
外部データのインポート: 他のプラットフォーム(TradingViewや外部データベンダー)から取得した高精度なティックデータをMQL5に取り込む。
裁定取引(アービトラージ)のシミュレーション: 業者間の価格差を再現したカスタム銘柄を作成し、ロジックをテストする。

実務でつまずきやすいポイント:
多くの開発者が「既存の銘柄(USDJPYなど)」にティックを追加しようとして失敗しますが、この関数はCustomSymbolCreateで作成したカスタム銘柄にのみ有効です。また、ティックデータの「時系列の順序」や「フラグ設定」が正しくないと、チャートが表示されない、あるいはバックテストが正確に動かないといった問題が発生しやすいため、データの整合性管理が重要になります。


2. 構文と戻り値

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

int CustomTicksAdd(
   const string           symbol,       // カスタム銘柄名
   const MqlTick&         ticks[]       // 追加するティックデータの配列
);

パラメーター

  1. symbol: ティックを追加したいカスタム銘柄の名称です。
  2. ticks[]: 追加するデータが格納されたMqlTick構造体の配列です。この配列には、価格(Bid/Ask)、時刻(ミリ秒単位)、ティックフラグなどが含まれている必要があります。

戻り値

  • 成功時: カスタム銘柄の履歴に追加されたティックの数が返されます。
  • 失敗時: -1 が返されます。エラーの詳細は GetLastError() 関数で確認できます。

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

以下のサンプルは、現在表示しているチャートの銘柄を元に「My_Custom_Symbol」というカスタム銘柄を作成し、直近100件のティックデータをコピーして追加するスクリプトです。

void OnStart()
{
    string customSymbolName = "My_Custom_Symbol";
    string sourceSymbol = _Symbol; // 現在の銘柄をコピー元にする

    // 1. カスタム銘柄が存在しない場合は作成する
    if (!SymbolInfoInteger(customSymbolName, SYMBOL_EXIST)) {
        if (!CustomSymbolCreate(customSymbolName, "Custom\\MyGroup", sourceSymbol)) {
            Print("カスタム銘柄の作成に失敗しました。 Error: ", GetLastError());
            return;
        }
    }

    // 2. 作成した銘柄を「気配り値表示」に表示させる
    SymbolSelect(customSymbolName, true);

    // 3. 元となる銘柄から最新のティックデータを取得
    MqlTick tickArray[];
    int copiedTicks = CopyTicks(sourceSymbol, tickArray, COPY_TICKS_ALL, 0, 100);

    if (copiedTicks <= 0) {
        Print("ティックデータの取得に失敗しました。");
        return;
    }

    // 4. カスタム銘柄にティックデータを追加
    // ※実際にはここで価格を加工(合成)することが多い
    int addedTicks = CustomTicksAdd(customSymbolName, tickArray);

    if (addedTicks > 0) {
        Print(addedTicks, " 件のティックを ", customSymbolName, " に正常に追加しました。");
    } else {
        Print("ティックの追加に失敗しました。 Error: ", GetLastError());
    }
}

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

CustomTicksAddを使用する際、初心者が陥りやすい罠がいくつかあります。

  1. 時系列の昇順ルール:
    追加するティック配列(ticks[])は、古い順から新しい順(昇順)に並んでいる必要があります。時間の逆転が発生しているデータを投入すると、エラーになるか、チャートが正しく描画されません。
  2. time_msc(ミリ秒)の重要性:
    現代のスキャルピングや高頻度取引(HFT)の検証では、秒単位の精度では不十分です。MqlTick構造体のtime_mscメンバーにミリ秒単位の正確な時刻をセットしてください。
  3. ティックフラグ(flags)の適切な設定:
    TICK_FLAG_BIDTICK_FLAG_ASK といったフラグが適切に設定されていないと、EAが「価格の変化」を正しく認識できません。
  4. 既存データとの重複:
    すでに存在する時間帯のティックを再度追加しようとすると、データが重複したり、意図しない挙動になることがあります。追加前に CustomTicksDelete で既存の範囲を削除するなどの処理を検討してください。

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

アルゴリズムトレードの世界において、CustomTicksAddを用いてどれだけ精密なバックテストを繰り返したとしても、本番環境の「物理的な壁」を無視して利益を出し続けることは不可能です。その最大の壁がネットワーク遅延(レイテンシ)です。

自宅のPCから一般的なインターネット回線を通じて注文を出す場合、プロバイダーの混雑やパケットロスにより、MT5上の価格と証券会社サーバーでの実際の価格に致命的なズレ(スリッページ)が生じます。特にティック単位の動きを捉えるEAにとって、この数ミリ秒〜数十ミリ秒の遅れは、バックテスト上の「利益」を「損失」へと容易に変えてしまいます。

極限まで約定スピードを高め、エッジを維持するためには、証券会社のデータセンターに物理的に近い場所で稼働する専用のVPS環境が必須です。専用VPSを利用することで、物理的な距離による遅延を最小限に抑え、プロレベルの安定した執行環境を構築することができます。どれほど優れたコードを書いたとしても、実行環境が脆弱であれば、それは「勝負の土俵」にすら上がっていないことを自覚する必要があります。

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

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

コメント

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