Strategi ini berdasarkan prinsip persilangan purata bergerak untuk berdagang. Ia menggunakan dua purata bergerak, menjana isyarat beli apabila purata bergerak jangka pendek melintasi di atas purata bergerak jangka panjang dari bawah. Isyarat jual dihasilkan apabila harga pecah di bawah purata bergerak lain. Strategi ini sesuai untuk pasaran trend, mampu menapis beberapa perdagangan bunyi secara berkesan dan menangkap trend utama.
Strategi ini menggunakan tempoh purata bergerak jangka pendek dan jangka panjang yang boleh disesuaikan oleh pengguna, tempoh purata bergerak keluar, dan kaedah pengiraan purata bergerak.
Apabila purata bergerak jangka pendek melintasi di atas purata bergerak jangka panjang dari bawah, isyarat beli dihasilkan. Ini menunjukkan trend jangka pendek telah beralih ke trend menaik, dan kita boleh membeli.
Apabila harga penutupan pecah di bawah purata bergerak keluar, isyarat jual dihasilkan. Ini menunjukkan pembalikan trend, jadi kita harus keluar dari kedudukan.
Oleh itu, isyarat perdagangan strategi berasal dari persilangan purata bergerak jangka pendek dan jangka panjang, dan hubungan antara harga penutupan dan purata bergerak keluar.
Kelebihan strategi ini ialah:
Sederhana dan mudah dilaksanakan.
Parameter yang boleh disesuaikan sesuai dengan keadaan pasaran yang berbeza.
Purata bergerak menapis bunyi bising dan menangkap trend utama.
Boleh menggabungkan penunjuk teknikal lain seperti trend, sokongan / rintangan untuk mengoptimumkan lebih lanjut.
Nisbah risiko-balasan yang boleh dikawal, mempunyai mekanisme stop loss.
Risiko adalah:
Rendah kepada isyarat palsu di pasaran konsolidasi yang tidak trend.
Tetapan parameter yang tidak betul boleh menyebabkan trend yang hilang atau terlalu banyak perdagangan yang tidak sah.
Penempatan stop loss yang tidak betul boleh meningkatkan kerugian.
Kegagalan melarikan diri boleh menyebabkan kerugian.
Parameter perlu disesuaikan tepat pada masanya untuk menyesuaikan perubahan pasaran.
Penyelesaian termasuk mengoptimumkan parameter, menggabungkan penapis lain, menyesuaikan berhenti, menunggu pengesahan trend sebelum perdagangan, dan lain-lain.
Strategi ini boleh ditingkatkan dengan:
Membangunkan mekanisme penentuan trend dan hanya berdagang selepas pengesahan trend.
Menambah penapis seperti jumlah atau volatiliti untuk menapis isyarat.
Pengoptimuman dinamik tempoh purata bergerak.
Mengoptimumkan mekanisme Stop Loss untuk menggunakan trailing stop.
Memasukkan sokongan/tahan dan penunjuk lain untuk mengesahkan isyarat lebih lanjut.
Penyesuaian parameter berdasarkan produk dan jangka masa yang berbeza.
Secara keseluruhan strategi crossover purata bergerak ini adalah sistem trend berikut yang mudah dan praktikal. Ia boleh disesuaikan dengan keadaan pasaran dengan mengubah parameter dan menangkap arah trend utama di pasaran trend. Tetapi risiko seperti salah mengenal pasti trend harus diperhatikan, dan pengoptimuman berterusan diperlukan untuk menyesuaikan diri dengan pasaran yang berubah. Secara umum, strategi ini mempunyai daya maju yang baik.
/*backtest start: 2022-10-30 00:00:00 end: 2023-11-05 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/ // © TwoChiefs //@version=4 strategy("John EMA Crossover Strategy", overlay=true) //////////////////////////////////////////////////////////////////////////////// // BACKTESTING RANGE // From Date Inputs fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31) fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12) fromYear = input(defval = 2020, title = "From Year", minval = 1970) // To Date Inputs toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31) toMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12) toYear = input(defval = 2021, title = "To Year", minval = 1970) // Calculate start/end date and time condition startDate = timestamp(fromYear, fromMonth, fromDay, 00, 00) finishDate = timestamp(toYear, toMonth, toDay, 00, 00) time_cond = true //////////////////////////////////////////////////////////////////////////////// //CREATE USER-INPUT VARIABLES periodShort = input(13, minval=1, title="Enter Period for Short Moving Average") smoothingShort = input(title="Choose Smoothing Type for Short Moving Average", defval="EMA", options=["RMA", "SMA", "EMA", "WMA", "VWMA", "SMMA", "DEMA", "TEMA", "HullMA", "LSMA"]) periodLong = input(48, minval=1, title="Enter Period for Long Moving Average") smoothingLong = input(title="Choose Smoothing Type for Long Moving Average", defval="EMA", options=["RMA", "SMA", "EMA", "WMA", "VWMA", "SMMA", "DEMA", "TEMA", "HullMA", "LSMA"]) periodExit = input(30, minval=1, title="Enter Period for Exit Moving Average") smoothingExit = input(title="Choose Smoothing Type for Exit Moving Average", defval="EMA", options=["RMA", "SMA", "EMA", "WMA", "VWMA", "SMMA", "DEMA", "TEMA", "HullMA", "LSMA"]) src1 = close pivot = (high + low + close) / 3 //MA CALCULATION FUNCTION ma(smoothing, src, length) => if smoothing == "RMA" rma(src, length) else if smoothing == "SMA" sma(src, length) else if smoothing == "EMA" ema(src, length) else if smoothing == "WMA" wma(src, length) else if smoothing == "VWMA" vwma(src, length) else if smoothing == "SMMA" na(src[1]) ? sma(src, length) : (src[1] * (length - 1) + src) / length else if smoothing == "HullMA" wma(2 * wma(src, length / 2) - wma(src, length), round(sqrt(length))) //ASSIGN A MOVING AVERAGE RESULT TO A VARIABLE shortMA=ma(smoothingShort, pivot, periodShort) longMA=ma(smoothingLong, pivot, periodLong) exitMA=ma(smoothingExit, pivot, periodExit) //PLOT THOSE VARIABLES plot(shortMA, linewidth=4, color=color.yellow,title="The Short Moving Average") plot(longMA, linewidth=4, color=color.blue,title="The Long Moving Average") plot(exitMA, linewidth=1, color=color.red,title="The Exit CrossUnder Moving Average") //BUY STRATEGY buy = crossover(shortMA,longMA) ? true : na exit = crossunder(close,exitMA) ? true : na strategy.entry("long",true,when=buy and time_cond) strategy.close("long",when=exit and time_cond) if (not time_cond) strategy.close_all()