MqlBookInfo構造体とは
MqlBookInfo構造体は、板情報に関する詳細な情報を提供するために使用されます。この構造体には、注文の種類、価格、ボリューム、正確なボリュームといった情報が含まれており、特定のシンボルに対する市場の状況を把握するのに役立ちます。板情報は、一部のシンボルでのみ利用可能であり、リアルタイムで市場情報の詳細や流動性を評価するために使用されます。
※構造体自体についての詳細は↓の記事をご参照ください。
typeフィールド
typeフィールドは、ENUM_BOOK_TYPE列挙型で定義された注文の種類を表します。ENUM_BOOK_TYPEは、注文が買い注文か売り注文かを示すために使用されます。このフィールドにより、板情報の各エントリがどのような種類の注文であるかを識別することができます。注文の種類を明確にすることで、市場の買い手と売り手の動向をより正確に把握することができます。
ENUM_BOOK_TYPE列挙型について
ENUM_BOOK_TYPEは、板情報の取引注文の種類を識別するために使用されます。この列挙型により、取引の方向や注文の種類が明確に定義されています。
BOOK_TYPE_SELL
BOOK_TYPE_SELLは、売り注文(オファー)を示します。これは、特定の価格で売りたいとする注文です。
BOOK_TYPE_BUY
BOOK_TYPE_BUYは、買い注文(ビッド)を示します。これは、特定の価格で買いたいとする注文です。
BOOK_TYPE_SELL_MARKET
BOOK_TYPE_SELL_MARKETは、売りの成行注文を示します。成行注文は、現在の市場価格で即座に売却する注文です。
BOOK_TYPE_BUY_MARKET
BOOK_TYPE_BUY_MARKETは、買いの成行注文を示します。成行注文は、現在の市場価格で即座に購入する注文です。
priceフィールド
priceフィールドは、注文の価格を示します。このフィールドはdouble型で、特定の注文が提示されている価格を表します。価格情報は、取引の判断や市場の動向を把握するために重要です。
volumeフィールド
volumeフィールドは、注文のボリュームを示します。このフィールドはlong型で、特定の価格で取引される予定の量を表します。ボリューム情報は、市場の流動性や注文の影響力を評価するために重要です。
volume_realフィールド
volume_realフィールドは、より正確なボリュームを示します。このフィールドはdouble型で、volumeフィールドよりも精度の高い注文のボリュームを表します。特に取引量が細かく調整される市場では、このフィールドが有用です。
MqlBookInfo構造体を使う上での注意点
MqlBookInfo構造体は事前定義されているため、特別な宣言や説明は不要です。この構造体を使用する際は、その型の変数を宣言するだけで済みます。具体的には、MqlBookInfo構造体の配列を宣言し、MarketBookGet関数を使用して現在のDOM情報を取得することができます。
ただし、DOM(Depth of Market)はすべてのシンボルで利用できるわけではありません。一部のシンボルに限定されているため、使用する際は対象のシンボルがDOMをサポートしているか確認する必要があります。
また、MqlBookInfo構造体のtypeフィールドにはENUM_BOOK_TYPEの値が格納されます。これにより、注文の種類や方向を明確に識別できますが、適切に処理するためには、各ENUM_BOOK_TYPEの値を正しく理解しておくことが重要です。
MqlBookInfo構造体を使ったサンプルコード
以下に、MqlBookInfo構造体を使用して現在のDOM情報を取得する具体的なコード例を示します。各ステップについて詳細な日本語のコメントを付けています。
// MqlBookInfo構造体の配列を宣言します
MqlBookInfo priceArray[];
// MarketBookGet関数を使用して現在のDOM情報を取得します
bool getBook = MarketBookGet(NULL, priceArray);
if (getBook)
{
// 取得したDOM情報の配列サイズを取得します
int size = ArraySize(priceArray);
// 現在のシンボルについての板情報をエキスパートログに出力します
Print("MarketBookInfo about ", Symbol());
// 取得した各板情報を出力します
for (int i = 0; i < size; i++)
{
PrintFormat("Type: %d, Price: %f, Volume: %d, Volume Real: %f",
priceArray[i].type,
priceArray[i].price,
priceArray[i].volume,
priceArray[i].volume_real);
}
}
else
{
// DOM情報の取得に失敗した場合のエラーメッセージを出力します
Print("Failed to receive DOM for the symbol ", Symbol());
}
このサンプルコードでは、まずMqlBookInfo構造体の配列を宣言します。その後、MarketBookGet関数を使用して現在のDOM情報を取得し、取得した情報をエキスパートログに出力します。DOM情報の取得に失敗した場合は、エラーメッセージをエキスパートログに出力します。
サンプルコードに使われた関数や文法要素の簡単な解説
MqlBookInfo構造体の配列宣言
// MqlBookInfo構造体の配列を宣言します
MqlBookInfo priceArray[];
この行では、MqlBookInfo構造体の配列を宣言しています。この配列には、MarketBookGet関数によって取得される現在のDOM情報が格納されます。
MarketBookGet関数
// MarketBookGet関数を使用して現在のDOM情報を取得します
bool getBook = MarketBookGet(NULL, priceArray);
MarketBookGet関数は、現在のDOM情報を取得し、それをMqlBookInfo構造体の配列に格納します。この関数は、DOM情報の取得に成功するとtrueを返し、失敗するとfalseを返します。第一引数にはシンボル名を指定しますが、NULLを指定すると現在のチャートのシンボルが使用されます。
ArraySize関数
// 取得したDOM情報の配列サイズを取得します
int size = ArraySize(priceArray);
ArraySize関数は、配列のサイズ(要素の数)を取得します。ここでは、取得したDOM情報の配列サイズを取得し、後続の処理で使用します。
Print関数
// 現在のシンボルについての板情報をエキスパートログに出力します
Print("MarketBookInfo about ", Symbol());
Print関数は、指定したメッセージをエキスパートログに出力します。ここでは、現在のシンボルについての板情報をエキスパートログに出力しています。
PrintFormat関数
// 取得した各板情報を出力します
PrintFormat("Type: %d, Price: %f, Volume: %d, Volume Real: %f",
priceArray[i].type,
priceArray[i].price,
priceArray[i].volume,
priceArray[i].volume_real);
PrintFormat関数は、指定したフォーマットに従って文字列をフォーマットし、エキスパートログに出力します。ここでは、各MqlBookInfo構造体のフィールド値をフォーマットして出力しています。
Symbol関数
// 現在のシンボルを取得します
Symbol()
Symbol関数は、現在のチャートのシンボル名を返します。このシンボル名は、ログメッセージなどに使用されます。