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

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. 使用上の注意点とよくあるエラー

  1. 必ず MarketBookRelease を呼ぶこと
    MarketBookAdd でリソースを確保した後は、EAを停止する際や銘柄を切り替える際に、必ず MarketBookRelease 関数を呼んで購読を解除してください。これを忘れると、ターミナルの動作が重くなったり、メモリリークの原因となります。
  2. すべてのブローカーで使えるわけではない
    FX(外国為替証拠金取引)の場合、インターバンク直結のECN方式を採用しているブローカーでないと、板情報(板の厚み)が配信されないことが多々あります。
  3. OnBookEventの負荷に注意
    板情報は1秒間に数回〜数十回という非常に高い頻度で更新されます。OnBookEvent 内で重い計算処理やループ処理を行うと、プラットフォーム全体のレスポンスが悪化し、肝心の約定チャンスを逃すことになります。
  4. ストラテジーテスターでの制限
    MT5の標準的なバックテスト機能では、完全な板情報の履歴(DOM履歴)を再現できない場合があります。板情報を用いた戦略は、デモ口座でのフォワードテストが不可欠です。

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

板情報を利用するような高度なアルゴリズムトレードにおいて、最もエンジニアが軽視してはならないのが「物理的なネットワーク遅延(レイテンシ)」です。自宅のPCや一般的な家庭用光回線から自動売買を行う場合、ブローカーのサーバーとの間には数百ミリ秒もの通信タイムラグが生じています。板情報が更新されたと検知した瞬間に注文を出しても、その注文がサーバーに届く頃には、板の状況はすでに変化してしまっているのです。

この遅延は、スリッページ(注文価格と約定価格のズレ)や約定拒否を引き起こし、理論上の利益をすべて食いつぶす致命的な損失要因となります。板情報の変化にミリ秒単位で反応し、極限まで約定の優位性を確保するためには、ブローカーのデータセンター(Equinix NY4やLD4など)に物理的に近い場所にある「専用のVPS(仮想専用サーバー)」の活用が必須条件です。プロのクオンツ環境では、1ミリ秒の短縮のために環境を整えるのが常識であり、勝てるロジックを無駄にしないための最優先事項といえます。

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

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

コメント

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