ExpertRemove関数の働き・役割について
ExpertRemove関数はMT5の環境で稼働しているエキスパートアドバイザー(EA)をチャートから停止させて取り除くために使用されます。
ExpertRemove関数を呼び出すと、EAの動作を停止するためのフラグが設定されますが、EAは即座には停止しません。
現在処理中のイベントが完了した後に、次のイベントがブロックされ、OnDeinit関数が呼び出されてEAが取り除かれます。
※OnDeinit関数についての詳細は↓の記事をご参照ください
ExpertRemove関数の引数と戻り値について
ExpertRemove関数は引数を取らず、呼び出すだけで使用できます。またExpertRemove関数は戻り値を返さないvoid型です。
ExpertRemove関数を使う際の注意点
ExpertRemove関数を呼び出した後、EAはすぐには停止しません。
処理中のイベントが完了し、その後でEAが停止します。
この挙動は、関数内で非同期の操作や重要な後処理(リソースの解放、開いたファイルのクローズ、データベース接続の終了など)を行う場合に考慮する必要があります。
※「非同期の操作」とは、現在実行中のコードの完了を待たずに、他のタスクや処理が開始または実行されるプログラミングの手法です。
MT5環境下における非同期操作の例としては、外部サーバーからのデータ取得や、大量のデータに対する複雑な計算をバックグラウンドで行うことなどが考えられます。
これらの処理は、EAのメインのトレーディングロジックとは独立して行われることが多いです。
ExpertRemove関数を使用する場合、この関数が呼び出されるとEAは即座には停止せず、現在進行中のイベントが完了するまでは動作を続けるため、非同期で実行されている処理がある場合、それらが完了する前にEAが停止すると、データが失われるか、期待した結果が得られない可能性があります。
そのため、非同期の操作が終了することを確認してからExpertRemove関数を呼び出すなど、適切なタイミングで関数を管理する必要があります。
また、ストラテジーテスター内でOnInit関数からExpertRemove関数を呼び出すと、現在のパラメータセットに対するテストがキャンセルされ、初期化エラーと見なされます。
OnInit関数はEAがチャートにロードされた直後に呼び出される関数で、初期設定やリソースの確保など、EAの運用開始前に必要な準備を行います。
したがって、この段階でExpertRemove関数
を使用してEAを停止させると、EAが正常にセットアップされず、テスト自体が無効になるため、正確なパフォーマンス評価が行えなくなります。
※OnInit関数についての詳細は↓の記事をご参照ください
ExpertRemove関数を使ったサンプルコード
input int ticks_to_close = 20; // EAがアンロードされるまでのティック数
//+------------------------------------------------------------------+
//| エキスパート初期化解除に使用される関数 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
// 現在の時刻と関数名、初期化解除の理由コードをコンソールに出力
Print(TimeCurrent(), ": ", __FUNCTION__, " 初期化解除の理由コード = ", reason);
// コメントをクリアする
Comment("");
}
//+------------------------------------------------------------------+
//| エキスパートティック関数 |
//+------------------------------------------------------------------+
void OnTick()
{
static int tick_counter = 0; // ティックカウンターを初期化
// ティックカウンターをインクリメント
tick_counter++;
// コメントにEAがアンロードされるまでの残りティック数を表示
Comment("\nこのエキスパートアドバイザーはあと", (ticks_to_close - tick_counter), "ティックでアンロードされます: ", __FILE__);
// ティックカウンターが設定値に達した場合
if (tick_counter >= ticks_to_close)
{
// エキスパートアドバイザーをアンロードする
ExpertRemove();
// アンロード時の時刻と関数名をコンソールに出力
Print(TimeCurrent(), ": ", __FUNCTION__, " エキスパートアドバイザーがアンロードされます");
}
// ティックカウンターの現在値をコンソールに出力
Print("ティックカウンター =", tick_counter);
}
このコードでは、OnTick関数でティック(価格の値動き)のカウントを行い、設定したティック数に達したらExpertRemove関数を呼び出してエキスパートアドバイザーを終了させます。
また、OnDeinit関数では、エキスパートアドバイザーが終了する理由と時刻をログに記録しています。
※「エキスパートアドバイザーが終了する理由」についての詳細は↓の記事をご参照ください
※当サイトでは、プログラミング経験ゼロの方でも、プログラミングの基礎から学べる
をメインコンテンツとして展開しています。
第0回から、順を追って勉強していけばプログラミングの経験がなくてもMQL5を使って、MT5用のEAが作れるように書いています。最初は難しいと感じるかもしれませんが、繰り返し勉強していく事で自然とスキルが身についていくはずです。興味ある方は是非ご覧ください。
コメント