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を作成してみます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

コメントする