これは,部分的な利益を取ることによる段階的なトレーリングストップを使用する出口戦略である.最初の利益を取ったレベルに達した後,ストップロスをブレイクイブンに移動し,第2レベルに達した後,最初の利益を取ることに移動する.これは利益の可能性を維持しながら一部の利益をロックすることができます.
この戦略の主な要素は次のとおりです.
まず,ストップ・ロスは100ポイントで,利益は100/200/300ポイントに設定します.curProfitInPts
この関数は,現在の価格とエントリー価格に基づいて現在の利益を計算します.calcStopLossPrice
この関数は,点距離に基づいてストップ損失価格を計算します.
鍵となる論理はgetCurrentStage
ポジションがあるかどうか,利益が各取利益レベルを超えたかどうかをチェックする関数で,真である場合はステージを前進します.例えば,ステージ2は100ポイントの利益,ステージ3は200ポイントの利益後に達成されます.
最後に,ストップ・ロスはステージに応じて変更されます.ステージ1は元のストップ,ステージ2はブレイク・エヴェン,ステージ3は最初の取利益レベルを使用します.
この段階的なストップ戦略の利点:
考慮すべきリスクは:
この戦略を改善するいくつかの方法:
/*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)