
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. Hệ thống xác định tình trạng thị trường động thông qua chỉ số ADX, sử dụng các chiến lược giao dịch khác nhau trong thị trường xu hướng và thị trường chấn động. Trong thị trường xu hướng, chiến lược sử dụng tín hiệu chéo đường trung bình di chuyển kết hợp với xác nhận RSI và MACD; trong thị trường chấn động, chiến lược sử dụng phá vỡ băng tròn kết hợp với tín hiệu mua bán quá mức RSI để giao dịch. Hệ thống cũng tích hợp cơ chế dừng lỗ động dựa trên ATR, kiểm soát rủi ro hiệu quả.
Trung tâm của chiến lược là cơ chế nhận dạng trạng thái thị trường. Chiến lược theo dõi xu hướng được kích hoạt khi ADX lớn hơn 25 được xác định là thị trường xu hướng:
Khi ADX nhỏ hơn hoặc bằng 25 được xác định là thị trường chấn động, hãy kích hoạt chiến lược giao dịch trong khoảng thời gian:
Cài đặt dừng lỗ sử dụng phương thức nhân động của ATR, dừng lỗ là 1,5 lần ATR và dừng lỗ là 3 lần ATR.
Chiến lược này được thực hiện thông qua việc xác định động trạng thái thị trường và chuyển đổi chiến lược tương ứng, điều chỉnh cho các môi trường thị trường khác nhau. Chiến lược có tính thực tế tốt thông qua sự kết hợp của nhiều chỉ số kỹ thuật và cơ chế kiểm soát rủi ro động. Tuy nhiên, vẫn cần chú ý đến các rủi ro như trễ tín hiệu và đột phá giả, nên thử nghiệm đầy đủ và tối ưu hóa tham số trong thực tế.
/*backtest
start: 2024-09-01 00:00:00
end: 2025-02-19 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Binance","currency":"ETH_USDT"}]
*/
//@version=6
strategy("Trend vs Range Trading - Fully Fixed for v6", overlay=true)
// 🔹 Moving Averages (SMA 50 & 200)
sma50 = ta.sma(close, 50)
sma200 = ta.sma(close, 200)
// 🔹 Proper ADX Calculation (With Corrected ta.dmi() Parameters)
dmiLength = 14
adxSmoothing = 14
[dmiPlus, dmiMinus, adx] = ta.dmi(dmiLength, adxSmoothing)
// 🔹 Bollinger Bands Calculation (Fixed for v6)
bb_length = 20
bb_mult = 2.0
bb_basis = ta.sma(close, bb_length)
bb_dev = ta.stdev(close, bb_length)
bb_upper = bb_basis + (bb_mult * bb_dev)
bb_lower = bb_basis - (bb_mult * bb_dev)
// 🔹 Additional Indicators (RSI & MACD)
rsi = ta.rsi(close, 14)
[macdLine, signalLine, _] = ta.macd(close, 12, 26, 9)
// 🔹 ATR for Stop Loss & Take Profit
atr = ta.atr(14)
stop_loss_mult = 1.5 // Stop Loss Multiplier
take_profit_mult = 3.0 // Take Profit Multiplier
// 🔹 Trend vs Range Market Detection
is_trending = adx > 25
// 🔹 Trend Following Strategy (SMA Cross & Confirmation)
long_condition_trend = is_trending and ta.crossover(sma50, sma200) and rsi > 50 and macdLine > signalLine
short_condition_trend = is_trending and ta.crossunder(sma50, sma200) and rsi < 50 and macdLine < signalLine
// 🔹 Range Trading Strategy (Bollinger Bands & RSI Confirmation)
long_condition_range = not is_trending and ta.crossover(close, bb_lower) and rsi < 40
short_condition_range = not is_trending and ta.crossunder(close, bb_upper) and rsi > 60
// 🔹 Stop Loss & Take Profit Calculations
long_stop_loss = close - (atr * stop_loss_mult)
long_take_profit = close + (atr * take_profit_mult)
short_stop_loss = close + (atr * stop_loss_mult)
short_take_profit = close - (atr * take_profit_mult)
// 🔹 Execute Trades (With Stop Loss & Take Profit)
if long_condition_trend
strategy.entry("Long_Trend", strategy.long)
strategy.exit("Exit_Long_Trend", from_entry="Long_Trend", stop=long_stop_loss, limit=long_take_profit)
if short_condition_trend
strategy.entry("Short_Trend", strategy.short)
strategy.exit("Exit_Short_Trend", from_entry="Short_Trend", stop=short_stop_loss, limit=short_take_profit)
if long_condition_range
strategy.entry("Long_Range", strategy.long)
strategy.exit("Exit_Long_Range", from_entry="Long_Range", stop=long_stop_loss, limit=long_take_profit)
if short_condition_range
strategy.entry("Short_Range", strategy.short)
strategy.exit("Exit_Short_Range", from_entry="Short_Range", stop=short_stop_loss, limit=short_take_profit)
// 🔹 Visual Indicators & Background Color (Trend vs Range)
bgcolor(is_trending ? color.green : color.blue)
// 🔹 Plot Moving Averages & Bollinger Bands
plot(sma50, color=color.blue, title="SMA 50")
plot(sma200, color=color.red, title="SMA 200")
plot(bb_upper, color=color.green, title="BB Upper")
plot(bb_lower, color=color.orange, title="BB Lower")