一般的なトレイリングストップ関数

本記事で公開しているライブラリーは公開当時のままで、古くなっております。最新版のライブラリーはメルマガ登録いただくことでダウンロードできます。

トレイリングストップはトレンドフォローの必需品

トレーダーなら損小利大を狙いたいですよね。それを叶えてくれるのが、皆さんご存じのトレイリングストップ。トレンドフォロー戦略では欠かせない機能です。

トレイリングストップと一言でいってもシンプルなものから複雑なものまで色々ありますが、今回は、仕掛けから特定の値幅だけ進んだらストップの位置を変更していく一般的なトレイリングストップ関数を紹介します。複雑なトレイリングストップは必要になり次第、取り上げるつもりです。

//+------------------------------------------------------------------+
//|【関数】一般的なトレイリングストップ                              |
//|                                                                  |
//|【引数】 IN OUT  引数名             説明                          |
//|        --------------------------------------------------------- |
//|         ○      aMagic             マジックナンバー              |
//|         ○      aTS_StartPips      トレイリングストップ開始値幅(pips)  |
//|         ○      aTS_StopPips       損切り値幅(pips)            |
//|                                                                  |
//|【戻値】なし                                                      |
//|                                                                  |
//|【備考】仕掛け位置からaTS_StartPips順行したら、その位置か         |
//|        aTS_StopPips逆行した位置にストップを設定                  |
//+------------------------------------------------------------------+
void trailingStopGeneral(int aMagic, double aTS_StartPips, double aTS_StopPips)
{
  for(int i = 0; i < OrdersTotal(); i++){
    // オーダーが1つもなければ処理終了
    if(OrderSelect(i, SELECT_BY_POS) == false){
      break;
    }

    string oSymbol = OrderSymbol();

    // 別EAのオーダーはスキップ
    if(oSymbol != Symbol() || OrderMagicNumber() != aMagic){
      continue;
    }

    int oType = OrderType();

    // 待機オーダーはスキップ
    if(oType != OP_BUY && oType != OP_SELL){
      continue;
    }

    double digits = MarketInfo(oSymbol, MODE_DIGITS);

    double oPrice    = NormalizeDouble(OrderOpenPrice(), digits);
    double oStopLoss = NormalizeDouble(OrderStopLoss(), digits);
    int    oTicket   = OrderTicket();

    double start = aTS_StartPips * gPipsPoint;
    double stop  = aTS_StopPips  * gPipsPoint;

    if(oType == OP_BUY){
      double price = MarketInfo(oSymbol, MODE_BID);
      double modifyStopLoss = price - stop;

      if(price >= oPrice + start){
        if(modifyStopLoss > oStopLoss){
          orderModifyReliable(oTicket, 0.0, modifyStopLoss, 0.0, 0, gArrowColor[oType]);
        }
      }
    }else if(oType == OP_SELL){
      price = MarketInfo(oSymbol, MODE_ASK);
      modifyStopLoss = price + stop;

      if(price <= oPrice - start){
        // ショートの場合、条件式にoStopLoss == 0.0が必要
        // oStopLoss=0は、損切り値を設定していない場合
        // その場合、modifyStopLoss < oStopLossの条件は永久に成立しない(※)ため
        // ※「modifyStopLoss < 0」でかつ「modifyStopLossは価格なので0以上」のため
        if(modifyStopLoss < oStopLoss || oStopLoss == 0.0){
          orderModifyReliable(oTicket, 0.0, modifyStopLoss, 0.0, 0, gArrowColor[oType]);
        }
      }
    }
  }
}

最初に、オーダーの有無をチェックした上で、別EAの注文や待機注文は対象外なのでスキップするようにしています。

スキップ処理は便利
関数の冒頭に、処理対象外をスキップするロジックを記述するのはよく使う手です。スキップ処理により、処理速度が改善します。

ロングとショートで若干ロジックが異なっています。特にショートのif文の「oStopLoss == 0.0」は重要です。うっかり忘れやすい箇所ですね。これを追加しておかないと、永久に条件が成立しなくなってしまいますので、必ず入れておきましょう!

サンプルEA

関数だけではイメージが沸きづらいと思いますので、サンプルEAを載せておきます。OnTick()に当関数をセットすることで、ティックごとに関数が呼ばれます。OnInit()にセットしてしまうと、EA開始時に一回しか呼ばれないことになり、トレイリングストップの役割を果たしてくれませんので、要注意です。

「一般的なトレイリングストップ関数」のSample.mq4
サイズ: 5.0KB
バージョン: 1.0
公開:2019年10月16日

MT4の無料プログラミング講座

LINE公式アカウントを友だち追加して、MT4のプログラミング講座を無料で受けちゃおう!

超豪華プレゼントも盛りだくさん♪

MT4プログラミングを習得すると、オリジナルEA運用、作成代行、商品販売等、複数の収入源を手に入れられるよ。副業に最適だね!

↓↓↓ 詳細はこちら ↓↓↓

アイキャッチ

>

エターナル・パートナーPRO ~MT4裁量トレード支援ツール~ 「MT4は裁量トレーダーに優しくない」そう思ったことありませんか?もっと快適にトレードするための強力な売買ツールが必要だと考え、開発したのが「エターナル・パートナーPRO」です。元々は自分自身のために開発したツールですので、手抜き無しのガチものです。既に200名近い方に手に取っていただき、喜びの声が続々と届いております。ぜひご覧ください!

CTR IMG