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

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

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

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でも変更がされるようにしています。

コメント

関連項目

カテゴリ
投稿内容
新着順
投稿者
閲覧数
コメント
お気に入り
いいね
検索結果がありません。