Strategi Dagangan Purata Bergerak McGinley

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

img

Ringkasan

Strategi ini berdasarkan pada penunjuk Purata Bergerak Dinamik McGinley. Penunjuk MA McGinley adalah versi yang lebih baik dari purata bergerak yang dapat mengesan trend harga dengan lebih baik. Strategi ini menggunakan isyarat yang dihasilkan oleh penunjuk MA McGinley digabungkan dengan harga pecah MA untuk mewujudkan peraturan perdagangan untuk keuntungan.

Logika Strategi

Strategi ini terutamanya menggunakan dua purata bergerak, EMA 21 tempoh dan EMA 42 tempoh. Apabila MA yang lebih pendek melintasi di atas MA yang lebih lama, ia dianggap isyarat beli. Apabila MA yang lebih pendek melintasi di bawah MA yang lebih lama, ia dianggap isyarat jual.

Di samping itu, strategi ini juga memerlukan harga berada di atas MA Dinamik McGinley dan memecahkan di atas MA yang lebih pendek untuk menjana isyarat beli.

Khususnya, isyarat beli diaktifkan apabila: MA yang lebih pendek melintasi MA yang lebih panjang, harga tutup di atas MA McGinley, harga tutup pecah di bawah MA yang lebih pendek. Isyarat jual diaktifkan apabila: MA yang lebih pendek melintasi MA yang lebih panjang, harga tutup di bawah MA McGinley, harga tutup pecah di atas MA yang lebih pendek.

MA McGinley dikira sebagai: MDIt = MDIt-1 + (Close - MDIt-1) / Max(k * Periode * (Close / MDIt-1) ^ 4, 1). Di mana MDIt adalah nilai semasa, MDIt-1 adalah nilai terdahulu, Close adalah harga penutupan, k adalah konstanta pelunturan, dan Periode adalah tempoh pengiraan. Formula ini membolehkan MA untuk mengesan perubahan harga dalam masa nyata.

Kelebihan

  1. MA McGinley meningkatkan isu yang tertinggal dari MA tradisional dan dapat menangkap perubahan trend dengan cepat.

  2. Menggunakan MAs berganda untuk menjana isyarat dapat menapis penyebaran palsu dengan berkesan.

  3. Menambah harga di atas/di bawah McGinley MA mengelakkan perdagangan berlebihan di pasaran yang terhad.

  4. Menggunakan EMA menjadikan MA lebih sensitif terhadap perubahan harga baru-baru ini.

Risiko

  1. Whipsaws boleh menghasilkan isyarat palsu di pasaran sampingan, menyebabkan kerugian. Parameter boleh diselaraskan untuk menapis isyarat.

  2. Pintu terbuka mungkin gagal untuk mencetuskan kemasukan tepat pada masanya.

  3. Penyesuaian parameter yang tidak mencukupi boleh menjejaskan prestasi strategi. Parameter harus dioptimumkan.

  4. Tempoh memegang yang panjang menimbulkan risiko sistemik.

Peningkatan

  1. Uji panjang MA yang berbeza untuk mencari kombinasi yang optimum.

  2. Tambah penunjuk lain seperti KD, MACD untuk meningkatkan masa masuk / keluar.

  3. Sesuaikan nilai k berdasarkan produk dan pasaran yang berbeza untuk mengoptimumkan pengiraan MA McGinley.

  4. Menggabungkan langkah-langkah turun naik untuk saiz kedudukan dinamik dan kawalan risiko.

  5. Tetapkan stop loss untuk mengawal kerugian. Trailing stop juga boleh diuji untuk mengunci keuntungan.

Kesimpulan

Strategi ini menggunakan keupayaan pelacakan cepat MA McGinley digabungkan dengan isyarat pecah harga untuk mengikuti trend dengan berkesan dan menukar kedudukan apabila trend 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 lanjut