14.ユーザー定義関数
これまで関数が沢山出てきましたが、それらはMQL言語を作った人が「こんなが処理が必要だろう」と考えて用意してくれたものです。
ユーザー定義関数は、私たち自身がどんな処理をするか決めて、自分で作った関数のことです。
繰り返し行うような処理を関数化して1か所にまとめておくことで、ソースコードの可読性が向上し、ミスも少なくなります。
関数が行う処理は、関数の中だけで完結していると(関数外のソースコードに依存しないほど)流用が効くため、他のEAを作る時に便利です。
とは言え依存してしまう時は依存してしまうものなので、ケースバイケースです。
どんな処理を関数化すべきかの判断は徐々に慣れていきましょう。
関数を作るには、
- 処理の内容
 - 処理対象のデータ(引数)
 - 処理結果のデータ(戻り値)
 
を決める(決まっている)必要があります。
以下の形式で記述します。
戻り値のデータ型  関数名(引数のデータ型  引数を受け取る変数名) {
   処理…;
   return  戻り値のデータ;
}
戻り値がある場合は、
return データ;
でデータを必ずreturnさせる必要があります。
なお、returnが実行された段階で、関数は処理を終了します。
return以降に何か処理が書かれていたとしても、それは実行されません。
関数の処理は、先頭から何かしらのreturnまで、と覚えておきましょう。
ではサンプルとして、
指定バーが陽線かどうかを調べる
という処理を行う関数を書いてみます。
バーの指定は、現在のバー(最新)を0としてインデックスで指定させるので、int型の引数が1つ必要です。
調べるのは「陽線かどうか」なので、陽線ならtrue、それ以外ならfalseを返すようにします。
以下のようになります。
bool isBullish(int index) {
   if(Close[index] > Open[index]) {
      return(true);
   } else {
      return(false);
   }
}
以上がユーザー定義関数です。
今回で関数についてはひとまず終了です。
プログラムは、関数だらけです。
ここで改めて、初めてのEAを作成してみるで書いた「Hello worldプログラム」を見直してみます。
//+------------------------------------------------------------------+
//|                                                        hello.mq4 |
//|                                                                  |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright ""
#property link      ""
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Print("Hello, world!");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
    
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
    
  }
//+------------------------------------------------------------------+
OnInit、OnDeinit、OnTickそれぞれが、関数の形をしていることが分かると思います。
これらのイベントハンドラも関数です。
次回は、これまでの内容を含めてシンプルなEAを作成してみます。