【MQL5】MarketBookAdd関数について

MQL5リファレンス
スポンサーリンク
スポンサーリンク

MarketBookAdd関数の働き・役割

MarketBookAdd関数は、指定されたシンボルの板情報をオープンし、DOM(Depth of Market)の変更通知を受信する為に使用されます。

DOM(Depth of Market)とは

DOM(Depth of Market)とは、特定のシンボルに対する現在の売り注文と買い注文のリストを指し、取引所や市場における注文状況を詳細に表示するものです。
これにより、トレーダーは特定のシンボルの流動性や売買圧力を視覚的に把握することができ、市場の動向をより正確に予測するための重要な情報を得ることができます。

通常、MarketBookAdd関数OnInit関数クラスコンストラクタ内で呼び出されます。これにより、エキスパートアドバイザーが起動した時点で板情報の変更通知設定が確立され、リアルタイムで変更通知を受け取ることが可能になります。

MarketBookAdd関数の引数について

MarketBookAdd関数引数は以下の通りです。

引数:

bool MarketBookAdd(
  string symbol  // シンボル
);

symbol引数には、板情報を取得したいシンボルの名称を指定します。このシンボルの名称は文字列で表され、例えば「EURUSD」や「GBPUSD」などの通貨ペア名が使われます。

MarketBookAdd関数の戻り値について

MarketBookAdd関数戻り値は、板情報のオープンが成功したかどうかを示します。

  • true: 板情報のオープンが成功した場合。この場合、指定したシンボルの板情報の変更通知設定が正常に行われたことを意味します。
  • false: 板情報のオープンが失敗した場合。この場合、指定したシンボルの板情報の変更通知設定が行われなかったことを意味します。

関数がfalseを返す場合、エラーメッセージを取得するためにGetLastError関数を使用して、具体的なエラーの原因を確認することが推奨されます。

MarketBookAdd関数を使う際の注意点

通常、MarketBookAdd関数OnInit関数クラスコンストラクタで呼び出されるべきです。これは、エキスパートアドバイザーが起動した時点で板情報の変更通知設定を確立し、リアルタイムで変更通知を受け取るためです。

板情報の変更通知を処理するためには、エキスパートアドバイザープログラムにOnBookEvent関数を含める必要があります。この関数は、板情報に変更があった際に自動的に呼び出され、その変更を適切に処理します。

さらに、MarketBookAdd関数を使用した後には、不要になった板情報の変更通知設定を解除するためにMarketBookRelease関数を呼び出すことが推奨されます。これにより、リソースの無駄遣いを防ぎ、システムのパフォーマンスを維持することができます。

MarketBookAdd関数を使ったサンプルコード

以下に、MarketBookAdd関数を使用した具体的なコード例を示します。
このサンプルコードは、指定したシンボルの板情報を開き、一定期間待機した後にその板情報の変更通知設定を解除します。

// シンボル名を定義します
#define SYMBOL_NAME "GBPUSD"

// スクリプトプログラムの開始関数
void OnStart()
{
  // SYMBOL_NAMEシンボルの板情報を開く
  if (!MarketBookAdd(SYMBOL_NAME))
  {
    // 板情報のオープンに失敗した場合のエラーメッセージを表示
    PrintFormat("MarketBookAdd(%s) failed. Error: %d", SYMBOL_NAME, GetLastError());
    return;
  }

  // 板情報を正常に開いたことを操作ログに送信
  PrintFormat("The MarketBook for the '%s' symbol was successfully opened and a subscription to change it was received", SYMBOL_NAME);

  // 2秒待つ(この間に板情報の変更通知を受信する可能性があります)
  Sleep(2000);

  // 開いた板情報の変更通知設定を解除する
  ResetLastError();
  if (MarketBookRelease(SYMBOL_NAME))
  {
    // 板情報の変更通知設定を正常に解除できたことを操作ログに送信
    PrintFormat("MarketBook for the '%s' symbol was successfully closed", SYMBOL_NAME);
  }
  else
  {
    // 板情報の変更通知設定の解除に失敗した場合のエラーメッセージを表示
    PrintFormat("Error %d occurred when closing MarketBook using the '%s' symbol", GetLastError(), SYMBOL_NAME);
  }
  
  /*
  実行結果:
  The MarketBook for the 'GBPUSD' symbol was successfully opened and a subscription to change it was received
  MarketBook for the 'GBPUSD' symbol was successfully closed
  */
}

サンプルコードに使われた関数や文法要素の簡単な解説

シンボル名の定義では、「SYMBOL_NAME」という定数を定義しています。この定数は、板情報を取得するシンボルの名称を表します。defineディレクティブを使用することで、プログラム内でこの名前を簡単に再利用できます。

OnStart関数は、スクリプトが実行されるときに最初に呼び出される関数です。この関数内で板情報の設定やその他の初期化処理を行います。

MarketBookAdd関数は、指定されたシンボルの板情報を開き、その変更通知設定を行います。この関数が失敗した場合(戻り値がfalseの場合)、エラーメッセージを表示し、処理を終了します。

PrintFormat関数は、指定した形式で文字列をフォーマットし、エキスパートログに出力します。ここでは、MarketBookAdd関数が失敗した場合のエラーメッセージを表示しています。

Sleep関数は、指定した時間(ミリ秒単位)だけプログラムの実行を一時停止します。ここでは、2秒間待機することで、板情報の変更通知を受信する時間を確保しています。

MarketBookRelease関数は、指定されたシンボルの板情報の変更通知設定を解除します。この関数が成功した場合(戻り値がtrueの場合)、正常に解除されたことをエキスパートログに表示します。

GetLastError関数は、最後に発生したエラーコードを取得します。ここでは、MarketBookRelease関数が失敗した場合のエラーコードを表示するために使用しています。

ResetLastError関数は、エラーコードをリセットします。この関数を呼び出すことで、前の操作で発生したエラーコードをクリアし、新しい操作に影響を与えないようにします。

コメント

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