Ini adalah strategi keluar yang memanfaatkan stop trailing bertahap dengan mengambil keuntungan parsial. Ini memindahkan stop loss ke titik impas setelah mencapai level take profit pertama, dan bergerak ke take profit pertama setelah mencapai level kedua. Ini memungkinkan mengunci beberapa keuntungan sambil mempertahankan potensi keuntungan.
Komponen utama dari strategi ini adalah:
Secara khusus, pertama-tama menetapkan stop loss 100 poin dan mengambil keuntungan pada 100/200/300 poin.curProfitInPts
Fungsi ini menghitung keuntungan saat ini berdasarkan harga saat ini dan harga masuk.calcStopLossPrice
Fungsi menghitung harga stop loss berdasarkan jarak titik.
Logika kunci adalah dalamgetCurrentStage
fungsi yang memeriksa apakah ada posisi dan jika keuntungan telah melebihi setiap mengambil tingkat keuntungan, memajukan tahap jika benar.
Akhirnya, stop loss dimodifikasi sesuai dengan tahap. Tahap 1 menggunakan stop asli, tahap 2 break-even, dan tahap 3 mengikuti level take profit pertama.
Keuntungan dari strategi stop trailing bertahap ini:
Ada beberapa risiko yang harus dipertimbangkan:
Beberapa cara strategi ini dapat 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)