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

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

MQL5のSignalInfoSetInteger関数は、MetaTrader 5(MT4にはない機能です)の「シグナル」サービスに関する設定を、プログラム(EAやスクリプト)から動的に変更するための関数です。

シグナルサービスとは、他のトレーダーの売買(シグナル)を自分の口座に自動でコピーする仕組みのことですが、実務開発においてこの関数は主に以下の用途で活用されます。

  • コピー設定の自動化: シグナルの購読を開始した際、手動で設定画面を開かずに「ストップロス(SL)やテイクプロフィット(TP)もコピーするか」などの設定を強制する。
  • セーフティ機構の構築: 特定の条件下(ボラティリティの急増時など)で、一時的にシグナルのコピーを停止、あるいは確認画面を挟むように切り替える。
  • ユーザー体験の向上: ツール配布時、ユーザーが設定を間違えないよう、EAの初期化時に最適なシグナル設定を自動適用する。

初心者が特につまずきやすいのは、「自分のEAのロジック」を制御する関数だと勘違いしてしまう点です。この関数はあくまで「MetaQuotes社が提供するシグナル配信サービス」を利用している際の、受信側の設定を変更するためのものだと理解しておきましょう。

2. 構文と戻り値

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

bool SignalInfoSetInteger(
   ENUM_SIGNAL_INFO_INTEGER  property_id,     // プロパティ識別子
   long                      value             // 設定する値
);

パラメーター

  1. property_id: 変更したい設定項目を指定します(ENUM_SIGNAL_INFO_INTEGER列挙型)。
  2. SIGNAL_INFO_CONFIRMATIONS_DISABLED: 注文実行時の確認画面を無効にするかどうか(trueで無効)。
  3. SIGNAL_INFO_COPY_SLTP: ストップロスとテイクプロフィットをコピーするかどうか(trueでコピー)。
  4. SIGNAL_INFO_DEPOSIT_PERCENT: シグナルに使用する証拠金の割合(0~100)。
  5. SIGNAL_INFO_SUBSCRIPTION_ENABLED: シグナルのコピー機能自体を有効にするかどうか。
  6. value: 設定したい値をlong型で指定します(論理値の場合は true または false)。

戻り値

設定に成功した場合は true、失敗した場合は false を返します。失敗した場合は GetLastError() 関数を呼び出すことで、詳細なエラー原因を特定できます。

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

以下のコードは、EAの初期化時(OnInit)に、シグナルコピーの設定が正しく行われているかをチェックし、必要に応じて設定を自動修正する実践的な例です。

//+------------------------------------------------------------------+
//| EA初期化関数                                                      |
//+------------------------------------------------------------------+
int OnInit()
{
   // 1. ストップロス(SL)とテイクプロフィット(TP)を必ずコピーするように設定
   if(!SignalInfoSetInteger(SIGNAL_INFO_COPY_SLTP, true))
   {
      Print("SL/TPコピー設定の変更に失敗しました。エラーコード: ", GetLastError());
   }
   else
   {
      Print("SL/TPコピー設定を有効化しました。");
   }

   // 2. 約定時の確認画面をスキップ(高速なコピーを実現するため)
   if(!SignalInfoSetInteger(SIGNAL_INFO_CONFIRMATIONS_DISABLED, true))
   {
      Print("確認画面無効化の設定に失敗しました。");
   }
   else
   {
      Print("注文確認画面を無効化しました。");
   }

   // 3. 使用する証拠金の割合を50%に制限(リスク管理の一環)
   if(!SignalInfoSetInteger(SIGNAL_INFO_DEPOSIT_PERCENT, 50))
   {
      Print("証拠金使用率の設定に失敗しました。");
   }
   else
   {
      Print("シグナル用証拠金使用率を50%に設定しました。");
   }

   return(INIT_SUCCEEDED);
}

このコードをEAに組み込むことで、ユーザーが手動で設定を変更し忘れても、EAが起動するたびに「安全かつ効率的なシグナルコピー設定」を維持することができます。

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

  1. シグナル購読が前提:
    当然ながら、そもそもシグナルを購読(サブスクライブ)していない口座でこの関数を実行しても意味がありません。購読状態でない場合、関数は失敗するか、設定が反映されないことがあります。

  2. 権限の制限:
    MT5のオプション設定(「ツール」→「オプション」→「シグナル」)において、大元の「リアルタイムのシグナル購読を有効にする」にチェックが入っていない場合、プログラムから個別の設定を変更しようとしても動作しないケースがあります。

  3. データ型の不一致:
    value引数は long 型ですが、SIGNAL_INFO_DEPOSIT_PERCENT のように数値を渡すものと、SIGNAL_INFO_COPY_SLTP のように論理値(true/false)を渡すものが混在しています。MQL5では boollong に暗黙的に変換されますが、コードの可読性のために何をセットしているのか明確に意識しましょう。

  4. 変更の即時性:
    この関数で値を変更した直後に、設定がターミナル全体に反映されるまでごくわずかなタイムラグが生じることがあります。設定変更直後に次のトレード処理を行う場合は注意が必要です。

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

アルゴリズムトレードやシグナルコピーにおいて、プログラムのコード以上に勝敗を左右するのが「物理的な通信環境」です。自宅のPCでEAを稼働させている開発者は多いですが、一般的な光回線やWi-Fi環境では、ブローカーのサーバーとの間に数十から数百ミリ秒のネットワーク遅延(レイテンシ)が発生します。この遅延は、スリッページ(注文価格と約定価格のズレ)を招き、バックテストでは右肩上がりだったロジックが、実運用ではネットワークコストだけで利益を食い潰されるという事態を引き起こします。

プロのクオンツエンジニアがコンマ数秒の約定スピードを追求するのは、それが直接的な収益に直結することを知っているからです。極限まで遅延を削り、安定した稼働を実現するには、ブローカーの取引サーバーに物理的に近いデータセンターに設置された「専用のVPS(仮想専用サーバー)」の利用が不可欠です。24時間365日の安定稼働はもちろん、超高速なネットワーク環境を確保することは、自動売買の世界において「スタートラインに立つための最低条件」と言っても過言ではありません。

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

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

コメント

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