Hull Filter Moving Average Strategi

Penulis:ChaoZhang, Tanggal: 2024-01-04 15:16:34
Tag:

img

Gambaran umum

Strategi ini menggunakan moving average Hull jangka pendek dan jangka panjang untuk menghasilkan dan menyaring sinyal perdagangan. moving average Hull jangka pendek digunakan untuk menghasilkan sinyal, sedangkan moving average Hull jangka panjang digunakan untuk menyaring sinyal. perdagangan hanya dilakukan ketika moving average Hull jangka pendek mengubah arah dan moving average Hull jangka panjang bergerak ke arah yang sama secara keseluruhan.

Strategi ini juga menggunakan indikator ATR untuk secara dinamis mengatur stop loss dan mengambil tingkat keuntungan saat memasuki perdagangan.

Logika Strategi

Rata-rata bergerak jangka pendek Hull menangkap tren harga jangka pendek dan titik balik.

Rata-rata bergerak jangka panjang Hull menentukan tren harga secara keseluruhan.

Perdagangan hanya dilakukan ketika rata-rata bergerak Hull jangka pendek berubah arah, dan arah barunya sejajar dengan arah rata-rata bergerak Hull jangka panjang.

Setelah masuk ke posisi, level stop loss dan take profit ditetapkan berdasarkan nilai indikator ATR. ATR mencerminkan volatilitas pasar dan tingkat risiko. Stop loss ditempatkan di bawah harga terendah sementara target take profit harga tertinggi, dengan kisaran terikat pada pembacaan ATR saat ini.

Analisis Keuntungan

Menggabungkan sinyal jangka pendek dan filter jangka panjang secara efektif mengidentifikasi tren jangka menengah dan titik balik, menghindari sinyal palsu dari kebisingan pasar.

Stop loss dan take profit dinamis berdasarkan ATR menetapkan rentang yang wajar berdasarkan volatilitas saat ini, menyeimbangkan profit taking dan pencegahan kerugian.

Rata-rata bergerak Hull memiliki fleksibilitas dan keakuratan yang lebih baik dibandingkan dengan rata-rata bergerak standar, dengan pelacakan tren yang lebih baik.

Analisis Risiko

Strategi ini bergantung pada persilangan antara rata-rata bergerak Hull untuk menghasilkan sinyal. persilangan palsu dapat mengakibatkan perdagangan yang buruk, yang membutuhkan analisis struktur pasar secara keseluruhan.

Dalam rentang, pasar berbelit-belit dengan harga berosilasi dalam rentang perdagangan, kesalahan sinyal dan perdagangan yang tidak perlu dapat menumpuk.

Stop loss dan take profit ketergantungan pada ATR berarti pembacaan volatilitas yang tidak akurat akan mengakibatkan penempatan yang buruk.

Optimalisasi

Indikator jangka pendek tambahan seperti RSI dapat meningkatkan akurasi sinyal melalui konvergensi.

Logika filter antara rata-rata bergerak Hull dapat ditingkatkan untuk memiliki persyaratan masuk yang lebih ketat, menghindari sinyal palsu.

Penelitian penyesuaian parameter dapat mengungkap peningkatan stabilitas dan profitabilitas dari perubahan panjang rata-rata bergerak, periode ATR, dll.

Ringkasan

Strategi ini menggabungkan generasi sinyal jangka pendek, penyaringan sinyal jangka panjang, dan stop loss / take profit berbasis ATR dalam kerangka kerja tren jangka menengah yang kuat.


/*backtest
start: 2023-12-04 00:00:00
end: 2024-01-03 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Hull Filtered Strategy", overlay=true, pyramiding=0, default_qty_type= strategy.percent_of_equity, default_qty_value = 10, calc_on_order_fills=false, slippage=0,commission_type=strategy.commission.percent,commission_value=0)

// Parameters for Hull Moving Averages
src = input(close, title="Source")
signal_period = input(50, title="Period of signal HMA")
filter_period = input(200, title="Period of filter HMA")

strat_dir_input = input(title="Strategy Direction", defval="all", options=["long", "short", "all"])

// Set allowed trading directions
strat_dir_value = strat_dir_input == "long" ? strategy.direction.long : strat_dir_input == "short" ? strategy.direction.short : strategy.direction.all
strategy.risk.allow_entry_in(strat_dir_value)

// stop loss and take profit
sl_factor = input(2,title="Stop Loss Factor")
tp_factor = input(3,title="Take Profit Factor")
atr_period = input(14, title="ATR Period (SL/TP)")

// Testing Start dates
testStartYear = input(2010, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

//Stop date if you want to use a specific range of dates
testStopYear = input(2030, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)


// -----------------------------------------------------------------------------
// Global variables
// -----------------------------------------------------------------------------
var float tp = na
var float sl = na
var float position = na


// -----------------------------------------------------------------------------
// Functions
// -----------------------------------------------------------------------------
testWindow() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false


// -----------------------------------------------------------------------------
// The engine
// -----------------------------------------------------------------------------
hma_signal = hma(src, signal_period)
hma_filter = hma(src, filter_period)

// Used to determine exits and stop losses
atr_e = atr(atr_period)

// if hma_filter increases hma_trend is set to 1, if it decreases hma_trend is set to -1. If no trend is available, hma_trend is set to ß0
trend = hma_filter > hma_filter[1]  ?  1 : hma_filter < hma_filter[1] ? -1 : 0
signal = hma_signal > hma_signal[1] ? 1 : hma_signal  < hma_signal[1] ? -1 : 0


// -----------------------------------------------------------------------------
// signals
// -----------------------------------------------------------------------------
if signal[0] == 1 and signal[1] != 1 and trend == 1 and testWindow()
    sl := close - sl_factor*atr_e
    tp := close + tp_factor*atr_e
    strategy.entry("HMA_LNG", strategy.long)
    strategy.exit("LE", "HMA_LNG", profit=100*tp_factor*atr_e, loss=100*sl_factor*atr_e)
    
if signal[0] == -1 and signal[1] != -1 and trend == -1 and testWindow()
    sl := close + sl_factor*atr_e
    tp := close - tp_factor*atr_e
    strategy.entry("HMA_SHRT", strategy.short)
    strategy.exit("SE", "HMA_SHRT", profit=100*tp_factor*atr_e, loss=100*sl_factor*atr_e)


if strategy.position_size != 0
    sl := sl[1]
    tp := tp[1]

// -----------------------------------------------------------------------------
// PLOT
// -----------------------------------------------------------------------------
hma_s = plot(hma_signal, title="SIGNAL", color = signal == 1 ? color.green : color.red)
hma_l = plot(hma_filter, title="TREND", color = trend == 1 ? color.green : color.red)

plot(tp, title="TAKE PROFIT", color= strategy.position_size != 0 ? color.blue: na, linewidth=1)  
plot(sl, title="STOP LOSS", color= strategy.position_size != 0 ? color.red: na, linewidth = 1)


Lebih banyak