今回は関数の作成についてです。

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()
{
}