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