![見出し画像](https://assets.st-note.com/production/uploads/images/65155670/rectangle_large_type_2_4aeeb7fc4523c5fe4dd32bd89b5f68fc.png?width=1200)
Block EA 今日のワンポイント:売買シグナル生成ブロック
ブロックを組み合わせてMT4/MT5のEAを作成するBlock EA、今日のワンポイントです。
もともとMQL4/MQL5共通ライブラリは、初心者向けに作ってあり、売買シグナルをパラメータとして成行注文や待機注文を送信する関数が用意されています。
なので、Block EAでもその関数に対応したブロックを作っています。例えば、売買シグナルとしてsigという変数を宣言して、その売買シグナルを仕掛けと手仕舞いに使う途転売買のシステムは、以下のようなブロックで作れます。
成行注文のブロックは「トレード」のツールボックスにあります。コードはこんな感じです。
void Tick()
{
int sig;
MyOrderSendMarket(sig, sig, 0.1, 0);
}
もちろんこのままではシグナルがないのでトレードできません。
売買シグナルは、プラスの値が買いシグナル、マイナスの値が売りシグナルとなっているので、適当なテクニカル指標を使ってsigに具体的なシグナルを生成してみます。
これは、Mom1という変数に1本前のバーにおける期間14のモメンタムの値を求め、それが100を上回っていれば買いシグナル(+1)、100を下回っていれば売りシグナル(-1)をsigに代入するものです。
if文に相当するブロックや条件式に相当するブロックは「条件分岐」のツールボックスに、変数に数値を代入するブロックは「変数の作成」のツールボックスにあります。
これらを組み合わせてシグナルを生成すると、実際にトレードできるEAとなります。コードはこのようになります。
void Tick()
{
double Mom1 = (iMomentum(_Symbol, (0), 14, PRICE_CLOSE, 1));
int sig = 0;
if (Mom1 > 100) {
sig = 1;
}
if (Mom1 < 100) {
sig = -1;
}
MyOrderSendMarket(sig, sig, 0.1, 0);
}
ブロックがそのままコードになっていることがわかります。ただ、これはどちらかというと、書きやすいコードが先にあって、それをブロックに対応させた形になっています。
これでも問題はないのですが、プログラミングはシンプルな方がいいです。コードでプログラミングするのならコードがシンプルな方がいいように、ブロックでプログラミングするならブロックがシンプルな方がいいでしょう。
そこで、「トレード」ツールボックスの「売買シグナル」のところに売買シグナルを生成するブロックを用意しました。
このブロックでは、上の「もし」のところに買いシグナルの条件を入れ、下の「もし」のところに売りシグナルの条件を入れるだけです。すると、0、1、-1のいずれかの売買シグナルを返すので、それをそのままsigの初期値に代入します。
このブロックを使って上のシステムを書き換えると以下になります。
全体のブロックの数が減って見やすくなったのではないでしょうか。ただ、コードはちょっと変わります。
void Tick()
{
double Mom1 = (iMomentum(_Symbol, (0), 14, PRICE_CLOSE, 1));
int sig = (((Mom1 > 100) ? 1 : 0) + ((Mom1 < 100) ? -1 : 0));
MyOrderSendMarket(sig, sig, 0.1, 0);
}
これを見ると、条件にif文は使わず、「条件? 処理1:処理2」という3項演算子を使って条件によって戻り値を変えています。また買いシグナルと売りシグナルを足したものをsigに代入していることがわかります。
おそらくコードでプログラミングする場合、慣れている人でないと、いきなりこういうコードは書かないと思います。私も3項演算子はほとんど使いません。
ただ、ブロックをシンプルにしようとすると、こういうコードに変換した方が都合がよかったりします。このあたりがブロックプログラミングとコードプログラミングの違いだと思います。
以上、今回は売買シグナルを生成するのに特化したブロックの紹介でした。
Block EAもリリースしたばかりでまだバグもあるかと思います。システムの改修状況については随時Slackでお知らせしますので、ご利用ください。