Strategi perdagangan rata-rata bergerak McGinley

Penulis:ChaoZhang, Tanggal: 2023-11-14 15:48:46
Tag:

img

Gambaran umum

Strategi ini didasarkan pada indikator McGinley Dynamic Moving Average. Indikator McGinley MA adalah versi yang ditingkatkan dari moving average yang dapat melacak tren harga dengan lebih baik. Strategi ini memanfaatkan sinyal yang dihasilkan oleh indikator McGinley MA dikombinasikan dengan price breakout dari MA untuk menetapkan aturan perdagangan untuk keuntungan.

Logika Strategi

Strategi ini terutama menggunakan dua rata-rata bergerak, EMA 21 periode dan EMA 42 periode. Ketika MA yang lebih pendek melintasi di atas MA yang lebih panjang, itu dianggap sebagai sinyal beli. Ketika MA yang lebih pendek melintasi di bawah MA yang lebih panjang, itu dianggap sebagai sinyal jual.

Selain itu, strategi ini juga membutuhkan harga untuk berada di atas MA Dinamis McGinley dan melanggar di atas MA yang lebih pendek untuk menghasilkan sinyal beli.

Secara khusus, sinyal beli dipicu ketika: MA yang lebih pendek melintasi MA yang lebih panjang, harga dekat di atas MA McGinley, harga dekat melanggar MA yang lebih pendek.

MA McGinley dihitung sebagai: MDIt = MDIt-1 + (Close - MDIt-1) / Max(k * Periode * (Close / MDIt-1) ^ 4, 1). Di mana MDIt adalah nilai saat ini, MDIt-1 adalah nilai sebelumnya, Close adalah harga penutupan, k adalah konstanta pelunturan, dan Periode adalah periode perhitungan. Rumus ini memungkinkan MA untuk melacak perubahan harga secara real time.

Keuntungan

  1. McGinley MA memperbaiki masalah yang tertinggal dari MA tradisional dan dapat dengan cepat menangkap perubahan tren.

  2. Menggunakan MAs ganda untuk menghasilkan sinyal dapat secara efektif menyaring kebocoran palsu.

  3. Menambahkan harga di atas/di bawah McGinley MA menghindari perdagangan yang berlebihan di pasar yang terikat rentang.

  4. Menggunakan EMA membuat MA lebih sensitif terhadap perubahan harga terbaru.

Risiko

  1. Whipsaws dapat menghasilkan sinyal palsu di pasar sisi, menyebabkan kerugian. Parameter dapat disesuaikan dengan sinyal filter.

  2. Bukaan celah mungkin tidak bisa memicu masuk tepat waktu.

  3. Pengaturan parameter yang tidak memadai dapat mempengaruhi kinerja strategi. Parameter harus dioptimalkan.

  4. Periode holding yang panjang menimbulkan risiko sistemik.

Peningkatan

  1. Uji panjang MA yang berbeda untuk menemukan kombinasi yang optimal.

  2. Tambahkan indikator lain seperti KD, MACD untuk meningkatkan waktu masuk/keluar.

  3. Sesuaikan nilai k berdasarkan produk dan pasar yang berbeda untuk mengoptimalkan perhitungan MA McGinley.

  4. Menggabungkan ukuran volatilitas untuk ukuran posisi dinamis dan pengendalian risiko.

  5. Set stop loss untuk mengendalikan kerugian. Trailing stop juga dapat diuji untuk mengunci keuntungan.

Kesimpulan

Strategi ini memanfaatkan kemampuan pelacakan cepat McGinley MA dikombinasikan dengan sinyal price breakout untuk secara efektif mengikuti tren dan beralih posisi ketika tren berbalik.


/*backtest
start: 2022-11-07 00:00:00
end: 2023-11-13 00:00:00
period: 1d
basePeriod: 1h
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/
// © LucasZancheta

//@version=4
strategy(shorttitle="Maguila", title="McGinley Dynamic Indicator", overlay=true)

//Médias móveis
MA1Period=input(21, title="MA1")
MA2Period=input(42, title="MA2")

MA1 = ema(close, MA1Period)
MA2 = ema(close, MA2Period)

aboveAverage = MA1 >= MA2
hunderAverage = MA2 >= MA1

//Período do backtest
startDate = input(title="Start Date", type=input.integer, defval=28, minval=1, maxval=31)
startMonth = input(title="Start Month", type=input.integer, defval=5, minval=1, maxval=12)
startYear = input(title="Start Year", type=input.integer, defval=2019, minval=1800, maxval=2100)

endDate = input(title="End Date", type=input.integer, defval=28, minval=1, maxval=31)
endMonth = input(title="End Month", type=input.integer, defval=5, minval=1, maxval=12)
endYear = input(title="End Year", type=input.integer, defval=2030, minval=1800, maxval=2100)

//Verifica se o candle está dentro do período do backtest
inDateRange = (time >= timestamp(syminfo.timezone, startYear, startMonth, startDate, 0, 0)) and (time < timestamp(syminfo.timezone, endYear, endMonth, endDate, 0, 0))

//Número de periodos da média móvel
period  = input(title="Períodos", type=input.integer, defval=20)
//Constante K (0.6)
k = input(title="Constante K", type=input.float, defval=0.6)
//Preço de fechamento 
closePrice = input(title="Preço", type=input.source, defval=close)

mdi = 0.0

//Fórmula de McGinley
mdi := na(mdi[1]) ? closePrice : mdi[1] + (closePrice - mdi[1]) / max((k * period * pow(closePrice / mdi[1], 4)), 1)

//Regra de coloração 
mdiColor = closePrice > mdi ? color.green : closePrice < mdi ? color.red : color.black

//Inserindo as informações no gráfico    
plot(MA1, color=color.blue, linewidth=2)
plot(MA2, color=color.purple, linewidth=2)

barcolor(mdiColor)

//Estratégia
buySignal = aboveAverage and closePrice > mdi and crossunder(low, MA1) and close > MA1  
buyLoss = closePrice < mdi and close < MA1 and close < MA2

if (inDateRange)
    strategy.entry("Compra", strategy.long, qty=1, when= buySignal)
    strategy.exit("Gain da compra", "Compra", qty=1, profit=20)
    strategy.close("Compra", qty=1, when= buyLoss, comment="Loss na operação")

sellSignal = hunderAverage and closePrice < mdi and crossover(high, MA1) and close < MA1
sellLoss = closePrice > mdi and close > MA1 and close > MA2

if (inDateRange)
    strategy.entry("Venda", strategy.short, qty=1, when= sellSignal)
    strategy.exit("Gain da venda", "Venda", qty=1, profit=20)
    strategy.close("Venda", qty=1, when= sellLoss, comment="Loss na operação")

if (not inDateRange)
    strategy.close_all()




Lebih banyak