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

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

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でも変更がされるようにしています。
TwitterでシェアFacebookでシェアGoogle+でシェアはてなブックマークに追加

TOPへ