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

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

SymbolInfoIntegerは、指定した通貨ペア(シンボル)に関する「整数型(long型)」の情報を取得するための非常に重要な関数です。

MQL5で自動売買(EA)を開発する際、プログラムは「今、この通貨ペアで取引が可能か?」「ストップレベルは何ポイントか?」「小数点以下の桁数はいくつか?」といった情報をリアルタイムで把握する必要があります。これらの情報は証券会社や口座タイプによって動的に変わるため、ソースコードに数値を直接書き込む(ハードコーディングする)のは非常に危険です。

実務においては、特に以下の用途で多用されます。
取引制限の確認: 現在、その通貨ペアが取引禁止になっていないかのチェック。
計算精度の維持: 注文価格や決済価格を算出するための「桁数(Digits)」の取得。
約定ルールの把握: カウントダウン方式か、マーケット実行方式かなどの注文ルールの判定。

初心者のうちは、定義済みの変数(例:_Digits)を使いがちですが、マルチ通貨ペアに対応したEAを作る場合や、より詳細な取引条件を判定する場合には、このSymbolInfoIntegerを使いこなすことが中級者への第一歩となります。

2. 構文と戻り値

SymbolInfoIntegerには、用途に合わせて2つの書き方(オーバーロード)があります。

構文1:値を直接受け取る(簡易版)

long SymbolInfoInteger(
   string                    name,      // 通貨ペア名(例:"USDJPY")
   ENUM_SYMBOL_INFO_INTEGER  prop_id    // 取得したい情報の種類(識別子)
);

構文2:成功成否を判定する(推奨版)

戻り値として関数が成功したかどうかの「真偽値(bool)」を返し、実際の値は参照渡しした変数に格納されます。エラーハンドリングが必要な実戦向きの書き方です。

bool SymbolInfoInteger(
   string                    name,      // 通貨ペア名
   ENUM_SYMBOL_INFO_INTEGER  prop_id,   // 取得したい情報の種類
   long&                     long_var   // 値を格納する変数
);

主な戻り値(識別子の例)

  • SYMBOL_DIGITS: 価格の小数点以下の桁数。
  • SYMBOL_TIME: 最終価格更新時のサーバー時間。
  • SYMBOL_TRADE_MODE: 取引の制限状態(フルアクセス、決済のみ、禁止など)。
  • SYMBOL_SPREAD_FLOAT: スプレッドが変動制かどうか。

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

以下のコードは、EAの初期化時(OnInit)やティック動作時(OnTick)に、その通貨ペアが現在正常に取引可能かどうかを確認する実用的な例です。

void OnTick()
{
    string symbol = _Symbol; // 現在の通貨ペア
    long tradeMode;
    long digits;

    // 1. 取引モードを取得(フルアクセス可能か確認)
    if(SymbolInfoInteger(symbol, SYMBOL_TRADE_MODE, tradeMode))
    {
        if(tradeMode == SYMBOL_TRADE_MODE_DISABLED)
        {
            Print("警告: この通貨ペアは現在、取引が禁止されています。");
            return;
        }
    }
    else
    {
        Print("エラー: 取引モードの取得に失敗しました。");
        return;
    }

    // 2. 小数点桁数を取得して価格を正規化する例
    if(SymbolInfoInteger(symbol, SYMBOL_DIGITS, digits))
    {
        double rawPrice = SymbolInfoDouble(symbol, SYMBOL_ASK);
        // 取得したdigitsを利用して価格を丸める
        double normalizedPrice = NormalizeDouble(rawPrice, (int)digits);
        Print("現在のAsk価格(正規化済み): ", normalizedPrice);
    }

    // 3. ストップレベル(指値・逆指値を置く際の最小距離)を確認
    long stopLevel;
    if(SymbolInfoInteger(symbol, SYMBOL_TRADE_STOPS_LEVEL, stopLevel))
    {
        Print("現在のストップレベル: ", stopLevel, " ポイント");
    }
}

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

開発者が陥りやすいミスには以下のものがあります。

  1. 戻り値の型に注意:
    SymbolInfoIntegerlong 型を返します。例えば SYMBOL_DIGITS を取得して NormalizeDouble に渡す際は、(int) で型変換(キャスト)しないとコンパイル警告が出る場合があります。
  2. 気配り値表示の罠:
    MT5の「気配値表示」ウィンドウに表示されていない通貨ペアの情報を取得しようとすると、正しく値が取れないことがあります。EAで他通貨ペアの情報を参照する場合は、あらかじめ SymbolSelect 関数で気配値表示に追加しておく必要があります。
  3. 論理値の扱い:
    「スプレッドが変動制か?」などの二択の情報も long 型(0 または 1)で返ってきます。if(result == true) ではなく、数値として判定する癖をつけましょう。

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

アルゴリズムトレードにおいて、SymbolInfoIntegerで正確な情報を取得することは「戦略の第一歩」に過ぎません。どれほど完璧なロジックを組んだとしても、自宅のPC環境から一般的なインターネット回線を通じて注文を出す場合、物理的な「ネットワーク遅延(レイテンシ)」という致命的な壁にぶつかります。FXの世界では、ミリ秒単位の遅延がスリッページを引き起こし、本来得られるはずだった利益を削り取ります。特にスキャルピングや高頻度取引に近いロジックでは、自宅PCでの運用は「負けるべくして負ける」環境と言っても過言ではありません。

極限まで約定スピードを高め、プロ水準のトレード環境を構築するには、証券会社のサーバーに物理的に近いデータセンターに設置された「専用のVPS(仮想専用サーバー)」の利用が不可欠です。24時間365日の安定稼働はもちろんのこと、ネットワーク遅延を最小化することで、注文の拒否(リクオート)や意図しない価格での約定を防ぐことができます。システムトレードを「投資」として捉えるのであれば、インフラへの投資を惜しむことは、エンジニアとして最も避けるべきリスクなのです。

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

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

コメント

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