【MQL4関数】OnDeinit関数とは?アンイニシャルコード発生時に実行されるイベント関数

関数
朝日奈りさ
朝日奈りさ

OnDeinit関数は、自動売買終了時に実行されるイベント関数です。しかし実際には、自動売買を終了するとき以外にも、実行されるタイミングがあります。

OnDeinit関数とは

「自動売買を終了するときにオブジェクトを削除したい!」

という方は、OnDeinit関数を使ってみましょう!

OnDeinit関数は、イベント関数の一つで、自動売買を終了するときなどに、自動的に一度だけ実行される関数です。

そのため、自動売買開発者の多くの方が、オブジェクトの削除や、メモリの開放などに使っています。

また、OnDeinit関数は、自動売買(エキスパートアドバイザ)を新規作成すると、自動的にプログラミングされています。

自動的にプログラミングされているのは、主に以下の3つなので、確認しておくと良いでしょう。

今回は、OnDeinit関数に注目して解説していきます。

自動売買を新規作成したときのプログラム

自動売買を新規作成すると、以下のようなプログラムが自動作成されます。

//+------------------------------------------------------------------+
//|                                             newExpertAdviser.mq4 |
//|                                     Copyright 2022, Asahina Risa |
//|                                      https://mql-programing.com/ |
//+------------------------------------------------------------------+
#property copyright "Copyright 2022, Asahina Risa"
#property link      "https://mql-programing.com/"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+

このように、すでにOnInit関数・OnDeinit関数・OnTick関数が記述されています。

OnDeinit関数は、23行目にあります。

OnDeinit関数の特徴

OnDeinit関数はイベント関数なので、イベントが起こったときに実行されます。

そのイベントとは、「アンイニシャルコードが発生したとき」です。

先程、OnDeinit関数は「自動売買を終了するときに実行されるイベント関数」と、解説しましたが、実際はそのタイミング以外にも実行されます

つまり、自動売買がアンイニシャルコードを発生させたときに、一度だけ実行される関数ということになります。

そのため、OnDeinit関数は、さまざまなタイミングで実行されますので、アンイニシャルコードも確認しておくと良いでしょう。

別名「初期化解除関数」(deinitialization function)とも呼ばれる関数です。

OnDeinit関数の書き方

OnDeinit関数の使い方は、基本的な関数と同じです。

関数をマスターしていない方はこちらの記事が参考になります。

基本的な書き方

OnDeinit関数はとてもシンプルな関数です。

引数はint型で、reason(アンイニシャルコード)で実行できます。

また、OnDeinit関数内で reason を変更できないように、const属性がついております。

戻り値はvoid型です。

OnDeinit関数の基本的な書き方は以下の通りです。

void OnDeinit(const int reason)
  {

  }

戻り値はvoid型なので、特にreturnは必要ありません。

戻り値

なし

引数

const int型 (アンイニシャルコード

OnDeinit関数のサンプルプログラム

サンプルプログラムは、こちらになります。

アンイニシャルコードを網羅しておりますので、テンプレートとしても使えます。

void OnDeinit(const int reason)
  {

   //アンイニシャルコード(数値)を表示
   Print("アンイニシャルコード = ", reason);

   //アンイニシャルコードの詳細を表示
   //getUninitReasonText関数は、下に記述
   Print("アンイニシャルリーズン1 = ", getUninitReasonText(_UninitReason));

   //アンイニシャルコードの詳細を表示するもう一つの方法
   //getUninitReasonText関数は、下に記述
   Print("アンイニシャルリーズン2 = ", getUninitReasonText(UninitializeReason()));

  }

//+------------------------------------------------------------------+
//| 初期化理由コードのテキスト記述を返す                                   |
//+------------------------------------------------------------------+
string getUninitReasonText(int reasonCode)
  {
   string text = "";

   switch(reasonCode)
     {
      case REASON_PROGRAM:
         text = "ExpertRemove関数で終了した";
         break;
      case REASON_REMOVE:
         text = "プログラムがチャートから削除された";
         break;
      case REASON_RECOMPILE:
         text = "プログラムが再コンパイルされた";
         break;
      case REASON_CHARTCHANGE:
         text = "通貨ペアまたは時間軸が変更された";
         break;
      case REASON_CHARTCLOSE:
         text = "チャートが閉じられた";
         break;
      case REASON_PARAMETERS:
         text = "ユーザーによって入力パラメータが変更された";
         break;
      case REASON_ACCOUNT:
         text = "トレードサーバーへの再接続が発生した。または別アカウントに変更された";
         break;
      case REASON_TEMPLATE:
         text = "新しいテンプレートが適用された";
         break;
      case REASON_INITFAILED:
         text = "OnInit関数が0以外の値を返した";
         break;
      case REASON_CLOSE:
         text = "ターミナルが閉じられた";
         break;
      default:
         text = "その他の理由";
     }
   return text;
  }

 

 

まとめ

OnDeinit関数は、「アンイニシャルコードが発生したとき」に実行されるイベント関数です。

感覚的には、自動売買を終了したとき以外は、分かりにくいと思いますが、さまざまなタイミングで実行されています。

例えば、自動売買のパラメータを変更したときや、表示する時間足を変更したときなどです。

プログラムによっては、このタイミングでオブジェクトを削除したい場合がありますので、OnDeinit関数に記述してみてください。