トレーリングイメージ02

トレーリングストップは、トレンド相場では本領発揮できますが、持ち合い相場には向いてません。
ここでは、既存のトレーリングストップ発動条件に加え、ボリンジャーバンドの±1σの幅も加味するようにしていきます。

今回は、前回記事【最大利益の半分で決済するEA】で作成したEAをカスタマイズしていきます。

前回記事【最大利益の半分で決済するEA】へ

EAカスタマイズ内容

前回作成したEAはタイトル通り利益が出ている状態でプラス決済になる値でトレーリングストップを発動させるという前提でカスタマイズしていきます。

もとのEAのコード確認

もとのEAのポジション保有時の処理部分は次の通りです。

   // ポジション保有時の処理 -----------------------------
   
   if (pos_ticket > 0)
   {
      if (OrderSelect(pos_ticket, SELECT_BY_TICKET) == false) return;
      
      // トレーリングストップ
      sl = NormalizeDouble(OrderStopLoss(), Digits);
      
      if (Bid >= OrderOpenPrice() * (100 + TrailingStartPer) * 0.01)
      {
         ts = NormalizeDouble(OrderOpenPrice() + (Bid - OrderOpenPrice()) * TrailingStopPer * 0.01, Digits);
         
         if (sl == 0 || sl < ts)
            if (OrderModify(OrderTicket(), 0, ts, OrderTakeProfit(), 0, clrRed) == false)
               Print("OrderModify error.");
      }
   }

パラメーター設置

ボリンジャーバンドの期間とトレーリングストップ発動を許可する±1σの価格に対する%を指定するパラメーターを追加します。

extern int     BandsPeriod       = 20;
extern double  BandsWidthPer     = 0.5;

トレーリング発動前と発動後で条件を分ける

トレーリングストップを実行するのに最低限必要な条件は、次の条件文です。

if (Bid >= OrderOpenPrice() * (100 + TrailingStartPer) * 0.01)

上記条件文の{}括弧内で、トレーリングストップ発動前と発動後の条件を分けてコードを書いていきます。
それが次のコードです。

         ts = NormalizeDouble(OrderOpenPrice() + (Bid - OrderOpenPrice()) * TrailingStopPer * 0.01, Digits);
         
         bool trail_ok = false;
         
         if (sl == 0 || sl < OrderOpenPrice())  // トレーリング発動前
         {
            double bb_u = iBands(NULL, 0, BandsPeriod, 1.0, 0, PRICE_CLOSE, MODE_UPPER, 0);
            double bb_l = iBands(NULL, 0, BandsPeriod, 1.0, 0, PRICE_CLOSE, MODE_LOWER, 0);
            
            if (bb_u - bb_l >= Bid * BandsWidthPer * 0.01) trail_ok = true;
         }
         else                                   // トレーリング発動後
         {
            if (sl < ts) trail_ok = true;
         }
         
         if (trail_ok == true)
            if (OrderModify(OrderTicket(), 0, ts, OrderTakeProfit(), 0, clrRed) == false)
               Print("OrderModify error.");

まとめ

今回は、トレーリングストップを発動するための条件を追加しました。次回は、ポジションサイジングについて記事にしたいと思います。

では、また次回で^^