Hull Filter Moving Average Strategi

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

img

Ringkasan

Strategi ini menggunakan purata bergerak Hull jangka pendek dan jangka panjang untuk menjana dan menapis isyarat perdagangan. purata bergerak Hull jangka pendek digunakan untuk menjana isyarat, sementara purata bergerak Hull jangka panjang digunakan untuk menapis isyarat. Perdagangan hanya diambil apabila purata bergerak Hull jangka pendek mengubah arah dan purata bergerak Hull jangka panjang bergerak ke arah yang sama secara keseluruhan.

Strategi ini juga menggunakan penunjuk ATR untuk menetapkan stop loss secara dinamik dan mengambil tahap keuntungan apabila memasuki perdagangan.

Logika Strategi

Purata bergerak jangka pendek Hull menangkap trend harga jangka pendek dan titik perubahan.

Purata bergerak jangka panjang Hull menentukan trend harga keseluruhan.

Perdagangan hanya diambil apabila purata bergerak jangka pendek Hull bertukar arah, dan arah barunya sejajar dengan arah purata bergerak jangka panjang Hull. Ini menapis isyarat yang bertentangan dengan trend keseluruhan dan mungkin hanya bunyi pasaran jangka pendek.

Selepas memasuki kedudukan, tahap stop loss dan take profit ditetapkan berdasarkan nilai penunjuk ATR. ATR mencerminkan turun naik pasaran dan tahap risiko. Stop loss diletakkan di bawah harga terendah sementara mengambil keuntungan sasaran harga tinggi, dengan julat terikat dengan bacaan ATR semasa.

Analisis Kelebihan

Menggabungkan isyarat jangka pendek dan penapis jangka panjang secara berkesan mengenal pasti trend jangka menengah dan titik perubahan, mengelakkan isyarat palsu dari bunyi pasaran.

Stop loss dinamik dan mengambil keuntungan berdasarkan ATR menetapkan julat yang munasabah berdasarkan turun naik semasa, menyeimbangkan pengambilan keuntungan dan pencegahan kerugian.

Purata bergerak Hull mempunyai kelebihan fleksibiliti dan ketepatan berbanding purata bergerak standard, dengan penjejakan trend yang lebih baik.

Analisis Risiko

Strategi ini bergantung pada persilangan antara purata bergerak Hull untuk menjana isyarat. persilangan palsu boleh mengakibatkan perdagangan yang buruk, yang memerlukan analisis struktur pasaran secara keseluruhan.

Dalam julat, pasaran yang berbelit-belit dengan harga berayun dalam julat dagangan, kesilapan isyarat dan perdagangan yang tidak perlu boleh menumpuk. Ini dapat dielakkan dengan menapis isyarat dengan keadaan yang lebih luas semasa pasaran tersebut.

Stop loss dan mengambil keuntungan bergantung pada ATR bermakna bacaan turun naik yang tidak tepat akan mengakibatkan penempatan yang buruk.

Pengoptimuman

Penunjuk jangka pendek tambahan seperti RSI boleh meningkatkan ketepatan isyarat melalui konvergensi.

Logik penapis antara purata bergerak Hull boleh ditingkatkan untuk mempunyai keperluan kemasukan yang lebih ketat, mengelakkan isyarat palsu.

Penyelidikan penyesuaian parameter boleh mendedahkan peningkatan kestabilan dan keuntungan daripada perubahan panjang purata bergerak, tempoh ATR, dll.

Ringkasan

Strategi ini menggabungkan penjanaan isyarat jangka pendek, penapisan isyarat jangka panjang, dan Stop Loss / Take Profit berasaskan ATR dalam rangka trend jangka menengah yang kukuh. Ia mampu mengenal pasti titik perubahan jangka menengah sambil menapis bunyi bising jangka pendek. Dengan pengoptimuman parameter dan penapis tambahan, ia dapat mencapai prestasi yang lebih baik.


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