Đơn vị xác định chéo đường cơ sở ATR Volatility & HMA Trend Bias Mean Reversal Strategy

Tác giả:ChaoZhang, Ngày: 2024-01-17 16:37:23
Tags:

img

Tổng quan

Chiến lược này tích hợp tín hiệu đảo ngược trung bình đường cơ sở, bộ lọc biến động ATR và bộ lọc xu hướng HMA để tạo ra các tín hiệu giao dịch mạnh mẽ cho các chiến lược giao dịch định lượng. Nó sử dụng hai đường trung bình động với các khoảng thời gian khác nhau để xây dựng tín hiệu giao dịch, kết hợp chỉ số biến động ATR để lọc ra một số tín hiệu không hợp lệ và sử dụng HMA để xác định hướng xu hướng chính để tránh lựa chọn bất lợi.

Chiến lược logic

Chiến lược này sử dụng trung bình động 37 giai đoạn như đường cơ bản. Khi giá vượt qua đường cơ bản này, nó tạo ra tín hiệu mua, và khi nó phá vỡ từ trên, nó tạo ra tín hiệu bán. Để tránh các tín hiệu sai, chiến lược đòi hỏi giá phải vượt quá sự biến động 2xATR sau khi xâm nhập đường cơ bản để xác nhận tính hợp lệ của tín hiệu. Ngoài ra, chiến lược sử dụng HMA 11 giai đoạn để đánh giá xu hướng chính. Nó chỉ xác nhận các tín hiệu hợp lệ khi đường cơ bản xâm nhập giá phù hợp với hướng HMA để ngăn ngừa lựa chọn bất lợi.

Đối với việc lấy lợi nhuận, chiến lược hỗ trợ sử dụng một hoặc nhiều (hai hoặc ba) mức lấy lợi nhuận. Đối với dừng lỗ, nó chỉ đơn giản là lấy đường băng trên và dưới như SL cho các vị trí dài và ngắn.

Phân tích lợi thế

So với các chiến lược đột phá trung bình động đơn giản, chiến lược này thêm bộ lọc biến động ATR loại bỏ rất nhiều tín hiệu không hợp lệ. Điều này phù hợp rất tốt với các kỹ thuật đột phá mô hình trực quan, do đó dẫn đến tỷ lệ thắng cao hơn. Ngoài ra, khuynh hướng xu hướng HMA ngăn ngừa lựa chọn bất lợi và giảm đáng kể tổn thất không cần thiết. Kế hoạch nhiều lợi nhuận cũng cho phép khóa nhiều lợi nhuận hơn.

Rủi ro và giải pháp

Rủi ro chính là bộ lọc biến động ATR có thể loại bỏ một số tín hiệu hợp lệ, gây ra sự thất bại trong việc mở các vị trí kịp thời. Ngoài ra, phán quyết xu hướng HMA đôi khi không rất quan trọng khi giá chỉ có một sự thoái lui ngắn hạn, không đảo ngược. Điều này có thể dẫn đến dừng lỗ không cần thiết. Để giảm rủi ro, chúng ta có thể giảm tham số bộ lọc biến động ATR để cho phép nhiều tín hiệu hơn. Chúng ta cũng có thể điều chỉnh tham số thời gian HMA để sử dụng HMA dài hạn để đánh giá các xu hướng chính, ngăn chặn sự can thiệp từ biến động ngắn hạn.

Hướng dẫn tối ưu hóa

Chiến lược có thể được tối ưu hóa trong các khía cạnh sau:

  1. Kiểm tra nhiều kết hợp tham số hơn để tìm ra tập hợp các giá trị tối ưu, ví dụ: thời gian cơ bản, thời gian ATR, hệ số biến động v.v.

  2. Thêm nhiều bộ lọc hoặc dao động để đánh giá điều kiện thị trường để tăng độ bền của mô hình.

  3. Tối ưu hóa các tham số cho các cơ chế lấy lợi nhuận, thử nghiệm nhiều mức giá và các chương trình phân bổ hơn.

  4. Kết hợp các mô hình học máy để tạo ra các tín hiệu giao dịch hiệu quả hơn.

Kết luận

Chiến lược này tích hợp tín hiệu đường cơ sở trung bình động kép, bộ lọc biến động ATR và bộ lọc thiên vị xu hướng HMA vào một hệ thống giao dịch định lượng rất thực tế. Mặc dù nó vẫn có không gian để tăng hiệu suất thông qua điều chỉnh tham số, nhưng nó đã phục vụ tốt cho giao dịch dựa trên quy tắc có kỷ luật.


/*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)


Thêm nữa