【MQL5】 MT5のEA作成の勉強 その10 複数ポジションをオープンする (2/ 2)

【MQL5】 MT5のEA作成の勉強 その10 複数ポジションをオープンする (2/ 2)

まえがき

 前回の投稿で、公式サイトのMACD Sampleをベースに複数ポジションを保有できるように処理を書き換えました。しかし、そのままでは以下の様に、条件を満たすバーで何度もポジションがオープンされるようになってしまい、実用的ではありません。そこで、今回は、条件を満たすバーで一度だけ取引を行うように処理を書き換えて行きたいと思います。

書き換えた処理

 主なポイントは以下の4点です。

  • グローバル変数に、取引可能フラグ「Tradable」を追加する。(初期値true)
  • ポジションのオープン判定の直前に、現在のティックが新規バーの開始直後(ティックボリュームが1以下)なら、取引可能フラグをtrueに変更する処理を追加する。
  • 取引処理の開始条件に、取引可能フラグがtrueであることを追加する。
  • ポジションオープン後、取引可能フラグをfalseにする判定を追加する。

書き換えたロングポジションオープン処理は、以下のようになります。ちなみに、変更前のコードはこちらに掲載しています。
 上記以外にもパラポリックSARによる判定条件を、一部コメントアウトし、変更前のコードでは「価格を下抜いた時」だったのを「価格より下にある時」に変更しています。これは、交差したときが条件だと、ポジションオープン条件を満たすバーが、クローズ条件を満たすバーまでの間に一本しかないので、ポジション追加が可能になったかがわからなかったからです。

//+------------------------------------------------------------------+
//| Check for long position opening                                  |
//+------------------------------------------------------------------+
bool CSampleExpert::LongOpened(void)
  {
   bool res=false;

   //--- 現在の価格と前回の価格を取得
   MqlRates rt[2];
   if(CopyRates(_Symbol,_Period,0,2,rt)!=2)
   {
      Print("CopyRates of ",_Symbol," failed, no history");
      return(false);
   }
   
   //--- 新規のバーでトレード可能フラグをtrueに変更
   if(rt[1].tick_volume<=1)
      Tradable = true;
      
  //--- パラポリックSAR指標が現在の足で開始価格より下にある場合
  if(m_sar_current<rt[1].open && 
     //m_sar_previous>rt[0].open && 
     Tradable==true)
   {
      double price=m_symbol.Ask();
      double tp   =m_symbol.Bid()+m_take_profit;
      //--- 証拠金残高確認
      if(m_account.FreeMarginCheck(Symbol(),ORDER_TYPE_BUY,InpLots,price)<0.0)
         printf("We have no money. Free Margin = %f",m_account.FreeMargin());
      else
        {
         //--- ロングポジションをオープン
         if(m_trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,InpLots,price,0.0,tp))
           {
            printf("Position by %s to be opened",Symbol());
            Tradable = false;
           }
         else
           {
            printf("Error opening BUY position by %s : '%s'",Symbol(),m_trade.ResultComment());
            printf("Open parameters : price=%f,TP=%f",price,tp);
           }
        }
      //--- in any case we must exit from expert
      res=true;
    }
//--- result
   return(res);
  }

実行すると、以下のようになりました。
いい感じですね。パラポリックSARが 価格より下にある時 、バー一本につき一回、ロングポジションがオープンされています。ちなみに決済は利食い価格に届いたところで決済されています。ショートも同じ条件です。

2019/1/1~2020/12/31の期間でバックテストしてみたところ、以下のような結果になりました。

まとめ

 うん。これは酷い。変更前のコードでやったバックテストの方がよほどましですね。しかし、今回の目的はあくまで、複数ポジションを保有するEAを作るときに、一本のバーで何回も取引されないようにすることです。その目的は無事に達成できたと思います。次回はナンピン風に、価格の変化を条件としてポジションを追加する方法を学んでみたいと思います。