Strategi Trading Trend Berdasarkan Moving Average Dinamis

Penulis:ChaoZhang, Tanggal: 2023-12-21 11:33:50
Tag:

img

Gambaran umum

Strategi ini menghasilkan sinyal perdagangan berdasarkan rata-rata bergerak dinamis untuk pergi panjang ketika harga saham naik dan menutup posisi ketika harga turun. Dengan menggabungkan keuntungan dari indikator momentum dan rata-rata bergerak, itu bertujuan untuk melacak tren harga jangka menengah untuk keuntungan yang stabil.

Prinsip

Strategi ini terutama didasarkan pada tiga varian Hull Moving Average (HMA) HMA biasa, HMA Tertimbang (WHMA) dan HMA Eksponensial (EHMA).

Rumus untuk HMA adalah:

HMA = WMA(2*WMA(dekat, n/2)-WMA(dekat, n), sqrt(n))

Di mana WMA adalah Rata-rata Bergerak Bertimbang dan n adalah parameter periode.

Rumus untuk WHMA dan EHMA mirip.

Setelah menghitung HMA, strategi ini menggunakan nilai midline HMA sebagai sinyal perdagangan. Ini pergi panjang ketika harga melintasi di atas midline HMA dan menutup posisi ketika harga jatuh di bawah garis. Dengan demikian, strategi ini melacak tren jangka menengah menggunakan midline HMA untuk keuntungan.

Keuntungan

Dibandingkan dengan strategi MA tradisional, strategi ini memiliki keunggulan berikut:

  1. Tanggapan yang lebih cepat dan kemampuan mengikuti tren yang lebih kuat untuk entri dan pemberhentian tepat waktu
  2. Mengurangi frekuensi perdagangan yang tidak perlu, menghindari mengejar lonjakan dan berhenti
  3. Parameter HMA yang fleksibel untuk beradaptasi dengan lebih banyak lingkungan pasar
  4. Varian HMA yang dapat diubah untuk memperluas penerapan

Risiko

Ada juga beberapa risiko:

  1. Membuat beberapa sinyal palsu selama pasar yang terikat rentang, meningkatkan frekuensi perdagangan dan biaya slippage
  2. Kurangnya titik pembalikan tren jika parameter HMA tidak ditetapkan dengan benar, yang mengarah pada risiko kerugian yang lebih besar
  3. Risiko likuiditas dan slippage besar ketika perdagangan saham likuiditas rendah

Solusi:

  1. Mengoptimalkan parameter HMA untuk nilai terbaik
  2. Tambahkan indikator lain untuk menentukan titik pembalikan tren
  3. Pilih saham likuid dengan volume harian rata-rata yang besar

Peningkatan

Strategi ini juga dapat ditingkatkan dari aspek berikut:

  1. Tambahkan volume atau filter lain untuk memastikan keandalan sinyal
  2. Gabungkan MACD, KDJ untuk waktu yang lebih baik, meningkatkan tingkat kemenangan
  3. Sesuaikan periode HMA berdasarkan backtest perdagangan riil
  4. Pindah ke WHMA atau EHMA yang memiliki kinerja terbaik untuk stok tertentu
  5. Menambahkan mekanisme stop loss untuk mengendalikan kerugian perdagangan tunggal

Ringkasan

Strategi perdagangan MA yang dinamis mengintegrasikan respon cepat dari HMA untuk melacak tren harga jangka menengah secara efektif. Dengan membuka posisi panjang pada waktu yang tepat dan menghentikan penutupan, telah menunjukkan hasil backtest yang baik. Perbaikan lebih lanjut dalam penyesuaian parameter dan penyaringan saham akan mengarah pada pengembalian kelebihan yang lebih stabil. Ini adalah strategi kuantitatif yang mudah diimplementasikan dan dapat dikontrol risiko.


/*backtest
start: 2022-12-14 00:00:00
end: 2023-12-20 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy('Position Investing by SirSeff', overlay=true, pyramiding=1, default_qty_type=strategy.percent_of_equity, default_qty_value=100, calc_on_order_fills=false, slippage=0, commission_type=strategy.commission.percent, commission_value=0)
strat_dir_input = input.string(title='Strategy Direction', defval='long', options=['long', 'short', 'all'])
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)
//////////////////////////////////////////////////////////////////////
// Testing Start dates
testStartYear = input(2000, '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(30, 'Backtest Stop Day')
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)


testPeriod() => true
// Component Code Stop
//////////////////////////////////////////////////////////////////////
//INPUT
src = input(close, title='Source')
modeSwitch = input.string('Hma', title='Hull Variation', options=['Hma', 'Thma', 'Ehma'])
length = input(55, title='Length(180-200 for floating S/R , 55 for swing entry)')
switchColor = input(true, 'Color Hull according to trend?')
candleCol = input(false, title='Color candles based on Hull\'s Trend?')
visualSwitch = input(true, title='Show as a Band?')
thicknesSwitch = input(1, title='Line Thickness')
transpSwitch = input.int(40, title='Band Transparency', step=5)

//FUNCTIONS
//HMA
HMA(_src, _length) =>
    ta.wma(2 * ta.wma(_src, _length / 2) - ta.wma(_src, _length), math.round(math.sqrt(_length)))
//EHMA    
EHMA(_src, _length) =>
    ta.ema(2 * ta.ema(_src, _length / 2) - ta.ema(_src, _length), math.round(math.sqrt(_length)))
//THMA    
THMA(_src, _length) =>
    ta.wma(ta.wma(_src, _length / 3) * 3 - ta.wma(_src, _length / 2) - ta.wma(_src, _length), _length)

//SWITCH
Mode(modeSwitch, src, len) =>
    modeSwitch == 'Hma' ? HMA(src, len) : modeSwitch == 'Ehma' ? EHMA(src, len) : modeSwitch == 'Thma' ? THMA(src, len / 2) : na

//OUT
HULL = Mode(modeSwitch, src, length)
MHULL = HULL[0]
SHULL = HULL[2]

//COLOR
hullColor = switchColor ? HULL > HULL[2] ? #00ff00 : #ff0000 : #ff9800

//PLOT
///< Frame
Fi1 = plot(MHULL, title='MHULL', color=hullColor, linewidth=thicknesSwitch, transp=50)
Fi2 = plot(visualSwitch ? SHULL : na, title='SHULL', color=hullColor, linewidth=thicknesSwitch, transp=50)
///< Ending Filler
fill(Fi1, Fi2, title='Band Filler', color=hullColor, transp=transpSwitch)
///BARCOLOR
barcolor(color=candleCol ? switchColor ? hullColor : na : na)


if HULL[0] > HULL[2] and testPeriod()
    strategy.entry('Invest', strategy.long)
if HULL[0] < HULL[2] and testPeriod()
    strategy.entry('Pause', strategy.short)



Lebih banyak