
Chiến lược này là một chiến lược giao dịch định lượng kết hợp tín hiệu phá vỡ hai đường cong bằng nhau với bộ lọc biến động ATR và sai lệch xu hướng của HMA. Chiến lược sử dụng hai chu kỳ khác nhau để xây dựng tín hiệu giao dịch bằng nhau, kết hợp với bộ lọc ATR của chỉ số biến động để lọc một phần tín hiệu không hiệu quả, sử dụng HMA để đánh giá hướng xu hướng và tránh hoạt động ngược.
Chiến lược sử dụng đường trung bình dài 37 chu kỳ làm đường trung bình chuẩn, tạo ra tín hiệu mua khi giá từ bên dưới đường trung bình phá vỡ lên, tạo ra tín hiệu bán khi giá từ trên phá vỡ xuống. Để lọc tín hiệu báo cáo sai, chiến lược đặt giá vượt qua đường trung bình chuẩn, tiếp tục di chuyển theo cùng một hướng sau khi biến động ATR hơn 2 lần sẽ xác nhận chỉ thị tạo tín hiệu hiệu hiệu quả. Ngoài ra, chiến lược cũng sử dụng HMA dài 11 chu kỳ để xác định hướng xu hướng lớn, chỉ khi giá vượt qua đường trung bình chuẩn HMA cũng hiển thị đồng hướng, sẽ xác nhận chỉ thị tạo ra tín hiệu hiệu quả, tránh thiệt hại do hoạt động ngược lại.
Đối với phương thức thắng, chiến lược hỗ trợ lựa chọn sử dụng một điểm dừng hoặc hai hoặc ba điểm dừng với giá khác nhau. Đối với phương thức thua, chiến lược trực tiếp trên và dưới đường quỹ đạo là điểm dừng dài và ngắn.
So với chiến lược phá vỡ đường đồng nhất đơn lẻ, chiến lược này tăng bộ lọc biến động ATR khi tạo tín hiệu, có thể lọc phần lớn tín hiệu không hiệu quả, điều này rất phù hợp với chiến lược hình dạng đường K về thị giác, do đó có thể đạt được tỷ lệ thắng cao hơn. Đồng thời, tăng HMA đánh giá sai lệch xu hướng, tránh xây dựng vị trí nghịch đảo, có thể giảm đáng kể tổn thất không cần thiết.
Rủi ro lớn nhất của chiến lược này là việc lọc ATR biến động có thể loại bỏ một số tín hiệu hiệu quả, khiến chiến lược không thể đặt hàng kịp thời. Ngoài ra, hiệu quả của HMA trong việc đánh giá xu hướng lớn không rõ ràng, đôi khi giá chỉ là điều chỉnh ngắn hạn chứ không phải là sự đảo ngược xu hướng lớn, điều này có thể dẫn đến mất mát không cần thiết. Để giảm rủi ro trên, bạn có thể giảm các tham số lọc ATR biến động một cách thích hợp, mở rộng phạm vi biến động, để có nhiều tín hiệu hình dạng K được tạo ra thông qua chỉ thị xác minh.
Chiến lược này có thể được tối ưu hóa theo các hướng sau:
Kiểm tra nhiều loại tham số khác nhau để tìm kiếm các tham số tối ưu. Các tham số có thể điều chỉnh như chiều dài đường trung bình chuẩn, chu kỳ ATR, hệ số lọc biến động.
Thêm nhiều chỉ số lọc hoặc chỉ số dao động để đánh giá tình trạng thị trường, tiếp tục nâng cao sức khỏe của chiến lược.
Thiết lập tham số tối ưu hóa cách kiếm lợi nhuận. Thử nghiệm thêm các thiết lập điểm dừng cho các mức số lượng và giá khác nhau.
Kết hợp mô hình học máy để tạo ra tín hiệu giao dịch hiệu quả hơn.
Chiến lược này tích hợp tín hiệu lõi đột phá hai đường ngang, tín hiệu không hiệu quả của bộ lọc biến động ATR, và sử dụng HMA để xác định sai lệch xu hướng lớn để tránh lập vị trí ngược, là một chiến lược giao dịch định lượng rất thực tế. Không gian tối ưu hóa tham số chiến lược lớn, hiệu quả vẫn có chỗ nâng cao, đáng để nghiên cứu và tối ưu hóa hơn nữa.
/*backtest
start: 2023-01-10 00:00:00
end: 2024-01-16 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © sevencampbell
//@version=5
strategy(title="Baseline Cross Qualifier Volatility Strategy with HMA Trend Bias", overlay=true)
// --- User Inputs ---
// Baseline Inputs
baselineLength = input.int(title="Baseline Length", defval=20)
baseline = ta.sma(close, baselineLength)
// PBCQ Inputs
pbcqEnabled = input.bool(title="Post Baseline Cross Qualifier Enabled", defval=true)
pbcqBarsAgo = input.int(title="Post Baseline Cross Qualifier Bars Ago", defval=3)
// Volatility Inputs
atrLength = input.int(title="ATR Length", defval=14)
multiplier = input.float(title="Volatility Multiplier", defval=2.0)
rangeMultiplier = input.float(title="Volatility Range Multiplier", defval=1.0)
qualifierMultiplier = input.float(title="Volatility Qualifier Multiplier", defval=0.5)
// Take Profit Inputs
takeProfitType = input.string(title="Take Profit Type", options=["1 Take Profit", "2 Take Profits", "3 Take Profits"], defval="1 Take Profit")
// HMA Inputs
hmaLength = input.int(title="HMA Length", defval=50)
// --- Calculations ---
// ATR
atr = ta.atr(atrLength)
// Range Calculation
rangeHigh = baseline + rangeMultiplier * atr
rangeLow = baseline - rangeMultiplier * atr
rangeColor = rangeLow <= close and close <= rangeHigh ? color.yellow : na
bgcolor(rangeColor, transp=90)
// Qualifier Calculation
qualifier = qualifierMultiplier * atr
// Dot Calculation
isLong = close > baseline and (close - baseline) >= qualifier and close > ta.hma(close, hmaLength)
isShort = close < baseline and (baseline - close) >= qualifier and close < ta.hma(close, hmaLength)
colorDot = isLong ? color.green : isShort ? color.red : na
plot(isLong or isShort ? baseline : na, color=colorDot, style=plot.style_circles, linewidth=3)
// --- Strategy Logic ---
// PBCQ
pbcqValid = not pbcqEnabled or low[pbcqBarsAgo] > baseline
// Entry Logic
longCondition = isLong and pbcqValid
shortCondition = isShort and pbcqValid
if (longCondition)
strategy.entry("Long", strategy.long)
if (shortCondition)
strategy.entry("Short", strategy.short)
// Exit Logic
if (takeProfitType == "1 Take Profit")
strategy.exit("TP/SL", "Long", limit=rangeHigh, stop=rangeLow)
strategy.exit("TP/SL", "Short", limit=rangeLow, stop=rangeHigh)
else if (takeProfitType == "2 Take Profits")
strategy.exit("TP1", "Long", qty=strategy.position_size * 0.5, limit=rangeHigh / 2)
strategy.exit("TP2", "Long", qty=strategy.position_size * 0.5, limit=rangeHigh)
strategy.exit("TP1", "Short", qty=strategy.position_size * 0.5, limit=rangeLow / 2)
strategy.exit("TP2", "Short", qty=strategy.position_size * 0.5, limit=rangeLow)
else if (takeProfitType == "3 Take Profits")
strategy.exit("TP1", "Long", qty=strategy.position_size * 0.5, limit=rangeHigh / 2)
strategy.exit("TP2", "Long", qty=strategy.position_size * 0.25, limit=rangeHigh * 0.75)
strategy.exit("TP3", "Long", qty=strategy.position_size * 0.25, limit=rangeHigh * 1.5)