
Esta estrategia es una estrategia de salida que utiliza un stop-loss escalonado combinado con un stop-loss deslizante. Tras alcanzar el primer stop-loss, el stop-loss se traslada al punto de equilibrio de pérdidas y al punto de equilibrio de pérdidas, tras alcanzar el segundo stop-loss, el stop-loss se traslada al primer stop-loss, lo que permite un mecanismo de stop-loss deslizante escalonado. Esto puede bloquear parte de las ganancias y mantener un gran espacio para las ganancias.
Esta estrategia se desarrolla principalmente a través de las siguientes partes:
Concretamente, primero se establece una distancia de parada de pérdida de 100 puntos y tres distancias de parada de 100/200/300 puntos. Luego se define una función para calcular el valor de ventaja basado en el precio actual y el precio de apertura de la posición.curProfitInPts, y la función que calcula el precio de parada en función de la distancia de puntoscalcStopLossPrice。
La lógica clave es quegetCurrentStageFunción que determina si hay una posición en el momento y si el número de ganancias ha superado un punto de parada, si se supera, se pasa a la siguiente etapa. Por ejemplo, se pasa a la segunda etapa después de alcanzar el punto de parada 100, se pasa a la tercera etapa después de alcanzar el punto de parada 200.
Finalmente, se modifica el precio de parada en función de las etapas, lo que permite un punto de parada deslizante. En la primera etapa, el punto de parada se mantiene en la configuración original, en la segunda etapa se mueve a un equilibrio de pérdidas y ganancias, y en la tercera etapa se mueve al primer punto de parada.
Esta estrategia de puntos de parada escalonados tiene las siguientes ventajas:
La estrategia también tiene ciertos riesgos:
La estrategia puede ser optimizada en las siguientes direcciones:
/*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)