1. SymbolInfoTick関数の概要と実務での活用法
MQL5で開発を行う際、最も頻繁に利用する関数のひとつがSymbolInfoTickです。この関数は、指定した通貨ペアの最新の価格情報(ティックデータ)を MqlTick という構造体に一括で取得する役割を持ちます。
実務開発において、初心者が最初につまずきやすいポイントは、「BidやAskといった定義済みの変数(MQL4スタイルの書き方)が常に最新であると誤認してしまうこと」です。MQL5はマルチスレッド環境に近い動作をするため、計算の瞬間に最新の価格を明示的に取得しにいく必要があります。
SymbolInfoTickを活用することで、単なる価格(Bid/Ask)だけでなく、その価格が更新された時刻(ミリ秒単位)や、直近の売買高、どの値が動いたのかを示すフラグまで取得できます。スキャルピングや高頻度取引(HFT)のロジックを組むクオンツエンジニアにとって、この「ミリ秒単位の鮮度」を確認できる点が非常に重要な活用ポイントとなります。
2. 構文と戻り値
SymbolInfoTick関数の構文は非常にシンプルですが、データの受け皿として「構造体」を使用するのが特徴です。
構文
bool SymbolInfoTick(
string symbol, // 通貨ペア名(銘柄名)
MqlTick& tick // MqlTick構造体の変数(参照渡し)
);
パラメーター
- symbol: 情報を取得したい通貨ペア名を指定します。現在のチャートの銘柄なら
_SymbolまたはSymbol()を使用します。 - 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. 使用上の注意点とよくあるエラー
開発時に注意すべき点は、「取得したデータの有効性チェック」です。
- 初期化の漏れ:
MqlTick構造体を宣言した直後は、中身は空(または不定)です。必ずSymbolInfoTickの戻り値がtrueであることを確認してから、その後の計算ロジックに進むようにしてください。 - 銘柄名の指定ミス: 異なる通貨ペア(例:
USDJPYのチャート上でEURUSDの価格を取得したい場合)を参照する場合、その銘柄が「気配り値表示」ウィンドウに表示されている必要があります。非表示の銘柄を指定するとエラーになることがあります。 - last値の誤用: FX(相対取引)では一般的に
bidとaskのみが更新され、lastは 0 になることが多いです。株や先物の取引所取引でない限り、価格参照にはbidまたはaskを使うのが正解です。 - OnTick以外での利用:
OnInit内で呼び出すと、まだティックが届いていない状態でfalseを返すことがあります。初期化時のみ特別な配慮が必要です。
5. 【重要】自動売買における約定スピードと環境の罠
アルゴリズムトレードにおいて、SymbolInfoTick でミリ秒単位の情報を取得する理由は、一瞬の価格変化を捉えるためです。しかし、どれほどコードを最適化したとしても、プログラムを動かす「環境」が貧弱であればすべてが無意味になります。自宅のPCや一般的な光回線では、プロバイダー経由のネットワーク遅延(レイテンシ)やOSのバックグラウンド処理によるジッターが発生し、MT5上の価格が手元のPCに届くまでにコンマ数秒の遅れが生じます。
このわずかな遅延が、シミュレーション(バックテスト)では勝てているロジックをリアルトレードで赤字へと変貌させます。意図した価格で約定せず「滑る(スリッページ)」現象を極限まで抑え、証券会社のサーバーに最速で注文を届けるためには、取引サーバーに物理的に近いデータセンターに設置された、24時間稼働の専用VPS(仮想専用サーバー)の使用が不可欠です。プロのクオンツを目指すのであれば、コードの質と同じくらい、インフラ環境の低遅延化に投資することを強く推奨します。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント