
Chiến lược này là một hệ thống giao dịch định lượng dựa trên đường trung bình động, chỉ báo RSI và lệnh dừng lỗ theo sau. Kết hợp theo dõi xu hướng và các chỉ báo động lượng trong phân tích kỹ thuật để đạt được các giao dịch được kiểm soát rủi ro bằng cách thiết lập các điều kiện vào và ra nghiêm ngặt. Logic cốt lõi của chiến lược này là tìm kiếm cơ hội bán quá mức để tham gia thị trường theo xu hướng tăng và sử dụng lệnh dừng lỗ theo sau để bảo vệ lợi nhuận.
Chiến lược này sử dụng đường trung bình động đơn giản (SMA) 200 ngày làm đường cơ sở để đánh giá xu hướng và kết hợp với chỉ số sức mạnh tương đối (RSI) để tạo ra tín hiệu giao dịch. Cụ thể:
Đây là chiến lược giao dịch định lượng có cấu trúc hoàn chỉnh và logic rõ ràng. Kết hợp nhiều chỉ báo kỹ thuật để theo đuổi lợi nhuận ổn định trong khi vẫn kiểm soát được rủi ro. Mặc dù vẫn còn chỗ để tối ưu hóa, nhưng khuôn khổ cơ bản có tính thực tiễn và khả năng mở rộng tốt. Chiến lược này phù hợp với các nhà đầu tư trung và dài hạn và có khả năng thích ứng tốt với các môi trường thị trường khác nhau.
/*backtest
start: 2025-01-09 00:00:00
end: 2025-01-16 00:00:00
period: 15m
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/
//@version=5
strategy("200 SMA Crossover Strategy", overlay=false)
// Define inputs
smaLength = input.int(200, title="SMA Length")
rsiLength = input.int(14, title="RSI Length")
rsiThreshold = input.float(40, title="RSI Threshold")
trailStopPercent = input.float(5.0, title="Trailing Stop Loss (%)")
waitingPeriod = input.int(10, title="Waiting Period (Days)")
// Calculate 200 SMA
sma200 = ta.sma(close, smaLength)
// Calculate RSI
rsi = ta.rsi(close, rsiLength)
// Plot the 200 SMA and RSI
plot(sma200, color=color.blue, linewidth=2, title="200 SMA")
plot(rsi, color=color.purple, title="RSI", display=display.none)
// Define buy and sell conditions
var isLong = false
var float lastExitTime = na
var float trailStopPrice = na
// Explicitly declare timeSinceExit as float
float timeSinceExit = na(lastExitTime) ? na : (time - lastExitTime) / (24 * 60 * 60 * 1000)
canEnter = na(lastExitTime) or timeSinceExit > waitingPeriod
buyCondition = close > sma200 and rsi < rsiThreshold and canEnter
if (buyCondition and not isLong)
strategy.entry("Buy", strategy.long)
trailStopPrice := na
isLong := true
// Update trailing stop loss if long
if (isLong)
trailStopPrice := na(trailStopPrice) ? close * (1 - trailStopPercent / 100) : math.max(trailStopPrice, close * (1 - trailStopPercent / 100))
// Check for trailing stop loss or sell condition
if (isLong and (close < trailStopPrice or close < sma200))
strategy.close("Buy")
lastExitTime := time
isLong := false
// Plot buy and sell signals
plotshape(series=buyCondition, title="Buy Signal", location=location.belowbar, color=color.green, style=shape.labelup, text="BUY")
plotshape(series=(isLong and close < trailStopPrice) or close < sma200, title="Sell Signal", location=location.abovebar, color=color.red, style=shape.labeldown, text="SELL")