Esta es una estrategia de salida que utiliza una parada de seguimiento escalonada con una toma parcial de ganancias. Mueve la parada de pérdida al punto de equilibrio después de alcanzar el primer nivel de ganancia y se mueve a la primera toma de ganancias después de alcanzar el segundo nivel. Esto permite bloquear algunas ganancias manteniendo el potencial de ganancia.
Los componentes clave de esta estrategia son:
Específicamente, primero establece un stop loss de 100 puntos y toma ganancias en 100/200/300 puntos.curProfitInPts
La función calcula el beneficio actual basándose en el precio actual y el precio de entrada.calcStopLossPrice
La función calcula el precio de stop loss basado en la distancia del punto.
La lógica clave está dentro de lagetCurrentStage
Función que comprueba si existe una posición y si el beneficio ha superado cada nivel de beneficio, avanzando la etapa si es verdad.
Finalmente, el stop loss se modifica de acuerdo con la etapa: la etapa 1 utiliza el stop original, la etapa 2 el break-even y la etapa 3 sigue el primer nivel de take profit.
Las ventajas de esta estrategia gradual de detención de trailers:
Hay algunos riesgos a tener en cuenta:
Algunas maneras de mejorar esta estrategia:
/*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)