
Cette stratégie est une stratégie de sortie qui utilise un stop-loss par étapes combiné à un stop-loss à l’échelle. Elle déplace le stop-loss vers le point d’équilibre de la perte après avoir atteint le premier stop-loss et le stop-loss vers le premier stop-loss après avoir atteint le deuxième stop-loss, ce qui permet un mécanisme de stop-loss à l’échelle.
La stratégie consiste principalement à réaliser des points d’arrêt par étapes:
Plus précisément, il a d’abord défini une distance d’arrêt de 100 points et trois distances d’arrêt de 100/200/300 points. Ensuite, il a défini une fonction pour calculer le nombre d’avantages en fonction du prix actuel et du prix d’ouverture de la position.curProfitInPts, ainsi que la fonction de calcul du prix stop-loss en fonction de la distance entre les pointscalcStopLossPrice。
La logique de base est la suivante:getCurrentStageFonction qui détermine si une position est en cours et si le nombre d’avantages obtenus a dépassé un certain point d’arrêt. Si le nombre d’avantages est dépassé, il passe à la prochaine étape. Par exemple, après avoir atteint 100 points d’arrêt, il passe à la deuxième étape et après avoir atteint 200 points d’arrêt, il passe à la troisième étape.
Enfin, modifier le prix d’arrêt en fonction des étapes pour atteindre le point d’arrêt. Le premier arrêt est maintenu à sa position initiale, le second est déplacé vers l’équilibre des pertes et des gains, le troisième vers le premier point d’arrêt.
Cette stratégie de points d’arrêt par étapes présente les avantages suivants:
Cette stratégie comporte aussi des risques:
Cette stratégie peut être optimisée dans les directions suivantes:
/*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)