Chiến lược này tính toán động lực của giá để xác định hướng xu hướng và thiết lập các điểm dừng theo dõi hai chiều để khóa lợi nhuận, nhận ra dừng lỗ theo xu hướng. Chiến lược cũng kết hợp các mức kích hoạt để bắt đầu theo dõi chỉ sau khi đạt được mục tiêu lợi nhuận cụ thể, ngăn ngừa hiệu quả việc dừng lỗ sớm.
Nó tính toán động lượng giá 12 giai đoạn, và tiếp tục tính toán động lượng giá 1 giai đoạn. Khi động lượng nhanh (1 thời gian động lực của động lượng giá) lớn hơn 0, nó đi dài. Khi nhỏ hơn 0, nó đi ngắn. Điều này đánh giá sự thay đổi hướng của động lượng giá để xác định xu hướng giá.
Nó thiết lập khoảng cách dừng sau và mức kích hoạt. Khoảng cách dừng sau đề cập đến việc điều chỉnh dừng lại ở một khoảng cách được chỉ định từ mức cao hoặc thấp mới nhất khi giá đạt đến mức cao hoặc thấp mới. Mức kích hoạt có nghĩa là dừng sau chỉ bắt đầu sau khi đạt đến một tỷ lệ lợi nhuận nhất định.
Chiến lược khóa lợi nhuận bằng cách theo dõi giá cao nhất hoặc giá thấp nhất, gửi lệnh đóng cửa khi giá kéo trở lại ngoài khoảng cách dừng đặt.
Việc xác định động lượng kép đánh giá chính xác hướng xu hướng, giảm giao dịch và tránh bị mắc kẹt.
Khoảng cách dừng kéo dài linh hoạt làm giảm rủi ro và khóa lợi nhuận.
Mức kích hoạt ngăn chặn việc dừng lỗ sớm bằng cách chỉ cho phép kéo dài sau khi đạt được một số mục tiêu lợi nhuận.
Bi-directional dừng lại kiểm soát toàn diện rủi ro cho cả hai dài và ngắn.
Tính toán đơn giản và hiệu quả, dễ hiểu và thực hiện.
Động lực kép có thể tạo ra tín hiệu ngược, cần bộ lọc xu hướng.
Khoảng cách dừng quá xa có thể gây ra tổn thất đáng kể.
Mức kích hoạt cao có thể bỏ lỡ cơ hội dừng.
Cần nhiều thử nghiệm và tối ưu hóa tham số hơn để tìm ra các điểm dừng tối ưu.
Có thể giảm tín hiệu sai thông qua đánh giá xu hướng và tối ưu hóa tham số. Kiểm tra trên các sản phẩm và các bộ tham số khác nhau để tìm cấu hình tốt nhất.
Kết hợp nhận dạng cấu trúc thị trường cho xu hướng, tránh giao dịch ngược.
Thêm thêm các điều kiện thời gian như thay đổi âm lượng, nén breakout để cải thiện độ chính xác tín hiệu.
Tối ưu hóa các thông số bằng cách thử nghiệm khoảng cách dừng và mức kích hoạt khác nhau.
Xem xét dừng lại theo dõi động tùy thuộc vào biến động thị trường.
Đặt dừng một phần hoặc dừng di chuyển để kiểm soát rủi ro tốt hơn.
Chiến lược có cấu trúc rõ ràng, đánh giá xu hướng với động lực kép và khóa lợi nhuận với các điểm dừng kéo theo linh hoạt, kiểm soát hiệu quả rủi ro giao dịch. Nó dễ hiểu và thực hiện, với không gian tối ưu hóa. Thêm nhiều chỉ số kỹ thuật và kiểm tra tham số có thể cải thiện hơn nữa hiệu suất chiến lược. Chiến lược cung cấp ý tưởng và tham chiếu để thực hiện quản lý dừng lỗ.
/*backtest start: 2023-01-01 00:00:00 end: 2023-02-03 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=5 strategy("Trailing Stop Snippet", overlay=true) length = input(12) price = close momentum(seria, length) => mom = seria - seria[length] mom mom0 = momentum(price, length) mom1 = momentum( mom0, 1) tsact = input.float(0.0, "Trailing Stop Activation |", group="strategy", tooltip="Activates the Trailing Stop once this PnL is reached.") / 100 tsact := tsact ? tsact : na ts = input.float(0.0, "Position Trailing Stop |", group="strategy", tooltip="Trails your position with a stop loss at this distance from the highest PnL") / 100 ts := ts ? ts : na in_long = strategy.position_size > 0 in_short = strategy.position_size < 0 var ts_ = array.new_float() ts_size = array.size(ts_) ts_get = ts_size > 0 ? array.get(ts_, ts_size - 1) : 0 if in_long if tsact and high > strategy.position_avg_price + strategy.position_avg_price * tsact if ts_size > 0 and ts_get < high array.push(ts_, high) if ts_size < 1 array.push(ts_, high) if not tsact if ts_size > 0 and ts_get < high array.push(ts_, high) if ts_size < 1 array.push(ts_, high) if in_short if tsact and low < strategy.position_avg_price - strategy.position_avg_price * tsact if ts_size > 0 and ts_get > low array.push(ts_, low) if ts_size < 1 array.push(ts_, low) if not tsact if ts_size > 0 and ts_get > low array.push(ts_, low) if ts_size < 1 array.push(ts_, low) trail = in_long and ts_size > 0 ? low < ts_get - ts_get * ts : in_short and ts_size > 0 ? high > ts_get + ts_get * ts : na if (mom0 > 0 and mom1 > 0) strategy.entry("MomLE", strategy.long, stop=high+syminfo.mintick, comment="MomLE") else strategy.cancel("MomLE") if (mom0 < 0 and mom1 < 0) strategy.entry("MomSE", strategy.short, stop=low-syminfo.mintick, comment="MomSE") else strategy.cancel("MomSE") tsClose = in_long ? ts_get - ts_get * ts : in_short ? ts_get + ts_get * ts : na if trail strategy.close_all() if not strategy.opentrades array.clear(ts_) //plot(strategy.equity, title="equity", color=color.red, linewidth=2, style=plot.style_areabr) plotchar(ts_get, "GET", "") plot(strategy.position_avg_price > 0 ? strategy.position_avg_price : na, "Average", color.rgb(251, 139, 64), 2, plot.style_cross) plot(tsClose > 0 ? tsClose : na, "Trailing", color.rgb(251, 64, 64), 2, plot.style_cross) plot(strategy.position_avg_price - strategy.position_avg_price * tsact > 0 ? strategy.position_avg_price - strategy.position_avg_price * tsact : na, "TS Activation", color.fuchsia, 2, plot.style_cross)