【MQL5】 MT5のEA作成の勉強 その11 ナンピンを実装する ( 1 / 2 )

【MQL5】 MT5のEA作成の勉強 その11 ナンピンを実装する ( 1 / 2 )

まえがき

 前回の投稿で、ポジションを保有した状態でさらにポジションを追加する処理の実装方法を学びました。このような処理を行うケースで一番多いのが「ナンピン(難損)」と呼ばれる取引方法です。ナンピンとは、ポジションをオープンした後、相場が想定と逆に動いた場合、さらにポジションを追加でオープンすることで、損益分岐点を現在の価格に近付ける手法です。

 ロングポジションでナンピンを行うと、図のように損益分岐点を下げ、損失を回避しやすくなる利点があります。その一方、下降トレンドが続くと、ポジション数を増やした分だけ損失が拡大するというデメリットがあります。このため、ネットの多くの記事では、ナンピンは、「危険」「上級者向け」などと紹介されています。
 しかし、ゴゴジャンなどを見ると、多くのEA、特に長期安定運用を目指して直線的な資金カーブを描くように調整されたEAではナンピンを採用しているものが多いのも事実です。実際に使うかはともかく、選択肢として選べるようにしておくことは重要です。そこで今回は、ナンピンをEAに実装する方法を学んでいきたいと思います。

直前のポジションのオープン価格を取得する

 ナンピンを行うために、まず直前のポジションのオープン価格を取得する必要があります。かなり紆余曲折あったのですが、結論から言うと、CPositionInfoクラスのSelectByIndexメソッドとPriceOpenメソッドの組み合わせで実現することができました。

   uint total=PositionsTotal();
   if(ExtHedging && total>=1)
      if(m_position.SelectByIndex(total-1))
      {
          double prePosPrice = NormalizeDouble(m_position.PriceOpen(),m_symbol.Digits());
      }

 まず、 SelectByIndexメソッドについて、これは、現在オープンポジションを0始まりのリストから選択するものです。この時、引数に0を入力すれば一番過去にオープンされたポジション、リストの最大値を入力すれば最新のポジションを選択します。今回はPositionsTotalメソッドでオープンポジション数を取得し、0始まりを考慮して-1することで最新のポジションを選択しています。 選択した最新のポジションのオープン価格をPriceOpenメソッドで、変数prePosPriceに取得しています。

直前のポジションとの価格差で注文可否を判定する。

 上記のコードを発展させて、直前のポジションのオープン価格と現在の相場を比較して、注文可否を判定するように変更します。ポジションオープン判定の前に以下のコードを追加し、 前回の投稿で 扱った取引可能フラグを書き換え、ポジション追加を可能にします。ポジション追加を可能にする条件は「現在の相場が直前のポジションのオープン価格-10pips以上」とします。

   //--- 直前のポジションのオープン価格-10pips以上の相場なら取引可能フラグをtrueにする。
   uint total=PositionsTotal();
   if(ExtHedging && total>=1)
      if(m_position.SelectByIndex(total-1))
      {
         ENUM_POSITION_TYPE test  = m_position.PositionType();
         if(m_position.PositionType()==POSITION_TYPE_BUY)
         {  
            double prePosPrice=  NormalizeDouble(m_position.PriceOpen(),m_symbol.Digits());
            if(prePosPrice - 10*m_adjusted_point >= m_symbol.Ask())
               Tradable = true;
         }
      }

 ショートポジションオープン処理についても同じ変更を加え(相場の移動方向の条件は勿論逆です)、ポジションオープンの条件は、「パラポリックSARが価格と交差したとき」とします。

 想定通りに取引されているようです。左側のショートポジションオープン時はオープン後価格が下落したため、一度しかオープンされていません。一方、真ん中のロングポジションオープン時は、オープン後価格が下落したことにより、より低い価格でポジションが追加され、計3回ポジションがオープンされています。

バックテスト

 一応、現時点でバックテストを行ってみたところ、以下のようになりました。ポジション追加を可能にしたこと以外は、こちらの投稿で作製したEAと同じ条件です。

 何故か証拠金の利用率がこちらの投稿で作製したEA に比べて妙に低くなってしまったので、利益自体は小さくなっていますが、グラフ形状はがたつきが軽減されています。2020/2~2020/3以外でほとんど利益が出せていないのでまだまだですが。

まとめ

 タイトルテーマはナンピンの実装でしたが、思いの外てこずって疲れたので今日はこれまでとします。今回、ナンピンのポジションオープン処理は実装できたので、次回はポジションクローズ処理について勉強したいと思います。