ターゲットでポジションを減らすプログラム

前回の記事では、シグナルが出る度にポジションを増やしていくプログラムを紹介しました。

今回は、別の読者の方からいただいた次のようなご質問について考えていきます。

ターゲットでポジションの半分を利食いして、残りのポジションはトレイリングストップで利益を伸ばすEAはどのように考えればよいか?

このご質問の文字通り、オープンしたポジションの一部を決済することは、MT4でも可能です。ただ、本書のライブラリでは、オープンしたポジションを部分的に決済する仕様にはなっていません。

そこで、最初からポジションを二つオープンし、その一つをターゲットで決済、もう一つをトレイリングストップで決済、という風に分けて考えてみます。

EAの本体は、複数のポジションを扱うプログラムとして前回のプログラムが流用できます。

変更箇所は、POSITIONを「2」にしたところと、待機フィルタ関数WaitSignal()の部分をカットしたところです。

仕掛けシグナルについては、トレイリングストップで利を伸ばすのであれば、順張りの方が効果があるので、2本の移動平均交差の「EntryMA2Cross.mqh」を利用します。

手仕舞いシグナルは、今回のEAではポジション毎に異なる方法になるのですが、ここでは、その違いをOnTick()中に記述せずに、インクルードする ExitSignal()の方を書き換えてみます。

上のプログラムでインクルードした「ExitTrailingStop2.mqh」という手仕舞いシグナルのヘッダファイルは、本書の「ExitTrailingStop.mqh」を基にして修正を加えたものです。次のような内容になっています。

修正したのは、ポジション番号「pos_id」により処理の内容を分けているところです。

まず、損切りの設定は共通するので、最初に記述します。

次にswitch文でpos_idが0の場合と1の場合で区別します。

pos_id=0の場合、利食いターゲットを設定し、pos_id=1の場合、トレイリングストップを設定します。

トレイリングストップのところで注意する点は、トレイリングストップを開始する条件です。「profit >= 0」だと、ターゲットに到達する前にトレイリングストップが始まってしまう場合もあるので、別途「profit0」という変数にターゲットを超える利益を取得し、それが0以上になったときにトレイリングストップが開始されるようにします。

これで、シグナルが出ると二つのポジションが同時にオープンし、損切りか、逆のシグナルが出れば二つのポジションが決済されます。もし利益が伸びていけば、0番目のポジションはターゲットの利益で決済され、1番目のポジションはトレイリングストップで損切り値が更新されていき、価格が逆行したところで決済されます。

下のチャートはうまく機能した例です。左上のところで売りシグナルが出て、二つの売りポジションができます。そして、ターゲットの200pipsでポジションの一つを決済、もう一つのポジションは更新した安値から100pips上の位置に損切り値を移動して最後に右下の場所で決済されています。

Image1

人が考えるEAのロジックはそのままだとプログラムしにくい場合があります。それをプログラムしやすいように翻訳するということも、プログラミングをマスターする上で重要なことだと思います。



コメントは受け付けていません