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