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

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

MQL5のSignalInfoGetString関数は、MQL5コミュニティが提供する「シグナル」サービスにおいて、現在選択または購読しているシグナルの文字列型の情報(シグナル名、通貨、作成者のログイン名など)を取得するための関数です。

実務レベルの開発、特に「複数のシグナルをコピーしてポートフォリオを組むEA」や「シグナルの稼働状況を監視するダッシュボード」を作成する際に重宝します。

実務でのつまずきポイント:
初心者がよく陥るのが、「自分の口座の取引履歴やステータスを取得する関数」と混同してしまうケースです。この関数はあくまで「MQL5のシグナルサービス(コピーコピー機能)」に特化したものです。自分の口座名を取得したい場合はAccountInfoStringを使用する必要があるため、用途を明確に区別することが重要です。

また、シグナルの情報を取得する前には、内部的にどのシグナルを対象にするかを選択状態にする必要がある点も、コードを書く上での重要な作法となります。

2. 構文と戻り値

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

string SignalInfoGetString(
   ENUM_SIGNAL_INFO_STRING  property_id   // プロパティ識別子
);

パラメーター

  • property_id: 取得したい情報の種類をENUM_SIGNAL_INFO_STRING列挙型から指定します。

代表的な識別子(property_id)

識別子 内容
SIGNAL_INFO_NAME シグナルの名称
SIGNAL_INFO_CURRENCY シグナルの基準通貨
SIGNAL_INFO_AUTHOR_LOGIN シグナル作成者のログイン名

戻り値

指定したプロパティに対応するstring型(文字列)の値が返されます。情報が存在しない場合やエラーが発生した場合は、空の文字列が返されます。

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

以下のコードは、現在ターミナルで購読または選択されているシグナルの名前と通貨情報を取得し、チャート上に表示する実用的なスクリプト例です。

//+------------------------------------------------------------------+
//| シグナル情報を取得して表示するスクリプト                                 |
//+------------------------------------------------------------------+
void OnStart()
{
   // 1. 現在購読している、あるいは選択されているシグナルの情報を取得
   // 注:シグナルが選択されていない場合は、以下の関数は失敗します。

   // シグナル名を取得
   string signalName = SignalInfoGetString(SIGNAL_INFO_NAME);

   // シグナルの基準通貨を取得
   string signalCurrency = SignalInfoGetString(SIGNAL_INFO_CURRENCY);

   // シグナル作成者の情報を取得
   string author = SignalInfoGetString(SIGNAL_INFO_AUTHOR_LOGIN);

   // 2. 取得結果のチェックと出力
   if(signalName != "")
   {
      Print("--- シグナル情報取得成功 ---");
      Print("シグナル名: ", signalName);
      Print("基準通貨: ", signalCurrency);
      Print("作成者ID: ", author);

      // チャート左上にコメント表示
      Comment("コピー中のシグナル: " + signalName + "\n" +
              "通貨: " + signalCurrency + "\n" +
              "作成者: " + author);
   }
   else
   {
      // シグナルが設定されていない場合
      Print("シグナル情報が見つかりません。シグナルを購読しているか確認してください。");

      // エラーコードを確認する場合
      int lastError = GetLastError();
      if(lastError != 0) Print("エラーコード: ", lastError);
   }
}

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

開発時に注意すべき点は以下の3点です。

  1. シグナル購読の有無:
    SignalInfoGetStringは、MT5ターミナル側でシグナルサービスにログインし、対象のシグナルが有効(または選択状態)になっていないと正しい値を返しません。単にEAを動かすだけでは取得できない場合があるため、環境設定を確認してください。

  2. データ型の不一致:
    シグナルの「レバレッジ」や「購読料」を取得したい場合は、この関数ではなくSignalInfoGetDoubleSignalInfoGetIntegerを使用する必要があります。文字列以外のデータを取得しようとして「戻り値が空になる」というミスが頻発します。

  3. 非同期性:
    ネットワークの状態によっては、関数の呼び出し直後に最新データが反映されない場合があります。ループ処理などで連続して取得する場合は、適切なスリープ(Sleep関数)を挟むか、取得失敗時のリトライ処理を組み込むのが堅牢なコードへの近道です。

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

アルゴリズムトレードにおいて、ロジックと同じ、あるいはそれ以上に重要なのが「実行環境」です。自宅のPCや一般的な光回線でEAを運用している開発者の多くは、ネットワーク遅延(レイテンシ)という目に見えない壁によって、バックテスト通りの利益を出せずにいます。

FX市場はミリ秒単位で価格が変動します。自宅PCから海外の取引サーバーへ注文を出す際、数十から数百ミリ秒の遅延が発生し、その間に価格が滑る(スリッページ)ことで、本来得られるはずだった利益が削られ、逆に損失が拡大してしまいます。この致命的な問題を解決するには、取引サーバーの至近距離に位置する専用のVPS(仮想専用サーバー)導入が不可欠です。24時間安定稼働し、物理的な距離による遅延を極限まで排除したプロフェッショナルな環境を整えることこそが、システムトレーダーとして生き残るための最低条件と言っても過言ではありません。

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

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

コメント

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