Это стратегия выхода, которая использует пошаговую остановку с частичным получением прибыли. Она перемещает стоп-лосс на уровень безубыточности после достижения первого уровня прибыли и переходит на первый уровень прибыли после достижения второго уровня. Это позволяет зафиксировать некоторые прибыли, сохраняя при этом потенциал прибыли.
Ключевыми компонентами этой стратегии являются:
В частности, он сначала устанавливает стоп-лосс в 100 пунктов и получает прибыль в 100/200/300 пунктов.curProfitInPts
Функция рассчитывает текущую прибыль на основе текущей цены и входной цены.calcStopLossPrice
функция рассчитывает цену стоп-лосса на основе точечного расстояния.
Ключевая логика заключается вgetCurrentStage
Функция, которая проверяет, есть ли позиция и если прибыль превысила каждый уровень прибыли, продвигая стадию, если это верно. Например, стадия 2 достигается после прибыли в 100 пунктов, и стадия 3 после прибыли в 200 пунктов.
Наконец, стоп-лосс изменяется в зависимости от стадии.
Преимущества этой пошаговой стратегии:
Некоторые риски следует учитывать:
Некоторые способы улучшения этой стратегии:
/*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)