1. MarketBookAdd関数の概要と実務での活用法
MarketBookAddは、特定の銘柄の「板情報(DOM: Depth of Market)」の購読を開始するための関数です。MT5(MQL5)において、板情報を取得して分析したり、板の変化をトリガーにトレードを行いたい場合、まずこの関数を呼び出して「板情報の配信を受け取ります」という宣言をサーバーに行う必要があります。
実務での活用法とつまずきポイント:
実務レベルでは、単なるインジケーター作成よりも「HFT(高頻度取引)」に近い戦略や、大口注文の動向を探る「オーダーフロー・トレーディング」の実装に活用されます。
初心者が最もつまずきやすいのは、「この関数を呼び出しただけではデータは取得できない」という点です。MarketBookAddはあくまで「購読の予約」に過ぎません。実際に板データが更新されたタイミングで処理を行うには、イベントハンドラであるOnBookEvent関数を併用し、さらにMarketBookGet関数を使って具体的な価格や数量を取り出す必要があります。
2. 構文と戻り値
MarketBookAdd関数の構造は非常にシンプルです。
bool MarketBookAdd(
string symbol // 銘柄名
);
パラメーター
- symbol: 板情報を取得したい銘柄名を指定します(例: “USDJPY”, “EURUSD”など)。現在のチャートの銘柄を指定する場合は
_Symbolを使用します。
戻り値
- true: 購読設定に成功した場合。
- false: 失敗した場合。失敗の理由は
GetLastError()関数で確認できます。
※注意:ブローカー側がその銘柄の板情報を提供していない場合、この関数は false を返します。FX銘柄では板情報が提供されないブローカーも多いため、事前に確認が必要です。
3. 具体的な使い方・実践サンプルコード
以下は、EA(エキスパートアドバイザー)の初期化時に板情報の購読を開始し、更新されるたびに最良気配値(一番近い買い注文と売り注文)を表示するサンプルコードです。
//+------------------------------------------------------------------+
//| SampleMarketBook.mq5|
//+------------------------------------------------------------------+
#property strict
//--- 初期化関数
int OnInit()
{
// 板情報の購読を開始
if(!MarketBookAdd(_Symbol))
{
Print("板情報の購読に失敗しました。エラーコード:", GetLastError());
return(INIT_FAILED);
}
Print(_Symbol + " の板情報購読を開始しました。");
return(INIT_SUCCEEDED);
}
//--- 終了処理関数
void OnDeinit(const int reason)
{
// EA終了時には必ず購読を解除する
MarketBookRelease(_Symbol);
Print("板情報の購読を解除しました。");
}
//--- 板情報が更新されるたびに呼び出されるイベントハンドラ
void OnBookEvent(const string &symbol)
{
// 更新された銘柄が現在のチャートの銘柄か確認
if(symbol != _Symbol) return;
MqlBookInfo book[]; // 板情報を格納する配列
// 板情報の取得
if(MarketBookGet(_Symbol, book))
{
// 配列には「売り注文(ASK)」と「買い注文(BID)」が混在して入る
// 通常、配列の前半に売り、後半に買いが入る(ブローカーによる)
string comment = "板情報更新:\n";
for(int i=0; i < ArraySize(book); i++)
{
string type = (book[i].type == BOOK_TYPE_SELL) ? "SELL" :
(book[i].type == BOOK_TYPE_BUY) ? "BUY" : "OTHER";
comment += StringFormat("[%d] %s - 価格: %.3f 数量: %lld\n",
i, type, book[i].price, book[i].volume);
}
Comment(comment); // チャート上に表示
}
else
{
Print("板情報の取得に失敗しました。");
}
}
4. 使用上の注意点とよくあるエラー
- 必ず
MarketBookReleaseを呼ぶこと
MarketBookAddでリソースを確保した後は、EAを停止する際や銘柄を切り替える際に、必ずMarketBookRelease関数を呼んで購読を解除してください。これを忘れると、ターミナルの動作が重くなったり、メモリリークの原因となります。 - すべてのブローカーで使えるわけではない
FX(外国為替証拠金取引)の場合、インターバンク直結のECN方式を採用しているブローカーでないと、板情報(板の厚み)が配信されないことが多々あります。 - OnBookEventの負荷に注意
板情報は1秒間に数回〜数十回という非常に高い頻度で更新されます。OnBookEvent内で重い計算処理やループ処理を行うと、プラットフォーム全体のレスポンスが悪化し、肝心の約定チャンスを逃すことになります。 - ストラテジーテスターでの制限
MT5の標準的なバックテスト機能では、完全な板情報の履歴(DOM履歴)を再現できない場合があります。板情報を用いた戦略は、デモ口座でのフォワードテストが不可欠です。
5. 【重要】自動売買における約定スピードと環境の罠
板情報を利用するような高度なアルゴリズムトレードにおいて、最もエンジニアが軽視してはならないのが「物理的なネットワーク遅延(レイテンシ)」です。自宅のPCや一般的な家庭用光回線から自動売買を行う場合、ブローカーのサーバーとの間には数百ミリ秒もの通信タイムラグが生じています。板情報が更新されたと検知した瞬間に注文を出しても、その注文がサーバーに届く頃には、板の状況はすでに変化してしまっているのです。
この遅延は、スリッページ(注文価格と約定価格のズレ)や約定拒否を引き起こし、理論上の利益をすべて食いつぶす致命的な損失要因となります。板情報の変化にミリ秒単位で反応し、極限まで約定の優位性を確保するためには、ブローカーのデータセンター(Equinix NY4やLD4など)に物理的に近い場所にある「専用のVPS(仮想専用サーバー)」の活用が必須条件です。プロのクオンツ環境では、1ミリ秒の短縮のために環境を整えるのが常識であり、勝てるロジックを無駄にしないための最優先事項といえます。
💡 この記事の内容を実運用で活かすには?
この記事の内容を実運用で活かすには、正しい環境が必要です。
特にVPSを使わないと、このロジックは再現できません。

コメント