トレーリングストップ実行関数

MetaTrader 4
GogoJungle
2019/08/02 20:53
61

人気の決済方法であるトレーリングストップを実装するサンプルです。

void TrailingStop(
   int magic
   double ts_pips;
);

パラメータ
magic
トレーリングストップの対象とするポジションのマジックナンバー

ts_pips
トレーリングストップの間隔をpips単位で指定

戻り値
無し

void TrailingStop(int magic, double ts_pips){
   double sl = 0;
   double point = Point;
   if(Digits == 3 || Digits == 5){
      point *= 10;
   }

   for(int i = OrdersTotal() - 1; i >= 0; i--){
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) return;
      if(OrderMagicNumber() != magic) continue;
      if(OrderSymbol() != Symbol()) continue;
      if(OrderType() == OP_BUY){
         sl = Bid - ts_pips * point;
         sl = NormalizeDouble(sl, Digits);
         if(sl >= OrderOpenPrice() && sl > OrderStopLoss()){
            if(!OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0)){
               Print(__FUNCTION__, " ErrorCode=", GetLastError());
            }
         }
      }
      else if(OrderType() == OP_SELL){
         sl = Ask + ts_pips * point;
         sl = NormalizeDouble(sl, Digits);
         if(sl <= OrderOpenPrice() && (sl < OrderStopLoss() || OrderStopLoss() == 0)){
            if(!OrderModify(OrderTicket(), OrderOpenPrice(), sl, OrderTakeProfit(), 0)){
               Print(__FUNCTION__, " ErrorCode=", GetLastError());
            }
         }
      }
   }
}

magicで指定されたポジションを選択し、変更後のSLの値を算出します。
買いポジションの場合は変更後のSLがエントリー価格と現在のSL値よりも大きい場合(より利益が確保できる場合)にSL値の変更処理を行ないます。
売りポジションの場合はエントリー価格と現在のSL値よりも小さい場合に変更を行ないます。
ただしエントリー時にSLを指定していない場合はSLが0となっているため、SLが変更されません。
そこで現在のSLとの比較の条件を、

sl < OrderStopLoss() || OrderStopLoss() == 0

としてSLが0でも変更がされるようにしています。

コメント

関連項目

検索結果がありません。