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

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

CustomSymbolSetDoubleは、MQL5で「カスタム銘柄(Custom Symbol)」の浮動小数点数(double型)のプロパティを設定するための関数です。カスタム銘柄とは、MT5に標準で存在する通貨ペア以外に、ユーザーが独自に定義できる銘柄のことです。

実務レベルの開発において、この関数は主に以下の場面で活用されます。

  • 合成通貨ペアの作成: 例えば「ドルインデックス」や「特定の通貨強弱を数値化した指標」をチャート化し、バックテストやEAのロジックに組み込む際に使用します。
  • バックテスト環境の厳密な再現: 特定のブローカーのストップレベル、スプレッド、ティックサイズ、スワップ値を正確にシミュレーションするために、既存の銘柄をコピーしたカスタム銘柄を作成し、数値を上書きします。
  • 外部データのインポート: CSVなどで取得した外部の価格データや独自指数をMT5上に表示させ、標準のインジケーターを適用させる際に不可欠です。

初心者や中級者がつまずきやすいポイントは、「既存の銘柄のプロパティは書き換えられない」という点です。この関数はあくまでCustomSymbolCreateで作成した「カスタム銘柄」に対してのみ有効であり、ブローカーが提供している通常の銘柄(例:USDJPY)の数値を直接変更することはできません。


2. 構文と戻り値

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

bool CustomSymbolSetDouble(
   string                    symbol_name,      // カスタム銘柄名
   ENUM_SYMBOL_INFO_DOUBLE   property_id,      // プロパティの種類(識別子)
   double                    property_value    // 設定する値
);

パラメーター解説

  1. symbol_name: 設定対象となるカスタム銘柄の名前です。
  2. property_id: 設定したい項目の種類をENUM_SYMBOL_INFO_DOUBLEから選択します(例:SYMBOL_BIDSYMBOL_ASKSYMBOL_POINTSYMBOL_TRADE_TICK_SIZEなど)。
  3. property_value: 実際に設定するdouble型の数値です。

戻り値

  • 成功した場合は true を、失敗した場合は false を返します。
  • 失敗の理由を確認するには GetLastError() 関数を呼び出します。

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

以下は、新しいカスタム銘柄を作成し、その銘柄の「ポイントサイズ(1ポイントの価値)」と「最小ティックサイズ」を設定する実用的なサンプルコードです。

void OnStart()
{
    string customSymbolName = "MY_INDEX_USD"; // 作成する銘柄名

    // 1. カスタム銘柄が存在しない場合は作成する(既存のUSDJPYをベースにする例)
    if (!SymbolInfoInteger(customSymbolName, SYMBOL_EXIST)) {
        if (!CustomSymbolCreate(customSymbolName, "Custom\\Indices", "USDJPY")) {
            Print("カスタム銘柄の作成に失敗しました。エラーコード: ", GetLastError());
            return;
        }
    }

    // 2. カスタム銘柄のdouble型プロパティを設定する
    // 例:ポイントサイズを 0.001 に設定
    if (!CustomSymbolSetDouble(customSymbolName, SYMBOL_POINT, 0.001)) {
        Print("SYMBOL_POINT の設定に失敗しました。");
    }

    // 例:最小ティックサイズ(価格が動く最小単位)を 0.001 に設定
    if (!CustomSymbolSetDouble(customSymbolName, SYMBOL_TRADE_TICK_SIZE, 0.001)) {
        Print("SYMBOL_TRADE_TICK_SIZE の設定に失敗しました。");
    }

    // 例:ストップレベル(注文時の最低離隔距離)を 50.0 に設定
    if (!CustomSymbolSetDouble(customSymbolName, SYMBOL_TRADE_STOPS_LEVEL, 50.0)) {
        Print("SYMBOL_TRADE_STOPS_LEVEL の設定に失敗しました。");
    }

    // 3. 気配値表示ウィンドウに表示させる
    SymbolSelect(customSymbolName, true);

    Print("カスタム銘柄 ", customSymbolName, " のプロパティ設定が完了しました。");
}

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

  1. 型の一致に注意:
    SYMBOL_DIGITS(桁数)などは整数値ですが、これらはCustomSymbolSetIntegerで設定する必要があります。CustomSymbolSetDoubleはあくまで「小数点を含む値」のための関数であることを意識してください。

  2. 価格の更新順序:
    SYMBOL_BIDSYMBOL_ASKをこの関数で設定しても、チャート上の「足(バー)」が自動生成されるわけではありません。価格履歴を作るには、別途CustomRatesUpdateCustomTicksAddを使用する必要があります。

  3. 読み取り専用プロパティ:
    一部のプロパティはシステムによって自動計算されるため、手動で設定しても反映されない、あるいはエラーになる場合があります。

  4. 削除と再作成の挙動:
    一度作成したカスタム銘柄のプロパティを変更しても、チャートを開きっぱなしにしていると表示が更新されないことがあります。確実な反映には、一度「気配値表示」から非表示にして再表示させる処理が必要です。


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

アルゴリズムトレードにおいて、ロジックの正確性と同じか、それ以上に重要なのが「実行環境のレイテンシ(遅延)」です。どれほど優れたEAを開発し、CustomSymbolSetDoubleを駆使して精密なシミュレーションを行っても、自宅のPCや一般的な光回線で運用している限り、機関投資家やプロのクオンツとの競争には勝てません。

FX市場はミリ秒(1000分の1秒)単位で価格が変動します。自宅PCからの注文は、物理的な距離やネットワークの複雑な経路により、サーバーに届くまでに致命的なタイムラグが発生します。この数ミリ秒の差が、本来得られるはずだった利益をスリッページによって削り取り、結果としてバックテスト通りのパフォーマンスを出すことを不可能にします。約定スピードを極限まで高め、安定した24時間の稼働を維持するためには、取引サーバーに物理的に近い場所に設置された専用のVPS(仮想専用サーバー)の利用が不可欠です。インフラを最適化することは、勝つための最低条件と言っても過言ではありません。

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

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

コメント

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