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

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

SymbolsTotal関数は、メタトレーダー5(MT5)で利用可能な銘柄(通貨ペア、CFD、指数など)の総数を取得するための関数です。

実務においては、単一の通貨ペアだけでなく、市場全体から特定の条件に合致する銘柄を探し出す「スキャニング(銘柄選別)」を行う際に不可欠な関数となります。例えば、「全通貨ペアの中からスプレッドが一定以下のものだけを抽出する」といったダッシュボード機能や、「多通貨ペア監視型EA」を開発する際のループ処理の基準として頻繁に利用されます。

初心者が特につまずきやすいポイントは、「気配値表示ウインドウに表示されている数」「取引サーバーに存在する全銘柄数」の使い分けです。この関数は引数によってこの2つを切り替えるため、仕様を正しく理解していないと、数千もの銘柄をループで回してしまい、PCの動作が極端に重くなるという失敗を招くことがあります。

2. 構文と戻り値

SymbolsTotal関数の構成は非常にシンプルです。

int SymbolsTotal(
   bool  selected      // True: 気配値表示のみ, False: 全銘柄
);

パラメーター

  • selected
    • true を指定した場合:MT5の「気配値表示」ウインドウに現在追加されている銘柄の総数を返します。
    • false を指定した場合:利用しているブローカーのサーバー上に存在する(MT5で選択可能な)すべての銘柄の総数を返します。

戻り値

  • 指定した条件に基づく銘柄の総数を int 型で返します。

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

以下は、現在「気配値表示」に入っている全銘柄をループで確認し、それぞれの銘柄名とスプレッドをエキスパートログに出力する実用的なスクリプトの例です。

//+------------------------------------------------------------------+
//|                                          CheckMarketWatch.mq5    |
//|                                  Copyright 2024, Quant Engineer  |
//+------------------------------------------------------------------+
void OnStart()
{
    // 1. 気配値表示ウインドウに表示されている銘柄数を取得
    int totalSymbols = SymbolsTotal(true);

    PrintFormat("現在の気配値表示数: %d 銘柄", totalSymbols);

    // 2. 銘柄数分だけループ処理を行う
    for(int i = 0; i < totalSymbols; i++)
    {
        // インデックス番号から銘柄名(文字列)を取得
        // SymbolNameの第2引数は、SymbolsTotalの引数と合わせる必要があります
        string symbolName = SymbolName(i, true);

        // 銘柄のスプレッド情報を取得
        long spread = SymbolInfoInteger(symbolName, SYMBOL_SPREAD);

        // ログに出力
        PrintFormat("Index: %d, 銘柄名: %s, スプレッド: %d", i, symbolName, spread);
    }
}

このコードのように、SymbolsTotalで全体の回数を把握し、それをfor文の終了条件に使うのが一般的な実装パターンです。

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

① ループの境界値に注意

プログラミングの基本ですが、銘柄のインデックスは「0」から始まります。そのため、ループの条件式は i < SymbolsTotal(true) とし、最大インデックスが 総数 - 1 になるようにしてください。

② SymbolName 関数との不一致

SymbolsTotal(true) で銘柄数を取得した場合は、銘柄名を取得する SymbolName(i, true) の第2引数も必ず true(気配値表示から取得)にする必要があります。ここが一致していないと、意図しない銘柄名を取得したり、エラーが発生したりする原因になります。

③ サーバー全銘柄取得(false)の負荷

SymbolsTotal(false) を使用すると、ブローカーによっては数千の銘柄が対象となります。これらすべてに対して価格情報やインジケータの値を計算するループを回すと、MT5がフリーズするほどの負荷がかかるため、実戦のEA(自動売買プログラム)では必要な銘柄だけを気配値に絞り込んで true で運用するのが定石です。

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

アルゴリズムトレードにおいて、ロジックの優位性と同じくらい重要なのが「実行環境」です。SymbolsTotalを活用してどれほど高度な多通貨監視ロジックを組んだとしても、ご自宅のPC環境から一般的なインターネット回線を通じて注文を出している限り、プロの世界では勝負になりません。物理的な距離によるネットワーク遅延(レイテンシ)は、注文がブローカーに届くまでの間に価格を変化させ、不利な約定(スリッページ)を引き起こすからです。

コンマ一秒を争うFXの自動売買において、自宅PCでの運用は通信断絶やOSのアップデート、そして致命的なネットワーク遅延というリスクを常に抱えています。極限まで約定スピードを高め、理論通りの利益を積み上げるには、ブローカーのサーバーに近いデータセンターに設置された「FX専用VPS」の導入が不可欠です。プロのクオンツエンジニアが、まず最初にトレード環境というインフラに投資するのは、それが「技術で解決できない物理的な損失」を回避する唯一の手段であることを知っているからです。

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

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

コメント

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