Sumber daya yang dimuat... Pemuatan...

Strategi waktu rata-rata bergerak diferensial osilator

Penulis:ChaoZhang, Tanggal: 2023-12-26 14:40:12
Tag:

img

Gambaran umum

Strategi ini menghitung perbedaan antara EMA cepat dan EMA lambat untuk membentuk osilator MACD, dan menghitung EMA MACD itu sendiri untuk membentuk garis sinyal, sehingga membangun sistem penyaringan ganda.

Prinsip Strategi

Indikator inti dari strategi ini adalah osilator MACD, yang dihitung dengan mengurangi EMA lambat (biasanya 26 hari EMA) dari EMA cepat (biasanya 12 hari EMA). EMA cepat lebih sensitif dan dapat menangkap fluktuasi harga jangka pendek. EMA lambat merespons perubahan harga lebih lambat. Mengurangi keduanya membentuk osilator yang mewakili perbedaan antara siklus harga jangka pendek dan jangka menengah. EMA (biasanya 9 hari) dari osilator MACD itu sendiri kemudian dihitung untuk mendapatkan garis sinyal. Ketika sinyal MACD melintasi di atas garis sinyal dari MAC di bawah, itu menandakan bahwa momentum kenaikan tren jangka pendek lebih kuat daripada tren jangka menengah, menghasilkan sinyal beli. Ketika sinyal DD melintasi garis di atas, itu menandakan bahwa momentum penurunan tren jangka pendek lebih kuat, menghasilkan sinyal jual.

Parameter input dari strategi ini ditetapkan untuk panjang garis cepat, panjang garis lambat, sumber harga, dan periode penyelarasan garis sinyal, masing-masing. Ini dapat disesuaikan sesuai dengan pasar yang berbeda untuk menemukan kombinasi parameter yang optimal. Blok warna latar belakang menunjukkan kerangka waktu backtest. Strategi membuka posisi hanya dalam kerangka waktu ini.

Analisis Keuntungan

  1. Indikator MACD klasik dan mudah dipahami, secara efektif menangkap peluang pembalikan jangka pendek hingga menengah.

  2. Konstruksi EMA ganda dari sistem MACD memiliki kelancaran yang lebih baik daripada sistem MA tunggal.

  3. Parameter yang relatif lebih dapat disesuaikan memungkinkan optimasi di pasar yang berbeda.

  4. Menggabungkan dengan indikator volume membantu mengidentifikasi sinyal berkualitas tinggi.

Analisis Risiko

  1. MACD dapat menghasilkan lebih banyak sinyal palsu di pasar osilasi.

  2. Ini tidak dapat menentukan tren dan dapat menghasilkan kerugian ketika melintasi tren.

  3. Kerangka waktu backtest yang terbatas dapat mengabaikan kondisi pasar yang ekstrem.

  4. Penyesuaian parameter membutuhkan lebih banyak data pasar untuk menghindari overfit periode pasar tertentu.

Risiko dapat dikendalikan dengan menggabungkan indikator tren dan mekanisme stop loss. ruang lingkup backtest dan ruang sampel pasar dapat diperluas untuk optimasi parameter.

Arahan Optimasi

  1. Uji sumber harga yang berbeda seperti harga dekat, median, reset, dll.

  2. Mencari set parameter yang optimal berdasarkan data historis.

  3. Mengintegrasikan indikator lain untuk menilai kualitas sinyal, misalnya sinyal volume.

  4. Menggabungkan analisis tren dan siklus untuk menghindari konflik tren yang signifikan.

Kesimpulan

Strategi ini menangkap peluang pembalikan jangka pendek hingga menengah dengan membangun sistem filter EMA ganda. Ini termasuk dalam strategi waktu pasar klasik dan praktis. Risiko dapat dikendalikan melalui optimasi parameter, penyaringan sinyal dan cara stop loss. Menggabungkan alat analisis tren untuk menghindari membeli puncak dan menjual bagian bawah dapat menyebabkan keuntungan yang stabil.


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

//@version=4
strategy(title="MACD Histogram Backtest", shorttitle="MACD")

// Getting inputs
fast_length = input(title="Fast Length", type=input.integer, defval=12)
slow_length = input(title="Slow Length", type=input.integer, defval=26)
src = input(title="Source", type=input.source, defval=close)
signal_length = input(title="Signal Smoothing", type=input.integer, minval = 1, maxval = 50, defval = 9)
sma_source = input(title="Simple MA(Oscillator)", type=input.bool, defval=false)
sma_signal = input(title="Simple MA(Signal Line)", type=input.bool, defval=false)

// Plot colors
col_grow_above = #26A69A
col_grow_below = #FFCDD2
col_fall_above = #B2DFDB
col_fall_below = #EF5350
col_macd = #0094ff
col_signal = #ff6a00

// Calculating
fast_ma = sma_source ? sma(src, fast_length) : ema(src, fast_length)
slow_ma = sma_source ? sma(src, slow_length) : ema(src, slow_length)
macd = fast_ma - slow_ma
signal = sma_signal ? sma(macd, signal_length) : ema(macd, signal_length)
hist = macd - signal

grow = (hist[1] < hist)
fall = (hist[1] > hist) and hist >= 0
stop = (hist[1] > hist)

plot(hist, title="Histogram", style=plot.style_columns, color=(hist>=0 ? (hist[1] < hist ? col_grow_above : col_fall_above) : (hist[1] < hist ? col_grow_below : col_fall_below) ), transp=0 )
plot(macd, title="MACD", color=col_macd, transp=0)
plot(signal, title="Signal", color=col_signal, transp=0)

//Strategy Testing

// Component Code Start
// Example usage:
// if testPeriod()
//   strategy.entry("LE", strategy.long)
testStartYear = input(2017, "Backtest Start Year")
testStartMonth = input(01, "Backtest Start Month")
testStartDay = input(2, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(30, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

// A switch to control background coloring of the test period
testPeriodBackground = input(title="Color Background?", type=input.bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=97)

testPeriod() => true
// Component Code Stop

//Entry and Close settings
if testPeriod() 
    strategy.entry("grow", true, 10, when = grow, limit = close)
    strategy.close("grow", when = fall)
    strategy.close("grow", when = stop)
    
//if testPeriod() 
//   strategy.entry("fall", false, 1000, when = fall, limit = close)
//    strategy.close("fall", when = grow)    



Lebih banyak