【移植#39】Level IIは接続先しだい — MT5で板情報の有無を確かめる¶

この記事の3行まとめ
- Level IのBid・Askと、Level IIの板情報は別物です
- MT5の標準APIで板を購読し、非対応ならLevel Iだけを表示します
- 実機ではEURUSDの板深度0・エラー4901を検出し、14バッファを独立検証しました
今回の原典は「MetaTrader4 Level IIとは」¶
投稿日順で次に当たる2010年1月28日の記事は、当時のMT4で利用できたLevel II、つまり板情報の紹介です。
元記事「MetaTrader4 Level II とは。」を読む
原典では、現在のAsk・Bidを示すLevel Iに対し、複数価格帯の注文状況を並べるものをLevel IIと説明しています。当時はMT5への標準搭載が期待される一方、MT4ではブローカー固有のプラグインとして提供される例がありました。
紹介されていたMasterForexの例では、売りと買いを各3段表示し、板からのワンクリック取引にも対応していました。ただし、その会社専用のMT4とECNデモサーバーが必要で、他社環境へそのまま持ち運べる機能ではありません。原典も、実用というより板の見方を知る教材として扱っています。
15年以上前のブローカーや専用プラグインを現在の利用先として勧める記事ではありません。今回は「接続先によって板の有無が変わる」という本質を、MT5標準APIだけで確かめます。
Level IとLevel IIを分けて表示する¶
配布インジケーターは、現在のチャートで次の2系統を監視します。
| 区分 | このインジケーターで表示する内容 | 取得元 |
|---|---|---|
| Level I | 現在のBid、Ask、スプレッド | 最新ティック |
| Level II | 買い・売りの価格階層、数量、行種別 | 板スナップショット |
Level Iは通常のFXチャートでも利用できます。一方、Level IIは、接続しているブローカー、口座、サーバー、銘柄が板を公開している場合だけ取得できます。
MQL5公式リファレンスのSymbol Propertiesでは、SYMBOL_TICKS_BOOKDEPTHが板に表示できる最大リクエスト数を示し、0ならリクエストキューがないと定義されています。本ツールはこの値を最初に表示するため、「コードが壊れて空なのか」「提供元が板を公開していないのか」を切り分けやすくしています。
MT5標準の板イベントを使う¶
Level IIの取得は、次の順序で行います。
MarketBookAdd()で現在の銘柄の板を購読するOnBookEvent()を受けたら、対象銘柄か確認するMarketBookGet()で最新の板を配列へ取得する- 買い側と売り側を分け、価格順に上位5段を表示する
- 終了時に、購読成功時だけ
MarketBookRelease()を1回呼ぶ
公式のMarketBookAddは板イベントの購読を開始し、MarketBookGetは事前に開いた板のスナップショットを取得します。OnBookEventは同じチャート上のプログラムへ配信されるため、本ツールはイベントの銘柄名が現在の銘柄と一致するかを必ず確認します。
各行はMqlBookInfoとして渡されます。価格と数量だけでなく、買い指値、売り指値、成行買い、成行売りなどの種別も数えます。ただし、実際にどの種別や数量が配信されるかは提供元しだいです。
実機では「板なし」を正しく検出した¶
今回の検証環境では、EURUSDのLevel I価格は取得できましたが、Level IIは提供されませんでした。これは失敗を隠した結果ではなく、接続先が宣言した最大板深度と購読エラーをそのまま表示したものです。
| 検証項目 | 実測結果 |
|---|---|
| 銘柄・時間足 | EURUSD・H1 |
| Level I Bid | 1.14134 |
| Level I Ask | 1.14134 |
| 表示時スプレッド | 0.0 points |
| 提供元の最大板深度 | 0 |
| 板の購読 | 失敗 |
| エラーコード | 4901 |
| 板スナップショット | なし |
| 板の行数 | 0 |
| 板イベント受信数 | 0 |
価格は撮影瞬間の値であり、再実行時には変わります。エラー4901は、公式のRuntime Errorsで「板情報を追加できない」ことを示すERR_BOOKS_CANNOT_ADDと定義されています。最大板深度0とも整合する結果です。
ここで重要なのは、板が空だから市場に流動性がない、と判断しないことです。今回分かったのは、接続中の口座・サーバー・銘柄が、この端末へLevel IIの注文キューを公開していないことだけです。Level IのBid・Askが動いている市場でも、板APIが利用できない場合があります。
対応銘柄なら上位5段を表示する¶
板を提供する銘柄へ適用した場合は、パネルに次の情報を表示します。
- 提供元が宣言する最大板深度
- 購読状態と最後のエラー
OnBookEvent()の受信回数- 最新スナップショットの全行数
- 買い指値、売り指値、成行買い、成行売りの行数
- 買い側と売り側の上位5段の価格・数量
表示段数はInpLevelsToShowで変更できます。板の更新時だけでなくタイマーでも再取得するため、購読直後の初期状態やイベントのない環境でも、現在の提供状況を確認できます。
このインジケーターは監視専用です。原典にあった板からのワンクリック注文は実装しておらず、売買注文を一切送りません。
14バッファを別経路で照合した¶
画面表示だけを合格条件にせず、配布インジケーターは14本の計算バッファを公開します。
- 診断値の準備完了
- 提供元の最大板深度
- 板購読の成否
- 購読時のエラーコード
- 板の全行数
- 買い指値の行数
- 売り指値の行数
- 成行買いの行数
- 成行売りの行数
- Level I Bid
- Level I Ask
- スプレッド
- 板イベント受信数
- 板スナップショット取得の成否
検証EAは各バッファをCopyBuffer()で読み取る一方、同じ銘柄の最大板深度、最新ティック、板スナップショットを独立して取得しました。板がない環境では、「購読失敗・4901・行数0・Level Iは有効」という組み合わせがすべて一致することを確認しています。
| 検証項目 | 最終結果 |
|---|---|
| 配布インジケーターのコンパイル | 0エラー・0警告 |
| 検証EAのコンパイル | 0エラー・0警告 |
| 最大板深度 | 0で一致 |
| 購読エラー | 4901で一致 |
| 板の行数 | 0で一致 |
| Level I価格 | 独立取得値と一致 |
| 診断バッファ | 14本一致 |
| 実画面キャプチャー | 成功 |
| 売買注文 | なし |
| 外部ファイルの作成・更新 | なし |
ダウンロードと使い方¶
39_MT5_Level2_DOM_Monitor_v1_00.mq5 をダウンロード
MT5のIndicatorsへ保存してコンパイルし、確認したい銘柄のチャートへ適用してください。
- 表示段数を変える:
InpLevelsToShow - パネルを非表示にする:
InpShowPanel=false - Level IIを試す:利用先が板を提供すると明示している銘柄・口座・サーバーへ接続する
- 比較する:同じ銘柄でも口座種別やサーバーを変え、最大板深度と購読状態を見る
板対応をうたう環境でも、休場中、未購読の銘柄、権限のない口座では取得できない可能性があります。実際の取引前に、自分の接続条件で表示を確認してください。
使う前に知っておきたい限界¶
- FXは分散型市場であり、表示された板が市場全体の注文を表すとは限りません。
- 板はブローカーや接続先会場が見せている範囲で、深さ、数量、行種別が異なります。
- 最良Bid・AskとLevel IIの最上段が、常に同じ更新タイミングになる保証はありません。
- 最大板深度が0、購読失敗、行数0のいずれも、それだけで流動性ゼロを意味しません。
- 板の注文は約定前に変更・取消されるため、将来の値動きを確定する情報ではありません。
- 本ツールは監視専用で、注文、変更、取消、ポジション管理を行いません。
- 表示結果はブローカー、口座、サーバー、銘柄、取引時間によって変わります。
- このインジケーターは利益や予測精度を保証しません。
ロジック評価の結論¶
原典のLevel IIは、MT4本体の共通機能ではなく、特定ブローカーの専用環境へ依存していました。現在のMT5には標準の板APIがありますが、APIが存在することと、すべての銘柄で板データが届くことは別です。
今回のEURUSDではLevel IIを表示できませんでした。しかし、最大板深度0、購読エラー4901、板行数0を明示しながら、Level IのBid・Askは継続表示できました。対応・非対応の両方を区別して見せることが、接続先依存の機能を移植するときの重要な設計です。
板情報は「ある前提」で売買ロジックへ組み込む前に、自分の運用環境で本当に取得できるかを確認する必要があります。このモニターは、その最初の切り分けに使う道具です。
前後の記事¶
前: 【移植#38】MT5チャートを一時的に隠す — Pキーで戻せるプライバシーシールド