今回は関数の作成についてです。
EAのプログラミングでは、イベントごとに決まった関数が実行される仕組みになっています。MQL4とMQL5とで違うところはありますが、Block EAでは、MQL4に合わせて以下の3つの関数をブロックとして用意しています。
これらの関数ブロックは、次のようなコードに変換されます。
void Tick()
{
}
int OnInit()
{
return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
}
ティック時実行関数がOnTick()ではなく**Tick()**になっているのは、共通ライブラリでMQL4とMQL5の互換性を持たせるためです。
「変数の宣言」でも書きましたが、MQLでは、変数宣言時にデータ型を指定する必要がありました。
関数の場合も同じで、それぞれの引数のデータ型、戻り値がある場合は戻り値のデータ型が必要となります。
上の3つの関数は、関数名や引数、戻り値のデータ型が決まっているので、ブロックからそのまま変換できるように定義してあります。
ところが、ユーザーが独自に関数を定義する場合、データ型の指定が問題となってきます。
というのも、Blocklyが標準で対応している「関数の作成」の機能には、データ型を設定する部分がないのです。しかも、「関数の作成」ツールボックスは、関数を定義するとその関数がツールボックスに動的に追加されるようになっていて、改修するのがちょっと面倒です。
仕方ないので、「関数の作成」ツールボックスはBlockly標準のまま使い、コードに変換する際に独自のやり方をするようにしました。
なので、ちょっとわかりにくいところがあるかもしれません。
とりあえず、関数の作成には以下の二つのブロックがあります。
違いは戻り値があるかないかです。上のブロックは戻り値がない場合です。
これをワークスペースにドラッグして関数名を「func」としてみます。
すると、このコードは
// この関数の説明…
void func()
{
}