【MQL4関数】OnInit関数とは?自動売買の初期化に使われるイベント関数

【中級編】MQLプログラムの読み方・書き方
朝日奈りさ
朝日奈りさ

OnInit関数は、自動売買の初期化に使われるイベント関数です。OnInit関数は、自動売買を起動すると、自動的に一度だけ実行される関数です。そのため、変数の初期化などの処理に使うと良いでしょう。

OnInit関数とは

「自動売買の変数を初期化したい!」

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

OnInit関数は、イベント関数の一つで、自動売買が起動したときに、自動的に一度だけ実行される関数です。

そのため、自動売買開発者の多くの方が、変数の初期化などの処理に使っています。

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

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

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

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

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

//+------------------------------------------------------------------+
//|                                             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関数が記述されています。

OnInit関数は、13行目にあります。

OnInit関数の特徴

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

そのイベントとは、「自動売買が起動したとき」です。

つまり、自動売買をチャートにドラッグアンドドロップしたときに、一度だけ実行されます。

そのため、OnInit関数は、変数などのパラメータの初期化をするために使用されることが多いです。

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

OnInit関数の書き方

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

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

基本的な書き方

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

引数なしで実行できます。

戻り値はint型ですが、以下のプログラムの4行目にあるように、「INIT_SUCCEEDED」という定数を戻すことが多いです。

INIT_SUCCEEDED定数は、「OnInit関数が正常に終了しました。」ということを表している定数なので、このまま使用して問題ありません。

逆に異常終了した場合は、INIT_FAILED定数を使用しましょう。

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

int OnInit()
  {
   //初期化したい変数などを記述
   return(INIT_SUCCEEDED);
  }

戻り値は int型なので、returnで値を戻すようにしましょう。

戻す値は、定数が用意されています。

OnInit関数の戻り値はこちらの記事が詳しいので、よろしければどうぞ。

戻り値

int型(ENUM_INIT_RETCODE

引数

なし

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

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

このプログラムには4つの機能を実装しております。

  • パラメータの異常検知
  • メモリの異常検知
  • 関数の異常検知
  • 正常終了
//異常値を検出するためのパラメータ
input int ma_period=10;

int OnInit()
  {


   //パラメータが異常かどうかをチェック
   if(ma_period <= 0)
     {
      //パラメータが異常なので、INIT_PARAMETERS_INCORRECT定数を戻す
      return (INIT_PARAMETERS_INCORRECT);
     }


   //メモリに異常がないかチェック
   int memory = TerminalInfoInteger(TERMINAL_MEMORY_TOTAL);
   if(memory < 2000)
     {
      //メモリが異常なので、INIT_AGENT_NOT_SUITABLE定数を戻す
      return (INIT_AGENT_NOT_SUITABLE);
     }


   //その他異常がないかチェック
   double ma = iMA(Symbol(), PERIOD_CURRENT, 14, 0, MODE_SMA, PRICE_CLOSE, 0);
   if(ma <= 0)
     {
      //値が異常なので、INIT_FAILED定数を戻す
      return(INIT_FAILED);
     }


   //正常なので、INIT_SUCCEEDED定数を戻す
   return(INIT_SUCCEEDED);
  }

 

 

まとめ

OnInit関数は、自動売買を起動すると一度だけ実行されるイベント関数です。

自動売買を、チャートにドラッグアンドドロップすると実行されます。

そのため、パラメータの初期化などに使用されることが多いので、サンプルプログラムを参考にして、プログラミングしてみてください。

ちなみに、OnInit関数は、自動的に実行されますが、手動で実行することも可能です。

他の関数と同じように、OnInit関数を呼び出すことで、実行できますので、プログラムの途中で初期化したいときに実行すると良いでしょう。