Il s'agit d'une stratégie de sortie qui utilise un arrêt progressif avec une prise partielle de profit. Il déplace le stop loss au seuil de rentabilité après avoir atteint le premier niveau de prise de profit, et passe au premier niveau de prise de profit après avoir atteint le deuxième niveau. Cela permet de verrouiller certains profits tout en maintenant le potentiel de profit.
Les éléments clés de cette stratégie sont les suivants:
Plus précisément, il fixe d'abord un stop-loss de 100 points et prend des bénéfices à 100/200/300 points.curProfitInPts
La fonction calcule le bénéfice courant en fonction du prix actuel et du prix d'entrée.calcStopLossPrice
La fonction calcule le prix de stop loss en fonction de la distance de point.
La logique clé réside dans legetCurrentStage
Par exemple, l'étape 2 est atteinte après un profit de 100 points, et l'étape 3 après un profit de 200 points.
Enfin, le stop loss est modifié en fonction de l'étape.
Les avantages de cette stratégie d'arrêt progressif:
Il y a quelques risques à prendre en considération:
Certaines façons d'améliorer cette stratégie:
/*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)