見出し画像

トレーリングストップを利用する

■処理の概要
価格が開始価格より、5pip有利に動いた状態で、(買いの場合)エントリー価格と前足最安値との間にSLを入れる
また、前足最安値がさらに有利な位置に移動した都度、SLを引き上げる

(筆者より)
ポジション数が多い場合、バックテスト時、処理が非常に重くなるため、Tick更新時に作動させた方が無難
↓↓↓↓↓こちら参考↓↓↓↓↓


//<<<<<>>>>><<<<<>>>>><< include >><<<<<>>>>><<<<<>>>>>
#include <Trade\Trade.mqh>

//<<<<<>>>>><<<<<>>>>><< 共通変数 >><<<<<>>>>><<<<<>>>>>
CTrade mytrade;
input group "MagicNumber"
int MagicNumber_bid = 1111; // bidマジックナンバー
int MagicNumber_ask = 1112; // askマジックナンバー

OnInit()

特になし

OnTick()

TrailingStop();

TrailingStop()

//+------------------------------------------------------------------+
//|トレーリングストップ処理
//+------------------------------------------------------------------+
//価格が開始価格より、5pip有利に動いた状態で、エントリー価格と前足最安値との間にSLを入れる
//また、前足最安値がさらに有利な位置に移動した都度、SLを引き上げる
void TrailingStop()
  {
   double Low_ = iLow(_Symbol,_Period,1);
   double High_ = iHigh(_Symbol,_Period,1);

   for(int i = PositionsTotal() - 1; i >= 0; i--)
     {
      //保有ポジションを一つ選択
      ulong position_ticket =  PositionGetTicket(i);
      //選択したポジションが、実行されている通貨ペアと同じかどうかチェック
      if(PositionGetInteger(POSITION_MAGIC) == MagicNumber_bid || PositionGetInteger(POSITION_MAGIC) == MagicNumber_ask)
        {
         double Price_Open = PositionGetDouble(POSITION_PRICE_OPEN);
         double Price_SL   = PositionGetDouble(POSITION_SL);
         if(PositionGetInteger(POSITION_TYPE) == ORDER_TYPE_BUY)
           {
            double Price_Harf = NormalizeDouble((Low_ + Price_Open)/2,_Digits);
            if(Low_ - Price_Open > 50*_Point)
              {
               if(Price_Harf > Price_SL || Price_SL == 0)
                 {
                  mytrade.PositionModify(position_ticket, Price_Harf, PositionGetDouble(POSITION_TP));
                  Sleep(500);
                 }
              }
           }
         else
            if(PositionGetInteger(POSITION_TYPE) == ORDER_TYPE_SELL)
              {
               double Price_Harf = NormalizeDouble((High_ + Price_Open)/2,_Digits);
               if(Price_Open - High_ > 50*_Point)
                 {
                  if(Price_Harf < Price_SL || Price_SL == 0)
                    {
                     mytrade.PositionModify(position_ticket, Price_Harf, PositionGetDouble(POSITION_TP));
                     Sleep(500);
                    }
                 }
              }
        }
     }
  }




MQL5コード一覧はコチラ


この記事が気に入ったらサポートをしてみませんか?