Đây là một chiến lược thoát vốn sử dụng một stop trailing từng bước với phần lấy lợi nhuận. Nó di chuyển stop loss đến break-even sau khi đạt đến mức lấy lợi nhuận đầu tiên, và di chuyển đến mức lấy lợi nhuận đầu tiên sau khi đạt đến mức thứ hai. Điều này cho phép khóa một số lợi nhuận trong khi duy trì tiềm năng lợi nhuận.
Các thành phần chính của chiến lược này là:
Cụ thể, đầu tiên, nó thiết lập một điểm dừng lỗ 100 và lấy lợi nhuận ở mức 100/200/300 điểm.curProfitInPts
chức năng tính toán lợi nhuận hiện tại dựa trên giá hiện tại và giá nhập cảnh.calcStopLossPrice
Chức năng tính giá dừng lỗ dựa trên khoảng cách điểm.
Logic chính nằm tronggetCurrentStage
chức năng kiểm tra xem có một vị trí và nếu lợi nhuận đã vượt quá mỗi mức lợi nhuận, tiến về giai đoạn nếu đúng. ví dụ, giai đoạn 2 đạt được sau khi lợi nhuận 100 điểm, và giai đoạn 3 sau khi lợi nhuận 200 điểm.
Cuối cùng, mức dừng lỗ được sửa đổi theo giai đoạn. Giai đoạn 1 sử dụng mức dừng ban đầu, giai đoạn 2 phá vỡ, và giai đoạn 3 theo dõi mức lợi nhuận đầu tiên.
Những lợi thế của chiến lược dừng kéo theo từng bước này:
Có một số rủi ro cần xem xét:
Một số cách để cải thiện chiến lược này:
/*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)