
Chiến lược này là một hệ thống giao dịch tự điều chỉnh kết hợp theo dõi xu hướng và giao dịch trong khoảng. Nó sử dụng nhiều chỉ số kỹ thuật để phối hợp với nhau và chuyển đổi mô hình giao dịch linh hoạt trong các môi trường thị trường khác nhau. Chiến lược sử dụng các chỉ số như Supertrend, Moving Average, ADX, RSI và Bollinger Bands để xác định tình trạng thị trường và xác định tín hiệu giao dịch, đồng thời tham khảo giá với VWAP và thiết lập cơ chế dừng lỗ để kiểm soát rủi ro.
Lý luận cốt lõi của chiến lược được chia thành hai phần: theo dõi xu hướng và giao dịch trong khoảng thời gian. Trong thị trường xu hướng (được xác định bởi ADX> 25), chiến lược tạo tín hiệu dựa trên hướng Supertrend, giao điểm EMA và vị trí VWAP; trong thị trường xung đột, chiến lược sử dụng biên giới Brin và RSI để giao dịch vượt quá mức bán tháo.
Đây là một chiến lược tổng hợp được thiết kế hợp lý, logic đầy đủ. Bằng cách phối hợp nhiều chỉ số và chuyển đổi mô hình, có thể duy trì một số khả năng thích ứng trong các môi trường thị trường khác nhau. Mặc dù có một số rủi ro tiềm ẩn, nhưng với kiểm soát rủi ro hợp lý và tối ưu hóa liên tục, chiến lược có giá trị ứng dụng thực tế tốt.
/*backtest
start: 2025-01-27 00:00:00
end: 2025-02-20 00:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"SOL_USDT"}]
*/
//@version=5
strategy("Nifty/BankNifty Multi-Strategy v2", overlay=true, margin_long=100, margin_short=100)
// ———— Inputs ———— //
// Supertrend
atrPeriod = input.int(10, "ATR Period")
supertrendMultiplier = input.float(2.0, "Supertrend Multiplier", step=0.1)
// EMA
ema20Period = input.int(20, "20 EMA Period")
ema50Period = input.int(50, "50 EMA Period")
// ADX/DMI
adxThreshold = input.int(25, "ADX Trend Threshold")
adxLength = input.int(14, "ADX Length")
// RSI
rsiLength = input.int(14, "RSI Length")
rsiOverbought = input.int(70, "RSI Overbought")
rsiOversold = input.int(30, "RSI Oversold")
// Bollinger Bands
bbLength = input.int(20, "BB Length")
bbStdDev = input.float(2.0, "BB Std Dev", step=0.1)
// Stop-Loss
stopLossPerc = input.float(1.0, "Stop-Loss %", step=0.1)
// ———— Calculations ———— //
// Supertrend
[supertrend, direction] = ta.supertrend(supertrendMultiplier, atrPeriod)
// EMAs
ema20 = ta.ema(close, ema20Period)
ema50 = ta.ema(close, ema50Period)
// ADX via DMI (corrected)
[dip, din, adx] = ta.dmi(adxLength, adxLength) // ta.dmi(diLength, adxSmoothing)
// RSI
rsi = ta.rsi(close, rsiLength)
// Bollinger Bands
basis = ta.sma(close, bbLength)
upperBB = basis + ta.stdev(close, bbLength) * bbStdDev
lowerBB = basis - ta.stdev(close, bbLength) * bbStdDev
// VWAP
vwapValue = ta.vwap(hlc3)
// ———— Strategy Logic ———— //
trendingMarket = adx > adxThreshold
// Trend-Following Strategy
emaBullish = ema20 > ema50
priceAboveVWAP = close > vwapValue
longConditionTrend = trendingMarket and direction < 0 and emaBullish and priceAboveVWAP
shortConditionTrend = trendingMarket and direction > 0 and not emaBullish and close < vwapValue
// Range-Bound Strategy
priceNearLowerBB = close <= lowerBB
priceNearUpperBB = close >= upperBB
longConditionRange = not trendingMarket and priceNearLowerBB and rsi < rsiOversold
shortConditionRange = not trendingMarket and priceNearUpperBB and rsi > rsiOverbought
// ———— Entries/Exits ———— //
if (longConditionTrend or longConditionRange)
strategy.entry("Long", strategy.long)
stopPriceLong = strategy.position_avg_price * (1 - stopLossPerc / 100)
strategy.exit("Exit Long", "Long", stop=stopPriceLong)
if (shortConditionTrend or shortConditionRange)
strategy.entry("Short", strategy.short)
stopPriceShort = strategy.position_avg_price * (1 + stopLossPerc / 100)
strategy.exit("Exit Short", "Short", stop=stopPriceShort)
// Exit on Supertrend flip or RSI extremes
if (direction > 0 or rsi >= rsiOverbought)
strategy.close("Long")
if (direction < 0 or rsi <= rsiOversold)
strategy.close("Short")
// ———— Visualization ———— //
plot(supertrend, "Supertrend", color = direction < 0 ? color.green : color.red)
plot(ema20, "20 EMA", color.blue)
plot(ema50, "50 EMA", color.orange)
plot(vwapValue, "VWAP", color.purple)
plot(upperBB, "Upper BB", color.gray)
plot(lowerBB, "Lower BB", color.gray)