
Chiến lược này sử dụng nhiều đường trung bình di chuyển ((MA) làm tín hiệu giao dịch chính và kết hợp với chỉ số hướng trung bình ((ADX) làm bộ lọc. Ý tưởng chính của chiến lược là xác định các cơ hội đa đầu và trống tiềm năng bằng cách so sánh mối quan hệ giữa MA nhanh, MA chậm và MA trung bình. Đồng thời, sử dụng chỉ số ADX để lọc ra môi trường thị trường có xu hướng đủ mạnh để tăng độ tin cậy của tín hiệu giao dịch.
Chiến lược từ chối theo đường thẳng dựa trên bộ lọc chỉ số định hướng trung bình sử dụng nhiều chỉ số MA và ADX để xác định các cơ hội giao dịch tiềm năng và lọc các tín hiệu giao dịch chất lượng thấp. Chiến lược này có logic rõ ràng, dễ hiểu và thực hiện, nhưng trong ứng dụng thực tế cần chú ý đến sự thay đổi của môi trường thị trường và tối ưu hóa kết hợp với các chỉ số kỹ thuật khác và các biện pháp quản lý rủi ro.
/*backtest
start: 2024-04-01 00:00:00
end: 2024-04-30 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © gavinc745
//@version=5
strategy("MA Rejection Strategy with ADX Filter", overlay=true)
// Input parameters
fastMALength = input.int(10, title="Fast MA Length", minval=1)
slowMALength = input.int(50, title="Slow MA Length", minval=1)
averageMALength = input.int(20, title="Average MA Length", minval=1)
adxLength = input.int(14, title="ADX Length", minval=1)
adxThreshold = input.int(20, title="ADX Threshold", minval=1)
// Calculate moving averages
fastMA = ta.wma(close, fastMALength)
slowMA = ta.wma(close, slowMALength)
averageMA = ta.wma(close, averageMALength)
// Calculate ADX manually
dmPlus = high - high[1]
dmMinus = low[1] - low
trueRange = ta.tr
dmPlusSmoothed = ta.wma(dmPlus > 0 and dmPlus > dmMinus ? dmPlus : 0, adxLength)
dmMinusSmoothed = ta.wma(dmMinus > 0 and dmMinus > dmPlus ? dmMinus : 0, adxLength)
trSmoothed = ta.wma(trueRange, adxLength)
diPlus = dmPlusSmoothed / trSmoothed * 100
diMinus = dmMinusSmoothed / trSmoothed * 100
adx = ta.wma(math.abs(diPlus - diMinus) / (diPlus + diMinus) * 100, adxLength)
// Identify potential levels
potentialLongLevel = low < slowMA and close > slowMA
potentialShortLevel = high > slowMA and close < slowMA
// Confirm levels
confirmedLongLevel = potentialLongLevel and close > fastMA
confirmedShortLevel = potentialShortLevel and close < fastMA
// Entry signals
longEntry = confirmedLongLevel and ta.crossover(fastMA, averageMA) and adx > adxThreshold
shortEntry = confirmedShortLevel and ta.crossunder(fastMA, averageMA) and adx > adxThreshold
// Exit signals
longExit = ta.crossunder(close, slowMA)
shortExit = ta.crossover(close, slowMA)
// Plot signals
plotshape(longEntry, title="Long Entry", location=location.belowbar, style=shape.triangleup, size=size.small, color=color.green)
plotshape(shortEntry, title="Short Entry", location=location.abovebar, style=shape.triangledown, size=size.small, color=color.red)
// Plot moving averages and ADX
plot(fastMA, title="Fast MA", color=color.blue)
plot(slowMA, title="Slow MA", color=color.red)
plot(averageMA, title="Average MA", color=color.orange)
// plot(adx, title="ADX", color=color.purple)
// hline(adxThreshold, title="ADX Threshold", color=color.gray, linestyle=hline.style_dashed)
// Execute trades
if longEntry
strategy.entry("Long", strategy.long)
else if longExit
strategy.close("Long")
if shortEntry
strategy.entry("Short", strategy.short)
else if shortExit
strategy.close("Short")