Block EAでEAを作ろう:損益による手仕舞い続き
皆さん、こんにちは。
今回も前回に引き続き、Block EAを使って、損益による手仕舞いを組み込んだEAを作っていきます。
Block EA アップデート
先日、Block EAのアップデートを行いました。以下の二つのブロックを追加しました。
今回の記事では、のちほど、このブロックの使い方についても紹介します。
トレイリングストップ
前回の記事では、ポジションの損益が一定の値幅になったときに決済する方法を取り上げました。
損益を使った手仕舞いとしては、相場や含み損益の状況に応じて、損切り価格や利食い価格を変えていく方法もよく使われます。
その中でよく知られているものに「トレイリングストップ」があります。
これは含み益が更新される度に、損失が少なくなるように損切り価格を変えていく方法です。
例えば、USD/JPYを100円で買ったポジションに対して、50pipsの値幅のトレイリングストップを適用するとします。
ポジションを建てた直後からトレイリングストップを適用する場合、100円であれば、50pips、つまり0.5円下の99.5円に損切り価格を設定し、価格が100.1円に上がれば、0.5円下の99.6円に損切り価格を変更します。
あるいは、50pipsの含み益が出たときからトレイリングストップを適用する場合もあります。上の例では、50pipsの利益となる100.50円になったときに初めて100円の損切り価格を設定し、価格が上がる度に損切り価格を上げていきます。
このように、損切り価格の変更を繰り返していきますが、その後価格が下がったとしても、それに合わせて損切り価格を下げることはせず、価格が損切り価格まで下がれば決済されることになります。
このトレイリングストップの機能は、MT4/MT5でも手動なら使うことができますが、EAで簡単に使える組み込み関数としては用意されていません。
Block EAでは、共通ライブラリにあるトレイリングストップの関数に対応したブロックを用意しています。
ツールボックスの「トレード」カテゴリーの上から5番目のブロックです。
これを前回の記事と同じく移動平均の交差を使った途転売買システムに組み込んでみます。
組み込む場所は、ティック時実行関数のブロックの最初でOKです。
パラメータとしてトレイリングストップの値幅があります。この例では20pipsとなっています。
あと、「含み益が出てから注文」というチェックボックスがあります。
これをチェックすると、ポジションが建ってすぐには損切り注文は入らず、トレイリングストップ値幅だけの利益が出たときに初めて損切り注文が入るようになります。
初期損切り注文は別にセットして、利益が出てからトレイリングストップに切り替えたい場合に利用します。
初期損切り注文と併用するときの注意
トレイリングストップを利益が出てから適用させるときに、初期損切り注文も設定したい場合、注意することがあります。
以下のように損切り注文を入れるブロックだけを挿入するとちょっと問題があります。
このブロックだと、最初に50pipsの値幅の損切り注文が入ります。トレイリングストップは利益が出るまで入らないので、しばらくは損切り値幅は50pipsのままです。
そして、20pipsの利益が出ると、トレイリングストップの損切り注文が入ります。20pipsの利益が出たときに20pips下に損切り注文が入るので、買値から見ると0pipsの値幅の価格です。
ところが、50pipsの損切り注文を入れるブロックもティックごとに実行されるので、50pipsの損切り注文とトレイリングストップの損切り注文が両方実行されます。その結果、損切りの価格が毎ティックで上下に変更されることになります。
このような不安定な状況を防ぐために、50pipsの初期損切り注文はポジションが建った直後だけに実行できるようにする必要があります。
ここで、ポジションが建った直後を判別するためにポジション情報を利用します。
このブロックをワークスペースにドラッグすると、ポジション情報を選択することができます。ポジションが建った直後を表す情報はいくつかありますが、ここでは、損切り価格を使ってみます。
ポジションが建った直後は損切り注文が入っていないので、0になっています。そこで、このブロックが0のときに損切り注文を入れるようにします。
「条件分岐」のツールボックスから「もし~実行」のブロックと二つの数値を比較するブロックをドラッグしてきて、以下のように組み立てます。
これで、初期損切り注文はポジションを建てた直後だけに入り、含み益が出てからはトレイリングストップが有効となります。
初期損切り値幅をSLpips、初期利食い値幅をTPpips、トレーリングストップの値幅をTSpipsとそれぞれ外部パラメータにすると以下のようなブロックになります。
損益を使ったその他の損切り注文
今回のBlock EAのアップデートで追加されたブロックの紹介を兼ねて、損益を使ったその他の損切り注文について説明します。
Block EAの「トレード」ー「ポジション情報」に追加されたブロックは、共通ライブラリのMyOrderShiftPrice()とMyOrderShiftPips()に対応するものです。
今回、指定したポジションの含み損益(pips)に対応する決済価格を取得するブロックを使ってみます。
このブロックは、上のように損益が0pipsであれば、売買した価格を返します。なので、前に使ったポジション情報を返す次のブロックと同じ役割となります。
ただ、損益が0以外であれば、ポジションが買いか売りかで決済価格が異なってくるので場合分けが必要となります。
今回追加したブロックでは、内部で場合分けをやっているので、買いか売りかを考える必要はありません。損益だけ入力すれば自動的に決済価格がわかります。
そこで、その価格で損切り注文を入れたい場合、「トレード」カテゴリーに用意されている以下のブロックを利用します。
これは、損切り価格、利食い価格を直接入力して損切り注文、利食い注文を付加するブロックです。
このブロックの損切り価格のところに、損益を決済価格に変換するブロックを入れればOKです。
例えば、含み益が20pipsになったら、含み益が5pipsとなる価格で損切り注文を入れたい場合、次のようにブロックで表すことができます。
このブロックをトレイリングストップに置き換えると、全体のブロックは以下のようになります。
以上、前回、今回と2回にわたり、損益による手仕舞いを取り上げてBlock EAの機能の紹介をしました。
今回紹介したブロックは、共通ライブラリの関数に対応したものです。それぞれの関数の仕様を理解していた方がわかりやすいかと思います。
共通ライブラリのドキュメントはこちらからどうぞ。
ではまた。