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

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

SymbolInfoStringは、MQL5において特定の銘柄(通貨ペアなど)の「文字列型」の情報を取得するための非常に重要な関数です。FXのシステムトレード開発において、銘柄の正式名称、ベース通貨、利益通貨、あるいはブローカー特有のパス名などを動的に取得する際に使用します。

実務レベルの開発で初心者が特につまずきやすいのは、「どの情報が文字列(String)で、どの情報が数値(Integer/Double)なのか」の区別です。例えば、スプレッドや価格は数値データなので別の関数(SymbolInfoDoubleなど)を使いますが、通貨ペアの「説明文」や「基軸通貨名」はこのSymbolInfoStringでしか取得できません。

また、マルチ通貨ペアに対応したEAを作成する場合や、ブローカーによって「USDJPY.ext」のようにサフィックス(接尾辞)が付いている環境でも柔軟に動作するロジックを組む際、この関数で銘柄情報を動的に解析するスキルは必須となります。

2. 構文と戻り値

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

string  SymbolInfoString(
   string                    name,      // 銘柄名(通貨ペア名)
   ENUM_SYMBOL_INFO_STRING   prop_id    // 取得したい情報の種類(識別子)
   );

パラメーター

  1. name: 情報を取得したい銘柄名を文字列で指定します(例: "EURUSD")。現在チャートの銘柄を取得する場合は _Symbol または Symbol() を渡します。
  2. prop_id: 取得したい情報の識別子を指定します。主なものは以下の通りです。
    • SYMBOL_DESCRIPTION: 銘柄の長い説明(例: “Euro vs US Dollar”)
    • SYMBOL_CURRENCY_BASE: 基軸通貨(例: “EUR”)
    • SYMBOL_CURRENCY_PROFIT: 決済通貨(例: “USD”)
    • SYMBOL_PATH: 銘柄ツリー内のパス

戻り値

指定した銘柄の、指定したプロパティ(属性)に対応する文字列(string型)を返します。もし情報の取得に失敗した場合は、空の文字列を返します。

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

以下は、EAの初期化時(OnInit)に、現在運用している銘柄の詳細情報をログに出力する実用的なコード例です。

//+------------------------------------------------------------------+
//| 銘柄情報を取得して表示するサンプルプログラム                            |
//+------------------------------------------------------------------+
void DisplaySymbolInfo()
{
    // 現在のチャート銘柄名を取得
    string currentSymbol = _Symbol;

    // 1. 銘柄の説明文を取得(例: "Euro vs US Dollar")
    string description = SymbolInfoString(currentSymbol, SYMBOL_DESCRIPTION);

    // 2. 基軸通貨を取得(例: "EUR")
    string baseCurrency = SymbolInfoString(currentSymbol, SYMBOL_CURRENCY_BASE);

    // 3. 決済通貨を取得(例: "USD")
    string profitCurrency = SymbolInfoString(currentSymbol, SYMBOL_CURRENCY_PROFIT);

    // 4. ブローカーの銘柄パスを取得(例: "Forex\Majors\EURUSD")
    string path = SymbolInfoString(currentSymbol, SYMBOL_PATH);

    // エラーチェック(取得に失敗すると空文字が返る)
    if(description == "" || baseCurrency == "")
    {
        Print("銘柄情報の取得に失敗しました。エラーコード: ", GetLastError());
        return;
    }

    // 取得した情報をエキスパートログに出力
    Print("--- 銘柄情報: ", currentSymbol, " ---");
    Print("説明: ", description);
    Print("基軸通貨: ", baseCurrency);
    Print("決済通貨: ", profitCurrency);
    Print("パス: ", path);
}

// EAの初期化イベント
int OnInit()
{
    DisplaySymbolInfo();
    return(INIT_SUCCEEDED);
}

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

① 識別子の間違い(型違い)

最も多いミスは、スワップやストップレベルなどの「数値データ」をSymbolInfoStringで取得しようとすることです。これらは SymbolInfoDoubleSymbolInfoInteger を使用する必要があります。逆に、これら数値用関数で SYMBOL_CURRENCY_BASE を取得しようとしてもエラー(または意図しない挙動)になります。

② 存在しない銘柄の指定

第一引数の銘柄名を打ち間違えたり、気配り値表示に表示されていない銘柄をプログラムから参照しようとすると、戻り値は空(””)になります。必ず戻り値が空でないか、または GetLastError() でエラーが発生していないかを確認する癖をつけましょう。

③ 文字列比較の罠

SymbolInfoStringで取得した基軸通貨を比較する際(例: if(baseCurrency == "JPY"))、ブローカーによっては大文字・小文字が混在していたり、予期せぬ空白が含まれる可能性がゼロではありません。念のため比較前にトリミングや大文字変換を検討すると、より堅牢なプログラムになります。

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

アルゴリズムトレードにおいて、プログラムのロジックと同じくらい、あるいはそれ以上に重要なのが「実行環境」です。どれほど精緻なMQL5コードを書いても、自宅のPCから一般的なインターネット回線を通じて注文を出している限り、プロのクオンツや機関投資家には勝てません。家庭用回線では、ブローカーのサーバーに注文が届くまでに数十から数百ミリ秒の遅延(レイテンシ)が発生し、その間に価格が変動して「スリッページ」による致命的な損失を招くからです。

特に1分足以下の短期トレードや、一瞬のチャンスを突くスキャルピングにおいて、このネットワーク遅延は期待値をマイナスに叩き落とす要因となります。約定スピードを極限まで高め、物理的な距離によるハンデを解消するには、ブローカーのデータセンターに近いロケーションに設置された「専用のVPS(仮想専用サーバー)」の利用が必須です。24時間安定稼働し、低レイテンシ環境で執行される自動売買こそが、シストレ開発者が長期的に利益を残すための最低条件と言えます。

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

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

コメント

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