Strategi Dual Purata Bergerak Dinamik

Penulis:ChaoZhang, Tarikh: 2023-12-13 16:37:05
Tag:

img

Ringkasan

Strategi ini menggunakan kemiringan purata bergerak (MA) dan kemiringan penunjuk momentum untuk keputusan perdagangan. Ia membandingkan kemiringan MA dan kemiringan momentum dengan ambang yang ditetapkan, dan menghasilkan isyarat perdagangan apabila kedua-dua kemiringan melebihi ambang. Strategi ini juga mengandungi penapis turun naik rendah yang menggunakan MA yang berbeza untuk menghasilkan isyarat apabila turun naik pasaran rendah.

Logika Strategi

Inti strategi ini terletak pada membandingkan dua lengkung kemiringan. Pertama, ia mengira kemiringan penunjuk MA dan momentum. Kemiringan mencerminkan kadar perubahan dan arah lengkung. Kemudian dua ambang digunakan, apabila kedua-dua kemiringan MA dan kemiringan momentum melebihi ambang yang sepadan, isyarat perdagangan dihasilkan.

Sebagai contoh, apabila kedua-dua kemiringan MA dan kemiringan momentum melebihi garis atas, isyarat beli dihasilkan; apabila kedua-dua kurva jatuh di bawah garis bawah, isyarat jual dihasilkan. Ini boleh menapis beberapa isyarat palsu.

Penapis turun naik rendah menggunakan MA jangka panjang untuk menentukan turun naik pasaran. Apabila turun naik rendah, MA dengan parameter yang berbeza digunakan untuk menjana isyarat perdagangan untuk menyesuaikan diri dengan keadaan pasaran yang berbeza.

Analisis Kelebihan

Strategi ini mempunyai kelebihan berikut:

  1. Penapis berganda untuk menyediakan isyarat perdagangan boleh menapis beberapa bunyi bising dan meningkatkan kualiti isyarat.

  2. Penapis turun naik yang rendah membolehkan strategi menyesuaikan diri dengan keadaan pasaran yang berbeza dengan kelenturan.

  3. Keupayaan yang tinggi untuk parameter yang berbeza boleh dioptimumkan untuk produk yang berbeza.

  4. Ia tidak mengandungi fungsi cat semula untuk mengurangkan kesan dari pemasangan lengkung.

Analisis Risiko

Strategi ini juga mempunyai beberapa risiko:

  1. Penapis berganda boleh menapis beberapa isyarat sebenar dan terlepas peluang. Ini boleh dioptimumkan dengan menyesuaikan parameter.

  2. Penentuan ambang penapis volatiliti rendah memerlukan ujian yang teliti. tetapan yang tidak betul boleh menyebabkan penyimpangan isyarat.

  3. Tetapan parameter untuk MA dan penunjuk momentum perlu dioptimumkan untuk produk tertentu, dan parameter sejagat sukar ditentukan.

  4. Fungsi tanpa cat semula tidak dapat sepenuhnya mengelakkan masalah pemasangan kurva backtest, dan prestasi perdagangan sebenar masih perlu disahkan.

  5. Keupayaan yang tinggi meningkatkan kerumitan ruang parameter dan kesukaran pengoptimuman.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan ke arah berikut:

  1. Uji lebih banyak gabungan penunjuk MA dan momentum untuk mencari penunjuk yang paling sesuai.

  2. Mengoptimumkan parameter panjang MA dan penunjuk momentum untuk mengimbangi kelewatan dan bunyi bising.

  3. Mengoptimumkan parameter untuk mengira cerun untuk mencari kombinasi penunjuk yang lebih stabil.

  4. Uji penunjuk dan parameter volatiliti rendah yang berbeza untuk meningkatkan keanjalan.

  5. Uji pada produk dan jangka masa yang berbeza untuk mencari skop yang paling sesuai.

  6. Membina mekanisme penyesuaian parameter untuk mengurangkan beban kerja pengoptimuman manual.

Kesimpulan

Ini adalah strategi MA berganda yang sangat fleksibel dan boleh disesuaikan. Ia merujuk kedua-dua maklumat harga dan momentum untuk membuat keputusan, yang dapat menapis isyarat palsu dengan berkesan. Penapis turun naik yang rendah juga menjadikan strategi lebih elastik untuk menyesuaikan diri dengan perubahan pasaran.

Dengan peningkatan dalam pengoptimuman parameter dan pemilihan penunjuk, strategi ini boleh menjadi pilihan yang layak untuk perdagangan kehidupan sebenar.


/*backtest
start: 2023-11-12 00:00:00
end: 2023-12-12 00:00:00
period: 1h
basePeriod: 15m
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/
// © Allenlk
//@version=4
strategy("DRSI DMA Scalping Strategy", shorttitle="DRSIDMA", overlay=false, initial_capital=1000, pyramiding=2, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

//Inputs
matype             = input(7, minval=1, maxval=8, title="1=SMA, 2=EMA, 3=WMA, 4=HullMA, 5=VWMA, 6=RMA, 7=TEMA, 8=Tilson T3", group="Moving Average")
masrc              = input(close, title="MA Source", group="Moving Average")
malen              = input(5, title="Moving Average Length - LookBack Period", group="Moving Average")
factorT3           = input(defval=7, title="Tilson T3 Factor - *.10 - so 7 = .7 etc.", minval=0, group="Moving Average")
maderiv            = input(3, title="MA Slope Lookback", minval=1, group="Moving Average")
masmooth           = input(5, title="MA Slope Smoothing", minval=1, group="Moving Average")
momtype            = input(3, minval=1, maxval=3, title="1=RSI, 2=CCI, 3=RSI/ROC", group="Momentum Moving Average")
momsrc             = input(close, title="Momentum Source", group="Momentum Moving Average")
momlen             = input(3, title="Momentum Length", minval=1, group="Momentum Moving Average")
momderiv           = input(8, title="Momentum Slope Lookback", minval=1, group="Momentum Moving Average")
momsmooth          = input(7, title="Momentum Slope Smoothing", minval=1, group="Momentum Moving Average")
higherTf           = input("1", title="Higher timeframe?", type = input.resolution, group="Time Resolution")
higherTfmult       = input(130, title="MA Slope multiplier for Alternate Resolutions (Make the waves of the blue line similar size as the orange line)", group="Time Resolution")
buffup             = input(0.02, title="Buy when both slopes cross this line", step=0.01, group="Buy and Sell Threshold")
bufflow            = input(-0.03, title="Sell when both slopes cross this line", step=0.01, group="Buy and Sell Threshold")
lowVolMALength     = input(28, title="Big MA Length", minval=1, group="Low Volatility Function")
MAlength           = input(10, title="Low Volatility Moving Average Length", minval=1, group="Low Volatility Function")
MAThresh           = input(0.05, title="Low Volatility Buy and Sell Threshold", step=0.01, group="Low Volatility Function")
Volminimum         = input(2.5, title="Minimum volatility to trade", minval=0, step=0.01, group="Low Volatility Function")

//Low Volatility Function
//When Volatility is low refer to the slope of a long moving average
low_vol_MA         = sma(close, lowVolMALength)
low_vol_down       = (low_vol_MA[3] - low_vol_MA[1]) > MAThresh
low_vol_up         = (low_vol_MA[3] - low_vol_MA[1]) < MAThresh * -1
percent_volatility = (1 - (low / high)) * 100
chng_MA            = sma(percent_volatility, MAlength)
bad_vol            = chng_MA < Volminimum

//No repaint function
nrp_funct(_symbol, _res, _src) => security(_symbol, _res, _src[barstate.isrealtime ? 1 : 0])

//hull ma definition
hullma = wma(2*wma(masrc, malen/2)-wma(masrc, malen), round(sqrt(malen)))

//TEMA definition
ema1 = ema(masrc, malen)
ema2 = ema(ema1, malen)
ema3 = ema(ema2, malen)
tema = 3 * (ema1 - ema2) + ema3

//Tilson T3
factor = factorT3 *.10
gd(masrc, malen, factor) => ema(masrc, malen) * (1 + factor) - ema(ema(masrc, malen), malen) * factor 
t3(masrc, malen, factor) => gd(gd(gd(masrc, malen, factor), malen, factor), malen, factor) 
tilT3 = t3(masrc, malen, factor) 
 
//MA Type 
avg = matype == 1 ? sma(masrc,malen) : matype == 2 ? ema(masrc,malen) : matype == 3 ? wma(masrc,malen) : matype == 4 ? hullma : matype == 5 ? vwma(masrc, malen) : matype == 6 ? rma(masrc,malen) : matype == 7 ? 3 * (ema1 - ema2) + ema3 : tilT3

//MA Slope Percentage
DeltaAvg      = (avg / avg[maderiv]) - 1
SmoothedAvg   = sma(DeltaAvg, masmooth) 
MAout         = nrp_funct(syminfo.tickerid, higherTf, SmoothedAvg) * higherTfmult

//Momentum indicators
Momentum = momtype == 1 ? rsi(momsrc, momlen) : momtype == 2 ? cci(momsrc, momlen) : momtype == 3 ? rsi(roc(momsrc,momlen),momlen) : na

//Momentum Slope Percentage
Deltamom = (Momentum / Momentum[momderiv]) - 1
SmoothedMom = sma(Deltamom, momsmooth) 
Momout   = nrp_funct(syminfo.tickerid, higherTf, SmoothedMom)

//Plottings
plot(buffup, color=color.green, title="Buy line")
plot(bufflow, color=color.red, title="Sell line")
plot(MAout, color=color.blue, linewidth=2, title="MA Slope")
plot(Momout, color=color.orange, linewidth=2, title="Momentum Slope")

longCondition = bad_vol ? low_vol_up : MAout > buffup and Momout > buffup
if (longCondition)
    strategy.entry("Buy", strategy.long)

shortCondition = bad_vol ? low_vol_down : MAout < bufflow and Momout < bufflow
if (shortCondition)
    strategy.entry("Sell", strategy.short)

Lebih lanjut