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.
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.
MA McGinley meningkatkan isu yang tertinggal dari MA tradisional dan dapat menangkap perubahan trend dengan cepat.
Menggunakan MAs berganda untuk menjana isyarat dapat menapis penyebaran palsu dengan berkesan.
Menambah harga di atas/di bawah McGinley MA mengelakkan perdagangan berlebihan di pasaran yang terhad.
Menggunakan EMA menjadikan MA lebih sensitif terhadap perubahan harga baru-baru ini.
Whipsaws boleh menghasilkan isyarat palsu di pasaran sampingan, menyebabkan kerugian. Parameter boleh diselaraskan untuk menapis isyarat.
Pintu terbuka mungkin gagal untuk mencetuskan kemasukan tepat pada masanya.
Penyesuaian parameter yang tidak mencukupi boleh menjejaskan prestasi strategi. Parameter harus dioptimumkan.
Tempoh memegang yang panjang menimbulkan risiko sistemik.
Uji panjang MA yang berbeza untuk mencari kombinasi yang optimum.
Tambah penunjuk lain seperti KD, MACD untuk meningkatkan masa masuk / keluar.
Sesuaikan nilai k berdasarkan produk dan pasaran yang berbeza untuk mengoptimumkan pengiraan MA McGinley.
Menggabungkan langkah-langkah turun naik untuk saiz kedudukan dinamik dan kawalan risiko.
Tetapkan stop loss untuk mengawal kerugian. Trailing stop juga boleh diuji untuk mengunci keuntungan.
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()