Ini adalah strategi keluar yang menggunakan hentian menyusuri bertahap dengan mengambil keuntungan separa. Ia memindahkan hentian kerugian ke impas selepas mencapai tahap keuntungan mengambil pertama, dan bergerak ke mengambil keuntungan pertama selepas mencapai tahap kedua. Ini membolehkan mengunci beberapa keuntungan sambil mengekalkan potensi keuntungan.
Komponen utama strategi ini ialah:
Secara khusus, ia pertama menetapkan 100 mata stop loss dan mengambil keuntungan pada 100/200/300 mata.curProfitInPts
fungsi mengira keuntungan semasa berdasarkan harga semasa dan harga kemasukan.calcStopLossPrice
fungsi mengira harga stop loss berdasarkan jarak titik.
Logik utama adalah dalamgetCurrentStage
fungsi yang memeriksa jika terdapat kedudukan dan jika keuntungan telah melebihi setiap mengambil tahap keuntungan, memajukan peringkat jika benar.
Akhirnya, stop loss dimodifikasi mengikut peringkat. Tahap 1 menggunakan stop asal, peringkat 2 break even, dan peringkat 3 jejak tahap mengambil keuntungan pertama.
Kelebihan strategi hentian yang diteruskan ini:
Terdapat beberapa risiko yang perlu dipertimbangkan:
Beberapa cara strategi ini boleh ditingkatkan:
/*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)