Block EAでEAを作ろう:簡単なEAを作る手順

2023年最初の記事です。昨年末に予告した通り、以下のkindle本読者の方へのサポート企画です。

これらのkindle本から入手できるMQL4/MQL5共通EAライブラリを利用して、コードを直接書かずに、ブロックを組み合わせるだけでEAを作成しようというものです。

まず、以下のBlock EAのサイトにアクセスしてみましょう。

画面構成はシンプルです。

中央のメインスペースを「ワークスペース」と呼び、ここにブロックを配置していきます。

具体的なブロックは左側のスペース「ツールボックス」にカテゴリー別に用意されています。それぞれのカテゴリーをクリックすると現れます。

作成したブロックに対してできることは上部の「メニューバー」にある通りです。ブロックからmq4、mq5のコードに変換したり、ブロックのデータを読み書きするだけです。

今回は第1回目ということで、Block EA を使って簡単なEAを作る手順を紹介します。

今回作成するEAのロジックは、以下のページに記載されたモメンタムを使った途転売買システムです。

初期ブロックの説明

Block EAを立ち上げると、最初にこのブロックがワークスペースに現れます。

ここで、メニューバーの「MQLコードの表示」をクリックすると、このブロックがどのようなコードに変換されるかがわかります。

これを見ると、「セットアップ」ブロックが「LibEA.mqh」のインクルード、「ティック時実行関数」ブロックがTick()関数に対応していることがわかります。

まず、「セットアップ」ブロックの設定で注意するのは、共通ライブラリの保存場所です。

共通ライブラリと作成するmq4/mq5ファイルが同じフォルダに保存されている場合はそのままで構いません。

ただ、共通ライブラリをMT4/MT5のデータフォルダの下の「MQL4\Include」、「MQL5\Include」の下に保存している場合には、「セットアップ」ブロックの「現在の」を「Include」に変えてください。

すると、「LibEA.mqh」を囲む記号が「"」から「<>」に変わります。

EAの本体は、「ティック時実行関数」のブロックに組んでいきます。実際にティック時に実行される関数はOnTick()関数ですが、これは共通ライブラリの中に組み込まれており、そこからTick()関数を呼び出すという独自の書き方となっています。詳しくは「新メタトレ二刀流本」をご参照ください。

トレードブロックの追加

EAの作り方に決まった順番はありませんが、ここでは、トップダウンの考え方でEAを作っていきます。

トップダウンとは、まずシステムの全体像を作ってから、それを構成する部分の大きいものから小さいものへ順番に作っていく方法です。

今回のシステムで全体像というと、なんかしらの売買シグナルをもとに、成行で売買を行うという感じです。そこからスタートして、必要な部分をその都度作っていくわけです。

トレードのためのブロックは、ツールボックスの「トレード」のカテゴリーに用意されています。

売買シグナルには買いシグナルと売りシグナルがあるので、買い注文と売り注文を別々に作る方法もありますが、ここでは、シグナルを入力すると、シグナルの方向に応じて勝手に成行注文を出してくれる一番上のブロックを使います。

そこで、このブロックを「ティック時実行関数」ブロックのなかに組み込んでみましょう。組み込みたいブロックを「ティック時実行関数」のブロックにドラッグ&ドロップするだけです。

すべてのトレードブロックにはポジション番号を指定するパラメータがあります。複数のポジションを同時に建てる場合にはこの番号を変えますが、ポジションが一つの場合は、「」のままで構いません。

このブロックは、「仕掛けシグナル」と「手仕舞いシグナル」を入力して、「ロット数」で指定したロット数で成行注文を発注するブロックです。

いま、「仕掛けシグナル」と「手仕舞いシグナル」が空欄になっているので、ここを埋めていきます。

シグナルは変数に求めることになるので、変数を宣言します。

変数を宣言するブロックは「MQL変数」のカテゴリーの上から2番目のブロックです。

このブロックを「ティック時実行関数」ブロックに組み込みます。

このブロックで「sig」のところが変数名ですが、ブロックを組み込むたびに同じ名前になってしまうので、「sig」のところをクリックして「変数の名前を変える」を選んで、変数名を変えておきましょう。

ここでは、「sig_entry」という変数名にしてみます。

変数を宣言すると、「変数の作成」カテゴリーに変数名のブロックができています。

そこで、この「sig_entry」という変数名のブロックを成行注文のブロックの「仕掛けシグナル」と「手仕舞いシグナル」の両方に組み込みます。

仕掛けシグナルと手仕舞いシグナルに同じ変数を入れるというのは、ポジションと逆のシグナルが発生したときに、そのポジションを手仕舞いして、逆のポジションを建てるという意味です。つまり、これで途転売買のシステムになるというわけです。

仕掛けシグナルの作成

次に仕掛けシグナル「sig_entry」を作成します。仕掛けシグナルは、買いシグナルが「+1」、売りシグナルが「-1」なので、それぞれの条件で値を定めてもいいのですが、Block EAでは、それらをひとまとめにしたブロックが用意されています。

トレード」カテゴリーの下の「売買シグナル」というサブカテゴリーの下にあるブロックです。

このブロックには、「もし」を接続する部分が2か所あります。

上の「もし」の条件が成立すれば、買いシグナルとして「+1」を返し、下の「もし」が成立すれば売りシグナルとして「-1」を返すブロックです。

これを「sig_entry」の宣言ブロックの「初期値」のところに接続します。

売買シグナルの条件としては、テクニカル指標のモメンタムを使います。モメンタムのブロックは「テクニカル指標」の下の「オシレーター系」のサブカテゴリーの下にあります。

これを直接売買シグナルの条件式に組み込んでもいいのですが、モメンタムを求める箇所が2か所でてくるので、変数を宣言して、それに代入しておきます。

変数の宣言ブロックは、先ほどの「sig_entry」のときと同様です。ただし、変数名を「mom1」に変更しておきます。またモメンタムは小数を含む実数値として算出されるので、変数「mom1」のを「double」に変更しておかなくてはいけません。

double型の変数「mom1」を宣言してモメンタムの値を代入したブロックを追加したのが下の図となります。

モメンタムのブロックにもいくつかパラメータがあります。このブロックで変えられるのは、チャートのタイムフレームモメンタムの期間何本前のモメンタムを求めるか、です。

この例では現在のチャート1本前のバーにおける期間14のモメンタムの値を求めています。

ここで、「mom1」という変数にモメンタムの値が求められたので、これを使って売買シグナルの条件式を追加します。

条件式のブロックは「条件分岐」のカテゴリーの上から2番目のブロックです。

これを「売買シグナル」ブロックの「もし」のところに接続します。

この条件式のブロックは、二つの数値を比較するブロックです。

mom1>100」のとき買いシグナル、「mom1<100」のとき売りシグナルなので、条件式のブロックの左辺の空欄に「変数の作成」のカテゴリーにある「mom1」ブロックを組み込みます。

そして、真ん中の記号を買いシグナルの場合「>」に、売りシグナルの場合「<」に変更します。

最後に右辺の数値をそれぞれ「100」に変更すれば完成です。

このブロックに対応するコードを表示させると次のようになります。

ブロックから機械的にコードを生成するので、不必要な括弧があったりと、人がコードを書く書き方とは違うところもあります。その代わり、括弧の対応が合っていないとか、文末のセミコロンを忘れるとか、人が間違いそうなミスはありません

このコードは、Block EAのメニューから「mq4ファイルの保存」を実行すると、拡張子がmq4のファイルとしてお使いのPC上に保存されます。ファイル名としては、Block EAのプロジェクト名がつくので、プロジェクト名が「new」の場合、「new.mq4」というファイルとして保存されます。

mq5のファイルの保存」を実行すると、「new.mq5」というファイルとして保存されますが、拡張子が違うだけで、内容はmq4と全く同じです。

Block EAでできることは、ここまでです。

これらのファイルをMT4/MT5のデータフォルダの「MQL4\Expets」、「MQL5\Experts」にコピーして、コンパイル、バックテストなどで問題がないか確認してみてください。

前へ

『新メタトレ実践本・二刀流本』共通企画:Block EAの連載始めます

次へ

Block EAで作る2本の移動平均線の交差システム