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

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

MQL5のMarketBookGetは、指定した通貨ペアや銘柄の「板情報(Depth of Market / DOM)」を取得するための関数です。一般的なFXの「価格(ティック)」だけでなく、その価格にどれだけの注文数量(ボリューム)が並んでいるかを構造体の配列として取得できます。

実務での活用法

FXのシステムトレード(シストレ)において、多くの開発者は「価格の動き」だけを追いかけがちですが、板情報を分析することで以下のような高度な戦略が可能になります。

  • スキャルピングの精度向上: 大口注文(厚い板)がある価格帯を特定し、反発やブレイクアウトの根拠にする。
  • 流動性の判定: 注文が薄い時間帯を避け、スリッページによる損失を最小限に抑える。
  • HFT(高頻度取引)的なアプローチ: 売り板と買い板のバランス(インバランス)から、数秒後の価格推移を予測する。

初心者の方が最初につまずくのは、「すべてのブローカーで使えるわけではない」という点です。板情報は主に取引所取引(株や先物)や、透明性の高いECN方式を採用しているFXブローカーでのみデータが配信されます。また、後述する「事前購読」の手順を忘れると、関数を呼び出してもデータが一切取れないため注意が必要です。


2. 構文と戻り値

MarketBookGet関数の仕様は以下の通りです。

bool MarketBookGet(
   string        symbol,     // 銘柄(通貨ペア)名
   MqlBookInfo&  book[]      // 板情報を格納する構造体配列
);

パラメーター

  1. symbol: 取得したい銘柄名を指定します(例: _Symbol)。
  2. book[]: MqlBookInfo型の動的配列を渡します。この配列に、現在の板情報が価格順に格納されます。

戻り値

  • 成功した場合:true
  • 失敗した場合:false(エラーコードは GetLastError() で確認可能)

MqlBookInfo構造体の中身

取得される配列の各要素には、以下の情報が含まれています。
* type: 注文の種類(売り板、買い板など)
* price: 価格
* volume: 数量(整数)
* volume_real: 数量(より精密な浮動小数点数)


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

MarketBookGetを使用する際は、OnInitMarketBookAddを呼び出して板情報の配信を「購読」し、OnBookEventという専用のイベントハンドラ内で処理を行うのが一般的です。

//+------------------------------------------------------------------+
//|                                               SimpleBookView.mq5 |
//+------------------------------------------------------------------+
#property strict

// 板情報を格納する配列
MqlBookInfo book_array[];

//--- 初期化関数
int OnInit()
{
   // 板情報の購読を開始(これを忘れるとデータが取得できません)
   if(!MarketBookAdd(_Symbol))
   {
      Print("板情報の購読に失敗しました。このブローカーは対応していない可能性があります。");
      return(INIT_FAILED);
   }
   return(INIT_SUCCEEDED);
}

//--- 終了処理
void OnDeinit(const int reason)
{
   // 購読を解除
   MarketBookRelease(_Symbol);
}

//--- 板情報が更新されるたびに呼ばれるイベント
void OnBookEvent(const string& symbol)
{
   // 対象の銘柄が現在のチャートと同じか確認
   if(symbol != _Symbol) return;

   // 板情報を取得
   if(MarketBookGet(_Symbol, book_array))
   {
      Comment("--- 現在の板情報 ---");
      string info = "";

      // 取得した板情報を上から順に表示(通常、売り板の価格が高い順に並ぶ)
      for(int i=0; i<ArraySize(book_array); i++)
      {
         string type = (book_array[i].type == BOOK_TYPE_SELL) ? "Sell" : 
                       (book_array[i].type == BOOK_TYPE_BUY)  ? "Buy"  : "Other";

         info += StringFormat("[%d] %s Price: %.5f, Vol: %.2f\n", 
                              i, type, book_array[i].price, book_array[i].volume_real);
      }
      Print(info); // ターミナルのエキスパートタブに出力
   }
   else
   {
      Print("板情報の取得に失敗しました。");
   }
}

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

  1. MarketBookAdd の呼び出し忘れ:
    MarketBookGetを呼び出す前に、必ずMarketBookAddを実行してください。これを行わないと、配列は常に空のままになります。
  2. OnTick ではなく OnBookEvent を使う:
    板情報は価格(ティック)が動かなくても、注文のキャンセルや追加だけで更新されます。そのため、OnTick内で処理すると情報を取りこぼす可能性があります。必ずOnBookEventを使用しましょう。
  3. 配列のサイズに注意:
    取得されるbook[]配列のサイズはブローカーによって異なります。5本しか取れないブローカーもあれば、数十本取れるブローカーもあります。ArraySize()で常に要素数を確認する癖をつけましょう。
  4. ブローカーの仕様確認:
    FX銘柄の場合、板情報自体を提供していないブローカーも多いです。その場合、MarketBookAddfalse を返します。

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

板情報を活用した戦略、特にスキャルピングや板の薄さを突くようなロジックにおいて、最も重要なのは「情報の鮮度」と「注文の到達速度」です。自宅のPC環境でEAを稼働させている場合、家庭用インターネット回線特有のネットワーク遅延(レイテンシ)や、PCのバックグラウンド処理によるOSの遅延が、致命的な損失を招くリスクがあります。

市場の板状況は1ミリ秒(1000分の1秒)単位で刻々と変化します。自宅PCからの注文がブローカーのサーバーに届く頃には、板の状況はすでに変わっており、意図しない価格で約定する「スリッページ」が多発します。この数ピップスの差が、長期的にはバックテストとリアルトレードの乖離を生む最大の要因となります。約定スピードを極限まで高め、物理的な距離による遅延を最小化するためには、ブローカーの取引サーバーと同じデータセンター内、あるいは至近距離に設置された専用のVPS(仮想専用サーバー)を利用することが、プロのクオンツエンジニアにとってはもはや「必須条件」と言えるでしょう。

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

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

コメント

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