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

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

MQL5の強力な機能の一つに、ブローカーが提供する銘柄とは別に、ユーザーが独自の銘柄を定義できる「カスタム銘柄」機能があります。CustomSymbolSetIntegerは、そのカスタム銘柄の整数型のプロパティ(桁数、注文モード、スワップ設定など)を設定・変更するための関数です。

実務レベルの開発では、主に以下のようなシーンで活用されます。

  • 合成チャートの作成: 複数の通貨ペアを組み合わせたインデックス(例:ドルインデックス)をチャート表示させ、バックテストを行う。
  • バックテスト環境の厳密化: 特定の低スプレッド環境やスワップポイントをシミュレーションするために、独自の銘柄設定を構築する。
  • 外部データの取り込み: 仮想通貨やCFD、あるいは独自に算出した数値をMT5のチャートに描画し、EAを動作させる。

初心者が特につまずきやすいポイントは、「この関数は既存の(ブローカー提供の)銘柄には使えない」という点です。あくまで自分で作成したカスタム銘柄に対して設定を行うものだということを意識してください。

2. 構文と戻り値

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

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

パラメーター

  1. symbol_name: 設定対象となるカスタム銘柄の名前です。
  2. property_id: 変更したい項目の識別子です。ENUM_SYMBOL_INFO_INTEGERで定義されており、例えば銘柄の桁数(SYMBOL_DIGITS)や、取引モード(SYMBOL_TRADE_MODE)などが指定できます。
  3. property_value: 設定する具体的な数値です。型は long です。

戻り値

設定に成功した場合は true、失敗した場合は false を返します。失敗した原因は GetLastError() 関数で詳細を確認できます。

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

以下は、新しいカスタム銘柄を作成し、その銘柄の「小数点以下の桁数」と「ストップレベル」をプログラムから設定する実用的なサンプルコードです。

//+------------------------------------------------------------------+
//| カスタム銘柄の初期設定を行うサンプルコード                               |
//+------------------------------------------------------------------+
void OnStart()
{
   string customSymbolName = "MY_CUSTOM_JPY"; // カスタム銘柄名

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

   // 2. カスタム銘柄のプロパティを設定する

   // 小数点以下の桁数を3桁に設定
   if(!CustomSymbolSetInteger(customSymbolName, SYMBOL_DIGITS, 3))
   {
      Print("桁数の設定に失敗しました。");
   }

   // 取引モードを「フルアクセス」に設定
   if(!CustomSymbolSetInteger(customSymbolName, SYMBOL_TRADE_MODE, SYMBOL_TRADE_MODE_FULL))
   {
      Print("取引モードの設定に失敗しました。");
   }

   // ストップレベル(待機注文を置けない範囲)を0に設定
   if(!CustomSymbolSetInteger(customSymbolName, SYMBOL_TRADE_STOPS_LEVEL, 0))
   {
      Print("ストップレベルの設定に失敗しました。");
   }

   // 3. 設定を反映させるために気配値表示ウィンドウに追加
   SymbolSelect(customSymbolName, true);

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

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

開発中に遭遇しやすいトラブルとその回避策をまとめました。

  1. 銘柄名の間違い: symbol_name に指定する文字列が、実際に存在するカスタム銘柄と完全一致している必要があります。大文字・小文字も区別されるため注意してください。
  2. 読み取り専用プロパティ: ENUM_SYMBOL_INFO_INTEGER の中には、システム側で自動計算される「読み取り専用」のプロパティが存在します。これらを変更しようとするとエラーになります。
  3. CustomSymbolCreate 後の呼び出し: 銘柄が存在しない状態で CustomSymbolSetInteger を呼んでも失敗します。必ず CustomSymbolCreate が成功した後に実行するフローにしてください。
  4. 反映のタイミング: 設定を変更した後、MT5の画面上で即座に反映されない場合があります。その際は SymbolSelect をやり直すか、チャートを一度閉じて開き直す処理を検討してください。

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

アルゴリズムトレードにおいて、ロジックの優位性と同じくらい、あるいはそれ以上に重要なのが「実行環境」です。多くの個人開発者は自宅のPCや一般的なノートPCでEAを稼働させがちですが、これは技術的に非常に危険な選択です。自宅のインターネット回線は、プロバイダーを経由する際の経路が複雑で、MT5サーバーとの間に数百ミリ秒(ms)単位のレイテンシ(遅延)が発生します。この遅延は、スリッページを増大させ、バックテストの結果とリアルトレードの結果を乖離させる最大の要因となります。

極限まで約定スピードを高め、エッジ(優位性)を維持するためには、ブローカーのデータセンターに近い場所に設置された「専用のVPS(仮想専用サーバー)」の利用が不可欠です。物理的な距離を短縮することでネットワークのホップ数を最小限に抑え、1ミリ秒を争うスキャルピングや急激なボラティリティ発生時の注文執行能力を安定させることができます。24時間365日の安定稼働はもちろんのこと、ネットワーク遅延という「見えない損失」を防ぐことが、クオンツエンジニアとしての第一歩です。

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

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

コメント

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