Block EAでEAを作ろう:損益による手仕舞いの追加
皆さん、こんにちは。
「Block EAでEAを作ろう」前回の記事では、移動平均の交差を使った途転売買システムを作りました。
今回は、そのシステムに手仕舞いを追加したEAを作っていきます。
とりあえず、以下のブロックが前回作成した移動平均の交差を使った途転売買システムです。
これと同じブロックは、以下のリンクからダウンロードできます。
このファイルをBlock EAの「ブロックを開く」というメニューから選択してください。ワークスペースに上と同じブロックが現れればOKです。
今回の記事では、このブロックをベースにして、手仕舞いのブロックを追加していきます。
損切り・利食い注文による手仕舞い
MT4/MT5のEAの場合、手仕舞いで一番簡単なのは、ポジション自体に損切り、利食いの指値注文、逆指値注文を入れる方法です。
ただ、損切り注文、利食い注文では、決済したい価格を指定する必要があります。実際に決済する価格が重要な場面もあるでしょうが、たいていは、そのポジションによる含み損益が重要な場面の方が多いでしょう。
なので、損益が一定の額に到達したときに決済する注文を入れるためのブロックがBlock EAに用意されています。場所はツールボックスの「トレード」カテゴリーです。
このブロックは、損切りの値幅と利食いの値幅をpipsで指定することで、オープンしているポジションに損切り注文と利食い注文をセットするものです。
これをティック時実行関数の最初に組み込めばOKです。
このブロックは共通ライブラリのMyOrderSetSLTP()に対応したものです。値幅が「0」の場合、注文は無効となります。例えば損切りだけ指定したい場合、利食いの値幅には「0」を入力しておきます。
損切りや利食いの値幅を外部パラメータにしたい場合、移動平均の期間を外部パラメータにしたのと同様に、変数を作成、外部パラメータをセットするブロックを配置し、各変数ブロックを決済注文ブロックの各パラメータに入力します。
ここでは、損切りの値幅として「SLpips」、利食いの値幅として「TPpips」という変数を作成しています。
なお、値幅の単位はpipsで小数の場合もあるので、外部パラメータの型は「double」にしておきます。
一定の損切り・利食いによる手仕舞い
オープンしたポジションに損切り注文、利食い注文を付加する方法が一定の損益で決済するもっとも簡単な方法です。
ただ、決済したい価格が業者側に見えてしまうのが嫌だという場合、注文を付加しないで、ティックごとに損益をチェックして一定の損益に達したら決済する方法もあります。
ここでは、前述のEAのように損切りの値幅がSLpips、利食いの値幅がTPpipsという外部パラメータで与えられているとします。
損益をチェックするためのブロックは、ツールボックスの「トレード」ー「ポジション情報」に用意されています。「損益」とは表示されていませんが、一番上のブロックがポジションの各種情報を取得するものです。
このブロックをワークスペースにドラッグ&ドロップすると、ポジション情報の種類を選択することができます。
ここで、「含み損益(pips)」を選択すると、このブロックは、ポジションの含み損益(pips)を取得するブロックとなります。
まず、利食いの場合ですが、含み損益がTPpips以上という条件のときに決済することになります。これをブロックで表すために、ツールボックスの「条件分岐」というカテゴリーから以下の二つのブロックをワークスペースにドラッグ&ドロップします。
そして、次のようにブロックを組んでおきます。
「もし」のところに二つの値の比較するブロックを挿入し、それぞれの値に含み損益を取得するブロック、「TPpips」という変数ブロックを入れます。
あと、比較の記号を「≧」にしておいてください。
これで、「ポジションの含み損益がTPpips以上だったら」という条件ができました。あとは、この条件になったときにポジションを決済するというブロックを「実行」のところに入れればOKです。
ポジションを決済するブロックは、ツールボックスの「トレード」のカテゴリーにあります。
このブロックを先ほどの条件分岐のブロックの「実行」のところに挿入すれば、一定の損益で利食い決済させるブロックは完成です。
これを「ティック時実行関数」の最初に挿入すると、以下のようなブロックになります。
同じように損切りの手仕舞いもブロックで作れるのですが、損益は利益をプラスとして考えているので、損失の場合、マイナスとなります。なので、ポジションの含み損益が「-SLpips」以下となる条件にする必要があります。
コードで書く場合、「SLpips」の前に「-」を書くだけでいいですが、ブロックの場合、値をマイナスにするブロックを使う必要があります。
値をマイナスにするブロックは、ちょっとわかりにくいのですが、ツールボックスの「数式」のカテゴリーにあります。
「平方根」と書いてあるブロックをワークスペースにドロップすると、機能を選択できます。
ここで「-」を選択すると、右側のブロックの数値の符号を変えるブロックとなります。
これを使うと損切りの手仕舞いもブロックにすることができます。
これで、損切り注文、利食い注文とほぼ同じ機能を追加することができました。
ただし、一つ注意することは、このままではSLpips、TPpipsが0の場合、決済が無効にはならないということです。
値幅が0のときに決済しないようにするには、もう一つ条件が必要となります。つまり、SLpips、TPpipsが0でないという条件です。
これは、二つの値の比較ブロックを使うと次のように組めます。
「≠」という記号が「ではない」という意味です。
この条件と、含み損益の条件を両方満たすときが決済の条件となるので、二つの条件を組み合わせるためにもう一つブロックを使用します。
ツールボックスの「条件分岐」にある以下のブロックです。
これが条件式を組み合わせるためのブロックです。
このブロックを条件分岐ブロックの「もし」のところに挿入し、二つの空欄に前述の二つの条件式ブロックを入力します。また組み合わせ方(論理演算子に相当する部分)は、両方の条件を同時に満たすので「かつ」のままでOKです。
最終的に手仕舞いのブロックは以下のようになります。
コードが書ける人にとっては、条件分岐のブロックは面倒に思えるかもしれませんが、コードの細かい入力ミスが少なくなる、ライブラリの関数名をいちいち覚えなくてもよい、などのメリットもあります。
ゲーム感覚で試してみてください。
今回の記事は以上となります。
ではまた。