Block EAでEAを作ろう:シグナルによる手仕舞い
皆さん、こんにちは。
前々回、前回と、Block EAで作ったEAに、損益による手仕舞いを追加してみました。
今回は、テクニカル指標を使ったシグナルによる手仕舞いについてみていきます。
Block EAでは、以下のように成行注文を行うブロックに、仕掛けシグナルと手仕舞いシグナルを入力できるようになっています。
このブロックは、共通ライブラリのMyOrderSendMarket()関数に対応したものです。
これまでの記事では、このブロックの手仕舞いシグナルに仕掛けシグナルを入れることで、途転売買を実行させてきました。
ここで、MyOrderSendMarket()関数の動作について説明しておきます。
仕掛けシグナルで注文を発注するのは、そのポジション番号で、オープンポジションも待機注文も入っていない場合です。
オープンポジションがある場合、手仕舞いシグナルを見てポジションと逆シグナルであれば、そのポジションを決済します。
つまり、買いポジションで手仕舞いが売りシグナル、売りポジションで手仕舞いが買いシグナルの場合、そのポジションは決済されます。
ここでポジションが決済されれば、仕掛けシグナルが有効となり、仕掛けシグナルがあれば、成行注文を発注します。
なので、買いポジションがある状態で仕掛けシグナルと手仕舞いシグナルが同じく売りであれば、買いポジションが決済され、すぐに売りポジションが建てられるので、途転売買となるのです。
売りポジションの場合も同様です。仕掛けと手仕舞いが同じく買いシグナルであれば、ポジションが決済され、買いポジションとなります。
成行注文のブロックは、内部でこのような複数の処理を行っているのです。
手仕舞いシグナルの例
上記の成行注文ブロックの動作を理解した上で、仕掛けシグナルとは別のシグナルを手仕舞いシグナルにする例を見ていきます。
今回も基となるシステムは、移動平均の交差を使った途転売買システムとします。
ここで、手仕舞いシグナルの一例として、仕掛けシグナルと同じく「2本の移動平均線の交差による手仕舞い」を取り上げます。
仕掛けと手仕舞いで同じテクニカル指標を使っていますが、移動平均の期間が異なるので、シグナルの出るタイミングが異なります。
ここでは、手仕舞いのシグナルとして短期移動平均線と中期移動平均線の交差を利用します。
短期は仕掛けシグナルの短期移動平均と同じもの、中期は仕掛けシグナルの短期と長期の間の期間とします。
追加するブロックとしては、まず、中期移動平均の期間のための外部パラメータ「ExitMAPeriod」を宣言し、「30」という値を代入します。
次に「ExitMAPeriod」を期間とする移動平均の1本前のバーの値を「ExitMA1」に、2本前のバーの値を「ExitMA2」に取得するブロックをそれぞれ追加します。
そして、手仕舞いシグナルとして「sig_exit」という変数を宣言し、短期移動平均線(FastMA2→FastMA1)が手仕舞い用中期移動平均線(ExitMA2→ExitMA1)を上抜けたときに「買いシグナル」、下抜けたときに「売りシグナル」となるようなブロックを追加します。
最後に、その下の成行注文のブロックの手仕舞いシグナルのところに「sig_exit」を代入すれば完成です。
これで、仕掛けシグナルでポジションをオープンし、手仕舞いシグナルでポジションをクローズするようなEAとなります。
シグナルによる手仕舞いに関する注意点
上の例では、仕掛けと手仕舞いで期間が異なるだけで同じルールを使っているので、手仕舞いシグナルは、次の仕掛けシグナルが出る前に出るようになっています。
このようなケースでは、次の仕掛けシグナルが出るときには、既に前のポジションが決済されているので、このままで問題ありません。
ただし、仕掛けと手仕舞いで異なるテクニカル指標を使うなど、シグナルが出るタイミングに関連がないと、手仕舞いシグナルが出る前に次の仕掛けシグナルが出る場合もあります。
この場合、ポジションが決済されていなければ、仕掛けシグナルは無視されてしまいます。
手仕舞いシグナルの方を優先させたい場合は、そのままでいいですが、仕掛けシグナルを優先させたい場合は、その仕掛けシグナルで途転売買させる必要があります。
そのためには、手仕舞いシグナルとして仕掛けシグナルと手仕舞いシグナルの両方を指定したいわけですが、その場合、どうすればよいでしょうか?
ここで、sig_entryとsig_exitを足したものを手仕舞いシグナルに指定してみます。
二つの数値の足し算は次のブロックを使います。
このブロックは数値の四則演算だけでなく、変数の四則演算もできます。以下のようにsig_entry、sig_exitの変数ブロックを組み込むことができます。
ここでシグナルの足し算の意味ですが、シグナルはそれぞれ「1」か「-1」という数値で表されているので、sig_entry、sig_exitのどちらかにシグナルが発生していれば、そのシグナルに応じて注文が発注されます。
ただsig_entry、sig_exitの両方にシグナルが発生することもあります。
それが同じシグナルであれば、シグナルを足したものが「+2」あるいは「-2」になりますが、シグナルの符号に応じて途転売買が行われるため問題ありません。
もし、sig_entryとsig_exitが逆のシグナルだったらどうなるでしょうか?
例えば、買いポジションがあるときに、sig_entryが買いで、sig_exitが売りの場合です。
手仕舞いシグナルにsig_exitだけを指定していたとすると、ポジションとsig_exitが逆シグナルなので、ポジションが決済されます。でも、sig_entryが買いなので、すぐに買い注文が発注され、買いポジションができます。
もし、このシグナルが出続けていると、ポジションの決済、注文が繰り返されるため、スプレッド分の損失が続くことになります。
ここで、手仕舞いシグナルにsig_entry+sig_exitを入れておくと、このような損失を防ぐことができます。
sig_entryとsig_exitが逆シグナルであれば、足した値は「0」になるので、手仕舞いシグナルはキャンセルされ、オープンしたポジションはそのまま継続します。
仕掛けシグナルと手仕舞いシグナルを別々に生成する場合、様々なケースが考えられるので、手仕舞いシグナルにも仕掛けシグナルを入れておいた方が無難と言えるでしょう。
では、また。