トレイリングストップとは、ポジションの含み損益が更新される度に損切り注文の価格を変化させていく手仕舞い方法です。ポジションがオープンした直後は、損切り注文は損失を限定するためのものですが、価格が変化してそのポジションに含み益が乗ってきたときには、損切り価格を変更することで、利益を確保することができます。

共通ライブラリには、オープンポジションの現在の含み益より一定値幅だけ損失となる価格の損切り注文をセットする関数SetTrailingStop()があります。これはトレイリングストップの機能を実現するために、ポジションの含み益が小さくなる方向へは損切り注文の変更は行わないようになっています。

SetTrailingStop()をティック毎に実行することで、価格の変動に応じて損切り注文を変更し、トレイリングストップによる手仕舞いを行うことができます。

コード

//共通ライブラリ
#include "LibEA.mqh"

sinput double Lots = 0.1; //売買ロット数
input double TSpips = 25; //トレイリングストップ幅(pips)

//ティック時実行関数
void Tick()
{
   //トレイリングストップのセット
   SetTrailingStop(TSpips, false);

   int sig_entry = EntrySignal(); //仕掛けシグナル
   //成行売買
   MyOrderSendMarket(sig_entry, sig_entry, Lots);
}

input int FastMAPeriod = 20; //短期移動平均の期間
input int SlowMAPeriod = 50; //長期移動平均の期間

//仕掛けシグナル関数
int EntrySignal()
{
   //1本前と2本前の移動平均
   double FastMA1 = iMA(_Symbol, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
   double FastMA2 = iMA(_Symbol, 0, FastMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 2);
   double SlowMA1 = iMA(_Symbol, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 1);
   double SlowMA2 = iMA(_Symbol, 0, SlowMAPeriod, 0, MODE_SMA, PRICE_CLOSE, 2);

   int ret = 0; //シグナルの初期化

   //買いシグナル
   if(FastMA2 <= SlowMA2 && FastMA1 > SlowMA1) ret = 1;
   //売りシグナル
   if(FastMA2 >= SlowMA2 && FastMA1 < SlowMA1) ret = -1;

   return ret; //シグナルの出力
}

説明

SetTrailingStop()tspipsの引数に、別途宣言したトレイリングストップ幅(含み益が更新したときの価格から損切り注文までの値幅のpips値)TSpipsを代入します。

profit_flagfalseの場合、ポジションがオープンした直後に、TSpipspipsだけ損失となる損切り注文をセットします。

profit_flagtrueの場合は、ポジションにTSpipspipsの含み益が発生するまで損切り注文をセットしません。


<aside> 💡 損益のチェックはティック単位で行うので、ストラテジーテスターのモデルを「全ティック」にしてバックテストする必要があります。

</aside>

<aside> ❗ profit_flagtrueの場合、含み益が発生せず、トレイリングストップの損切り注文が入らないことがあります。損失を限定したい場合、一定の損切り・利食いによる手仕舞いなどで損切りを行うことをお勧めします。

</aside>