
Đây là chiến lược theo xu hướng dựa trên chỉ báo SuperTrend, đường trung bình động hàm mũ (EMA) và phạm vi trung bình thực (ATR). Chiến lược này sử dụng nhiều chỉ báo kỹ thuật kết hợp với lệnh dừng lỗ ban đầu và lệnh dừng lỗ di động để theo dõi động xu hướng thị trường và kiểm soát rủi ro. Cốt lõi của chiến lược này là nắm bắt những thay đổi trong hướng xu hướng thông qua chỉ báo SuperTrend, sử dụng EMA để xác nhận xu hướng và thiết lập cơ chế dừng lỗ kép để bảo vệ lợi nhuận.
Chiến lược này hoạt động dựa trên các thành phần cốt lõi sau:
Khi xu hướng SuperTrend chuyển sang hướng xuống và giá đóng cửa cao hơn EMA, hệ thống sẽ đưa ra tín hiệu mua mà không giữ vị thế. Ngược lại, khi xu hướng SuperTrend hướng lên và giá đóng cửa thấp hơn EMA, hệ thống sẽ gửi tín hiệu bán.
Đây là một chiến lược giao dịch hoàn chỉnh kết hợp nhiều chỉ báo kỹ thuật và cơ chế kiểm soát rủi ro. Bằng cách nắm bắt xu hướng thông qua chỉ báo SuperTrend, xác nhận hướng đi thông qua EMA và phối hợp với cơ chế dừng lỗ kép, tỷ lệ rủi ro-lợi nhuận sẽ tốt hơn. Không gian tối ưu hóa của chiến lược chủ yếu nằm ở việc điều chỉnh động các thông số, đánh giá môi trường thị trường và cải thiện hệ thống quản lý rủi ro. Trong các ứng dụng thực tế, nên tiến hành kiểm tra ngược dữ liệu lịch sử đầy đủ và điều chỉnh các thông số theo đặc điểm của từng sản phẩm giao dịch cụ thể.
/*backtest
start: 2024-01-17 00:00:00
end: 2025-01-15 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT","balance":49999}]
*/
//@version=5
strategy(" nifty supertrend triton", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
// Input parameters
atrPeriod = input.int(16, "ATR Length", step=1)
factor = input.float(3.02, "Factor", step=0.01)
maPeriod = input.int(49, "Moving Average Period", step=1)
trailPoints = input.int(70, "Trailing Points", step=1) // Points after which trailing stop activates
initialStopLossPoints = input.int(50, "Initial Stop Loss Points", step=1) // Initial stop loss of 50 points
// Calculate Supertrend
[_, direction] = ta.supertrend(factor, atrPeriod)
// Calculate EMA
ema = ta.ema(close, maPeriod)
// Variables to track stop loss levels
var float trailStop = na
var float entryPrice = na
var float initialStopLoss = na // To track the initial stop loss
// Generate buy and sell signals
if ta.change(direction) < 0 and close > ema
if strategy.position_size == 0 // Only open a new long position if no current position
strategy.entry("Buy", strategy.long)
entryPrice := close // Record the entry price for the long position
initialStopLoss := entryPrice - initialStopLossPoints // Set initial stop loss for long position
trailStop := na // Reset trailing stop for long
if ta.change(direction) > 0 and close < ema
if strategy.position_size == 0 // Only open a new short position if no current position
strategy.entry("Sell", strategy.short)
entryPrice := close // Record the entry price for the short position
initialStopLoss := entryPrice + initialStopLossPoints // Set initial stop loss for short position
trailStop := na // Reset trailing stop for short
// Apply initial stop loss for long positions
if (strategy.position_size > 0) // Check if in a long position
if close <= initialStopLoss // If the price drops to or below the initial stop loss
strategy.close("Buy", "Initial Stop Loss Hit") // Exit the long position
// Apply trailing stop logic for long positions
if (strategy.position_size > 0) // Check if in a long position
if (close - entryPrice >= trailPoints) // If the price has moved up by the threshold
trailStop := na(trailStop) ? close - trailPoints : math.max(trailStop, close - trailPoints) // Adjust trailing stop upwards
if not na(trailStop) and close < trailStop // If the price drops below the trailing stop
strategy.close("Buy", "Trailing Stop Hit") // Exit the long position
// Apply initial stop loss for short positions
if (strategy.position_size < 0) // Check if in a short position
if close >= initialStopLoss // If the price rises to or above the initial stop loss
strategy.close("Sell", "Initial Stop Loss Hit") // Exit the short position
// Apply trailing stop logic for short positions
if (strategy.position_size < 0) // Check if in a short position
if (entryPrice - close >= trailPoints) // If the price has moved down by the threshold
trailStop := na(trailStop) ? close + trailPoints : math.min(trailStop, close + trailPoints) // Adjust trailing stop downwards
if not na(trailStop) and close > trailStop // If the price rises above the trailing stop
strategy.close("Sell", "Trailing Stop Hit") // Exit the short position