Strategi Dagangan Trend Berdasarkan Purata Bergerak Dinamik

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

img

Ringkasan

Strategi ini menghasilkan isyarat perdagangan berdasarkan purata bergerak dinamik untuk pergi lama apabila harga saham naik dan menutup kedudukan apabila harga jatuh. Dengan menggabungkan kelebihan penunjuk momentum dan purata bergerak, ia bertujuan untuk mengesan trend harga jangka sederhana untuk keuntungan yang stabil.

Prinsip

Strategi ini terutamanya bergantung kepada tiga varian Hull Moving Average (HMA) HMA biasa, HMA Bertimbang (WHMA) dan HMA Eksponensial (EHMA).

Rumus untuk HMA ialah:

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

Di mana WMA adalah Purata Bergerak Bertimbang dan n adalah parameter tempoh.

Rumus WHMA dan EHMA adalah sama. HMA dipilih sebagai pilihan lalai.

Selepas mengira HMA, strategi menggunakan nilai midline HMA sebagai isyarat perdagangan. Ia pergi lama apabila harga melintasi di atas midline HMA dan menutup kedudukan apabila harga jatuh di bawah garis. Oleh itu, ia mengesan trend jangka sederhana menggunakan midline HMA untuk keuntungan.

Kelebihan

Berbanding dengan strategi MA tradisional, strategi ini mempunyai kelebihan berikut:

  1. Tanggapan yang lebih cepat dan keupayaan trend yang lebih kuat untuk kemasukan dan hentian tepat pada masanya
  2. Mengurangkan kekerapan perdagangan yang tidak perlu, mengelakkan mengejar lonjakan dan berhenti
  3. Parameter HMA yang fleksibel untuk menyesuaikan diri dengan lebih banyak persekitaran pasaran
  4. Varian HMA yang boleh ditukar untuk memperluaskan penerapan

Risiko

Terdapat juga beberapa risiko:

  1. Menghasilkan banyak isyarat palsu semasa pasaran terhad julat, meningkatkan kekerapan perdagangan dan kos seluncur
  2. Kelemahan titik pembalikan trend jika parameter HMA tidak ditetapkan dengan betul, yang membawa kepada risiko kerugian yang lebih tinggi
  3. Risiko kecairan dan pergeseran besar apabila berdagang stok kecairan rendah

Penyelesaian:

  1. Mengoptimumkan parameter HMA untuk nilai terbaik
  2. Tambah penunjuk lain untuk menentukan titik pembalikan trend
  3. Pilih stok cair dengan jumlah harian purata yang besar

Peningkatan

Strategi ini juga boleh ditingkatkan dari aspek berikut:

  1. Tambah jumlah atau penapis lain untuk memastikan kebolehpercayaan isyarat
  2. Gabungkan MACD, KDJ untuk masa yang lebih baik, meningkatkan kadar kemenangan
  3. Penyesuaian tempoh HMA berdasarkan backtest perdagangan sebenar
  4. Bertukar kepada WHMA atau EHMA yang mempunyai prestasi terbaik untuk stok tertentu
  5. Tambahkan mekanisme stop loss untuk mengawal kerugian perdagangan tunggal

Ringkasan

Strategi perdagangan MA yang dinamik mengintegrasikan tindak balas cepat HMA untuk mengesan trend harga jangka sederhana dengan berkesan. Dengan membuka kedudukan panjang pada masa yang sesuai dan berhenti penutupan, ia telah menunjukkan hasil backtest yang baik. Penambahbaikan lanjut dalam penyesuaian parameter dan penapisan stok akan membawa kepada pulangan yang lebih stabil. Ini adalah strategi kuantitatif yang mudah dilaksanakan, yang boleh dikawal 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 lanjut