Penanda Cross Baseline ATR Volatility & HMA Trend Bias Mean Reversion Strategy

Penulis:ChaoZhang, Tarikh: 2024-01-17 16:37:23
Tag:

img

Ringkasan

Strategi ini mengintegrasikan isyarat pembalikan purata asas, penapis turun naik ATR, dan penapis trend HMA untuk menghasilkan isyarat perdagangan yang kukuh untuk strategi perdagangan kuantitatif. Ia menggunakan dua purata bergerak dengan tempoh yang berbeza untuk membina isyarat perdagangan, menggabungkan penunjuk turun naik ATR untuk menapis beberapa isyarat yang tidak sah, dan menggunakan HMA untuk menentukan arah trend utama untuk mengelakkan pemilihan yang tidak baik.

Logika Strategi

Strategi ini menggunakan purata bergerak 37-periode sebagai garis asas. Apabila harga pecah ke atas dari garis asas ini, ia menghasilkan isyarat beli, dan apabila ia pecah dari atas, ia menghasilkan isyarat jual. Untuk mengelakkan isyarat palsu, strategi ini memerlukan harga untuk bergerak di luar turun naik 2xATR selepas menembusi garis asas untuk mengesahkan kesahihan isyarat. Juga, strategi ini menggunakan HMA 11-periode untuk menilai trend utama. Ia hanya mengesahkan isyarat yang sah apabila garis asas penetrasi harga sejajar dengan arah HMA untuk mengelakkan pemilihan yang tidak baik.

Untuk mengambil keuntungan, strategi ini menyokong menggunakan satu atau beberapa (dua atau tiga) mengambil tahap keuntungan. untuk stop loss, ia hanya mengambil garis band atas dan bawah sebagai SL untuk kedudukan panjang dan pendek.

Analisis Kelebihan

Berbanding dengan strategi breakout purata bergerak yang mudah, strategi ini menambah penapis turun naik ATR yang menghilangkan banyak isyarat yang tidak sah. Ini selaras dengan baik dengan teknik breakout corak visual, sehingga membawa kepada kadar kemenangan yang lebih tinggi.

Risiko & Penyelesaian

Risiko utama adalah penapis turun naik ATR boleh membuang beberapa isyarat yang sah, menyebabkan kegagalan untuk membuka kedudukan tepat pada masanya. Juga, penghakiman trend HMA tidak begitu signifikan kadang-kadang apabila harga hanya mengalami retracement jangka pendek, bukan pembalikan. Ini boleh menyebabkan stop loss yang tidak perlu. Untuk mengurangkan risiko, kita boleh menurunkan parameter penapis turun naik ATR untuk membenarkan lebih banyak isyarat. Kita juga boleh menyesuaikan parameter tempoh HMA untuk menggunakan HMA jangka panjang untuk menilai trend utama, mencegah gangguan dari turun naik jangka pendek.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan dalam aspek berikut:

  1. Uji lebih banyak kombinasi parameter untuk mencari set nilai yang optimum, contohnya, tempoh asas, tempoh ATR, pekali turun naik dll.

  2. Tambah lebih banyak penapis atau pengayun untuk menilai keadaan pasaran untuk meningkatkan ketahanan model.

  3. Mengoptimumkan parameter untuk mekanisme mengambil keuntungan, menguji lebih banyak tahap harga dan skim peruntukan.

  4. Menggabungkan model pembelajaran mesin untuk menjana isyarat perdagangan yang lebih berkesan.

Kesimpulan

Strategi ini mengintegrasikan isyarat asas purata bergerak berganda, penapis turun naik ATR dan penapis bias trend HMA ke dalam sistem perdagangan kuantitatif yang sangat praktikal.


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


Lebih lanjut