MarketBookRelease関数の働き・役割
MarketBookRelease関数は、指定されたシンボルの板情報を閉鎖し、板情報の変更通知設定をキャンセルするために使用されます。この関数を使用することで、不要になった板情報の受信を停止し、システムリソースを効率的に管理することができます。
通常、MarketBookRelease関数はMarketBookAdd関数で板情報を開いた後に呼び出されます。MarketBookAdd関数がOnInit関数から呼ばれた場合、対応するMarketBookRelease関数もOnDeinit関数で呼ばれるべきです。
公式リファレンスではOnInit関数と書かれていますが、MarketBookAdd関数とMarketBookRelease関数の両方をOnInit関数から呼び出すと、板情報の追加と閉鎖が同時に起こってしまい、意図した動作にならない可能性があります。、公式リファレンスの記述はOnDeinit関数の間違いであると思われます。
また、MarketBookAdd関数がクラスのコンストラクタから呼ばれた場合は、MarketBookRelease関数はクラスのデストラクタから呼ばれるべきです。これにより、板情報の管理を適切に行い、エキスパートアドバイザーの動作を安定させることができます。
MarketBookRelease関数の引数について
MarketBookRelease関数の引数は以下の通りです。
引数:
bool MarketBookRelease(
string symbol // 銘柄名
);
symbol引数には、板情報の変更通知設定を解除したいシンボルの名称を指定します。例えば、「EURUSD」や「GBPUSD」などの通貨ペア名が使われます。この引数を適切に設定することで、指定したシンボルの板情報を正しく管理することができます。
MarketBookRelease関数の戻り値について
MarketBookRelease関数の戻り値は、板情報の閉鎖が成功したかどうかを示します。
- true: 板情報の閉鎖が成功した場合。この場合、指定したシンボルの板情報の変更通知設定が正常に解除されたことを意味します。
- false: 板情報の閉鎖が失敗した場合。この場合、指定したシンボルの板情報の変更通知設定が解除されなかったことを意味します。
関数がfalseを返す場合、エラーメッセージを取得するためにGetLastError関数を使用して、具体的なエラーの原因を確認することが推奨されます。これにより、閉鎖に失敗した理由を特定し、適切な対策を講じることができます。
注意点
同様に、MarketBookAdd関数がクラスのコンストラクタから呼ばれた場合、MarketBookRelease関数はクラスのデストラクタから呼ばれるべきです。
板情報の閉鎖が成功したかどうかを確認するためには、関数の戻り値をチェックし、必要に応じてGetLastError関数を使用してエラーの詳細を確認することが重要です。これにより、板情報の変更通知設定が適切に解除されたかどうかを確実に確認できます。
また、板情報の管理を適切に行うことで、システムリソースの効率的な使用とエキスパートアドバイザーの安定した動作を確保することができます。特に、不要な板情報の受信を停止することは、パフォーマンスの向上とリソースの無駄遣いを防ぐために重要です。
MarketBookRelease関数を使ったサンプルコード
以下に、MarketBookRelease関数を使用した具体的なコード例を示します。
このサンプルコードは、指定したシンボルの板情報を開き、一定期間待機した後にその板情報の変更通知設定を解除します。
// シンボル名を定義します
#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関数は、エラーコードをリセットします。この関数を呼び出すことで、前の操作で発生したエラーコードをクリアし、新しい操作に影響を与えないようにします。