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

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

MQL5で開発を行う際、最も頻繁に利用する関数のひとつがSymbolInfoTickです。この関数は、指定した通貨ペアの最新の価格情報(ティックデータ)を MqlTick という構造体に一括で取得する役割を持ちます。

実務開発において、初心者が最初につまずきやすいポイントは、「BidやAskといった定義済みの変数(MQL4スタイルの書き方)が常に最新であると誤認してしまうこと」です。MQL5はマルチスレッド環境に近い動作をするため、計算の瞬間に最新の価格を明示的に取得しにいく必要があります。

SymbolInfoTickを活用することで、単なる価格(Bid/Ask)だけでなく、その価格が更新された時刻(ミリ秒単位)や、直近の売買高、どの値が動いたのかを示すフラグまで取得できます。スキャルピングや高頻度取引(HFT)のロジックを組むクオンツエンジニアにとって、この「ミリ秒単位の鮮度」を確認できる点が非常に重要な活用ポイントとなります。

2. 構文と戻り値

SymbolInfoTick関数の構文は非常にシンプルですが、データの受け皿として「構造体」を使用するのが特徴です。

構文

bool SymbolInfoTick(
   string           symbol,     // 通貨ペア名(銘柄名)
   MqlTick&         tick        // MqlTick構造体の変数(参照渡し)
);

パラメーター

  1. symbol: 情報を取得したい通貨ペア名を指定します。現在のチャートの銘柄なら _Symbol または Symbol() を使用します。
  2. tick: MqlTick 型の変数を指定します。関数が成功すると、この変数の中に最新の価格データが格納されます。

戻り値

  • 成功時: true を返します。
  • 失敗時: false を返します。エラーの詳細は GetLastError() 関数で確認できます。

MqlTick構造体の中身

取得できる tick 変数には以下のデータが含まれています。
time: 最新の価格更新時刻(秒単位)
bid: 現在の売値
ask: 現在の買値
last: 直近の約定価格(取引所取引の場合に主に使用)
volume: 直近の出来高
time_msc: 最新の価格更新時刻(ミリ秒単位)
flags: どのデータが更新されたかを示すフラグ

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

以下は、SymbolInfoTick を使って最新のスプレッドを計算し、条件を満たしたときにログ出力する実用的なEAのテンプレートです。

//+------------------------------------------------------------------+
//|                                              TickDataExample.mq5 |
//|                                  Copyright 2023, Quant Engineer  |
//+------------------------------------------------------------------+
#property strict

//--- OnTickイベント:価格が動くたびに実行される
void OnTick()
{
    // MqlTick型の変数を宣言(データの受け皿)
    MqlTick last_tick;

    // 最新のティック情報を取得
    // _Symbolは現在のチャートの銘柄(例:USDJPY)を指す
    if(SymbolInfoTick(_Symbol, last_tick))
    {
        // 構造体から各値を取り出す
        double bid = last_tick.bid;
        double ask = last_tick.ask;
        long time_msc = last_tick.time_msc; // ミリ秒単位の時刻

        // スプレッドを計算(ポイント単位)
        double spread = (ask - bid) / _Point;

        // ログに出力(実戦ではここをエントリー判断に使う)
        PrintFormat("時刻: %I64d, Bid: %.5f, Ask: %.5f, スプレッド: %.1f points", 
                    time_msc, bid, ask, spread);

        // 例:スプレッドが一定以上の場合はエントリーを避けるなどのフィルター
        if(spread > 20) 
        {
            Print("警告:スプレッドが拡大しているため、取引を抑制します。");
        }
    }
    else
    {
        // 取得に失敗した場合のエラー処理
        Print("ティック情報の取得に失敗しました。エラーコード:", GetLastError());
    }
}

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

開発時に注意すべき点は、「取得したデータの有効性チェック」です。

  1. 初期化の漏れ: MqlTick 構造体を宣言した直後は、中身は空(または不定)です。必ず SymbolInfoTick の戻り値が true であることを確認してから、その後の計算ロジックに進むようにしてください。
  2. 銘柄名の指定ミス: 異なる通貨ペア(例:USDJPYのチャート上でEURUSDの価格を取得したい場合)を参照する場合、その銘柄が「気配り値表示」ウィンドウに表示されている必要があります。非表示の銘柄を指定するとエラーになることがあります。
  3. last値の誤用: FX(相対取引)では一般的に bidask のみが更新され、last は 0 になることが多いです。株や先物の取引所取引でない限り、価格参照には bid または ask を使うのが正解です。
  4. OnTick以外での利用: OnInit 内で呼び出すと、まだティックが届いていない状態で false を返すことがあります。初期化時のみ特別な配慮が必要です。

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

アルゴリズムトレードにおいて、SymbolInfoTick でミリ秒単位の情報を取得する理由は、一瞬の価格変化を捉えるためです。しかし、どれほどコードを最適化したとしても、プログラムを動かす「環境」が貧弱であればすべてが無意味になります。自宅のPCや一般的な光回線では、プロバイダー経由のネットワーク遅延(レイテンシ)やOSのバックグラウンド処理によるジッターが発生し、MT5上の価格が手元のPCに届くまでにコンマ数秒の遅れが生じます。

このわずかな遅延が、シミュレーション(バックテスト)では勝てているロジックをリアルトレードで赤字へと変貌させます。意図した価格で約定せず「滑る(スリッページ)」現象を極限まで抑え、証券会社のサーバーに最速で注文を届けるためには、取引サーバーに物理的に近いデータセンターに設置された、24時間稼働の専用VPS(仮想専用サーバー)の使用が不可欠です。プロのクオンツを目指すのであれば、コードの質と同じくらい、インフラ環境の低遅延化に投資することを強く推奨します。

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

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

コメント

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