Dies ist eine Exit-Strategie, die einen schrittweisen Trailing-Stop mit teilweiser Gewinnentnahme verwendet. Sie bewegt den Stop-Loss nach Erreichen der ersten Gewinnspanne auf Breakeven und bewegt sich nach Erreichen der zweiten Gewinnspanne auf den ersten Gewinn. Dies ermöglicht es, einige Gewinne zu erzielen, während das Gewinnpotenzial beibehalten wird.
Die wichtigsten Bestandteile dieser Strategie sind:
Insbesondere setzt es zunächst einen Stop-Loss von 100 Punkten und nimmt Gewinne bei 100/200/300 Punkten.curProfitInPts
Die Funktion berechnet den aktuellen Gewinn anhand des aktuellen Preises und des Einstiegspreises.calcStopLossPrice
Die Funktion berechnet den Stop-Loss-Preis anhand der Punktdistanz.
Die wichtigste Logik liegt in dergetCurrentStage
Eine Funktion, die überprüft, ob eine Position besteht und ob der Gewinn jedes Gewinnspiel überschritten hat, indem die Stufe vorangetrieben wird, wenn sie wahr ist.
Schließlich wird der Stop-Loss je nach Stufe geändert. Stufe 1 verwendet den ursprünglichen Stop, Stufe 2 Breakeven und Stufe 3 verfolgt die erste Gewinnspanne.
Die Vorteile dieser schrittweisen Strategie:
Es gibt einige Risiken, die zu berücksichtigen sind:
Einige Möglichkeiten, wie diese Strategie verbessert werden kann:
/*backtest start: 2023-11-20 00:00:00 end: 2023-11-27 00:00:00 period: 3m basePeriod: 1m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © adolgov // @description // when tp1 is reached, sl is moved to break-even // when tp2 is reached, sl is moved to tp1 // when tp3 is reached - exit //@version=4 strategy("Stepped trailing strategy example", overlay=true) // random entry condition longCondition = crossover(sma(close, 14), sma(close, 28)) if (longCondition) strategy.entry("My Long Entry Id", strategy.long) // sl & tp in points sl = input(100) tp1 = input(100) tp2 = input(200) tp3 = input(300) curProfitInPts() => if strategy.position_size > 0 (high - strategy.position_avg_price) / syminfo.mintick else if strategy.position_size < 0 (strategy.position_avg_price - low) / syminfo.mintick else 0 calcStopLossPrice(OffsetPts) => if strategy.position_size > 0 strategy.position_avg_price - OffsetPts * syminfo.mintick else if strategy.position_size < 0 strategy.position_avg_price + OffsetPts * syminfo.mintick else 0 calcProfitTrgtPrice(OffsetPts) => calcStopLossPrice(-OffsetPts) getCurrentStage() => var stage = 0 if strategy.position_size == 0 stage := 0 if stage == 0 and strategy.position_size != 0 stage := 1 else if stage == 1 and curProfitInPts() >= tp1 stage := 2 else if stage == 2 and curProfitInPts() >= tp2 stage := 3 stage stopLevel = -1. profitLevel = calcProfitTrgtPrice(tp3) // based on current stage set up exit // note: we use same exit ids ("x") consciously, for MODIFY the exit's parameters curStage = getCurrentStage() if curStage == 1 stopLevel := calcStopLossPrice(sl) strategy.exit("x", loss = sl, profit = tp3, comment = "sl or tp3") else if curStage == 2 stopLevel := calcStopLossPrice(0) strategy.exit("x", stop = stopLevel, profit = tp3, comment = "breakeven or tp3") else if curStage == 3 stopLevel := calcStopLossPrice(-tp1) strategy.exit("x", stop = stopLevel, profit = tp3, comment = "tp1 or tp3") else strategy.cancel("x") // this is debug plots for visulalize TP & SL levels plot(stopLevel > 0 ? stopLevel : na, style = plot.style_linebr) plot(profitLevel > 0 ? profitLevel : na, style = plot.style_linebr)