Block EAでEAを作ろう:待機注文を利用したEA

皆さん、こんにちは。

Block EAでEAを作ろう」の連載でこれまで扱ってきたEAは、基本的に成行注文だけでした。

今回は、指値注文逆指値注文など待機注文を利用したEAをBlock EAで組んでいきます。

待機注文では、指値か逆指値かの区別に加えて、指値、逆指値までの値幅その注文の有効期間といった追加パラメータが必要になります。

そのあたりに注意しながら、いくつかのシステムについて見ていきましょう。

仕掛けシグナルを指値注文とするシステム

最初に取り上げるのは、これまで紹介してきた仕掛けシグナルによる途転売買システムから簡単に作れるシステムです。

成行注文を指値注文に変えるだけです。簡単な説明がこちらのページにあります。

例によって、移動平均の交差を使った途転売買システムをベースにして説明していきます。

Block EAでは、シグナルを使った成行注文だけでなく、シグナルを使った待機注文が出せるブロックが用意されています。

このブロックには、成行注文と同じ「仕掛けシグナル」「手仕舞いシグナル」「ロット数」に加えて「何pips離れた価格か」「指値注文か逆指値注文か」「待機注文を何分間有効とするか」のパラメータを入力することができます。

例えば、「10pips離れた指値注文を300分待機」というブロックは以下のようになります。

これを成行注文のブロックと差し替えれば完成です。

逆指値注文によるレンジブレイクアウトシステム

もう一つ、待機注文を使ったシステムを考えてみます。

こんどは逆指値注文を使ってみます。適当にレンジを決めて、価格がレンジのどちらかの端をブレイクしたら、その方向にトレードするシステムです。

細かい仕様は色々と考えられますが、ここではBlock EAの例題ということで、以下のような簡単なルールにしてみます。

  1. 毎日決まった時刻(例えば1時)に、現在の価格から上下に一定値幅(例えば10pips)離れた価格2か所に逆指値注文を入れる。
  2. 一方の逆指値注文が約定すれば、もう一方の注文はキャンセルする。また各注文が一定期間(例えば300分間)約定しなければ、注文はキャンセルする。
  3. 約定したポジションは一日の決まった時刻(例えば23時)に決済する。

今回のシステムは、これまで紹介したシステムから流用できるものがないので、ゼロから組んでいきます。

まず、決まった時間(1時0分)に2つの逆指値注文を入れます。一つは買い注文で、もう一つは売り注文です。

時間の条件前回の記事で紹介した通りです。注文のブロックは「トレード」ツールボックスに配置してある「成行」「指値」「逆指値」の売買注文を選択できるものを利用します。

ここで、ポジション番号に注意してください。二つの注文を同時に入れるので、それぞれを区別するためにポジション番号を「0」「1」と、違った値にします。

同時に約定するポジションは一つなのですが、注文は個別に処理する必要があるので、ポジション番号は変えておかないといけないのです。

次に「売買する価格」は、現在の価格より10pips上下の価格です。

現在の価格としては、買い注文の場合、「買値(Ask)」を、売り注文の場合「売値(Bid)」を指定します。また10pipsはそのまま使えないので、実際の値幅に変換する必要があります。

現在の価格を表すブロックは、「MQLデータ」カテゴリーに、pipsから値幅に変換するブロックは、「トレード」ー「ポジション情報」カテゴリーにそれぞれ用意されています。

買値に10pipsを足した価格、売値から10pipsを引いた価格は以下のようなブロックになります。

+10pipsの逆指値を買い注文の価格-10pipsの逆指値を売り注文の価格のところに挿入します。

なお、pipsを値幅に変換するブロックにポジション番号の指定がありますが、ここでは、どちらもポジション番号0で構いません。区別する必要があるのは、ポジションによって取引する通貨ペアが変わる場合だけです。

次に注文をキャンセルする条件を追加します。

二つの注文は別々にキャンセルする必要があるので、ポジション番号0とポジション番号1それぞれに対してキャンセルするための条件分岐ブロックを追加します。

ここで、キャンセルするための条件は、二つあります。

ひとつは一定期間約定しない場合です。そして、もうひとつは他方の注文が約定した場合です。

一定期間約定しない場合は、「トレード」ー「ポジション情報」カテゴリーにある「ポジションの経過時間を判別する」ブロックを使います。

このブロックは、基準となる時刻を「約定時刻」「前回の決済時刻」「待機注文の発注時刻」から選べます。待機注文の発注時刻から300分経過した場合、trueを返すブロックは、以下のようになります。

もうひとつの条件である「他方の注文が約定したか」という条件ですが、これも上と同じブロックを使い、「約定時刻から0分経過」という条件にしてみます。

ここで、ポジション0をキャンセルする場合、ポジション1の約定時刻をチェックするところに注意してください。

同様にポジション1をキャンセルする場合は、ポジション0の約定時刻をチェックします。

以上の二つの条件は、どちらかが成立すればということなので、「または」の論理でつなげたものがそれぞれのポジションをキャンセルする条件となります。

これらを注文をキャンセルするブロックの条件のところに挿入すると以下のようになります。

最後にポジションを決済する条件ですが、これは特に約定したかどうかを判別する必要はありません。決まった時刻に両方のポジションを決済するというブロックで構いません。

23時にポジション番号0、ポジション番号1のポジションを決済するというブロックは以下のようになります。

これをティック時実行関数のブロックに追加すれば、このシステムは完成です。

待機注文を使ったシステムにはたくさんのバリエーションがあります。基本的なブロックの組み合わせでも、それなりにEAを作ることはできますが、よく使うブロックは一つになっていた方が便利です

こういうブロックが欲しいというリクエストなどありましたら、Twitter、Slackなどでご連絡ください。

ではまた。

前へ

Block EAでEAを作ろう:時間による仕掛け・手仕舞い

次へ

Block EAでEAを作ろう:待機注文の繰り返し