Strategi ini didasarkan pada prinsip crossover dari moving average untuk trading. Strategi ini menggunakan dua moving average, menghasilkan sinyal beli ketika moving average jangka pendek melintasi di atas moving average jangka panjang dari bawah. Sinyal jual dihasilkan ketika harga pecah di bawah moving average lain. Strategi ini cocok untuk pasar tren, mampu secara efektif menyaring beberapa perdagangan kebisingan dan menangkap tren utama.
Strategi ini menggunakan periode rata-rata bergerak jangka pendek dan jangka panjang yang dapat disesuaikan oleh pengguna, periode rata-rata bergerak keluar, dan metode perhitungan rata-rata bergerak.
Ketika rata-rata bergerak jangka pendek melintasi di atas rata-rata bergerak jangka panjang dari bawah, sinyal beli dihasilkan. Ini menunjukkan tren jangka pendek telah beralih ke tren naik, dan kita dapat membeli.
Ketika harga penutupan keluar di bawah rata-rata pergerakan keluar, sinyal jual dihasilkan. Ini menunjukkan pembalikan tren, jadi kita harus keluar dari posisi.
Oleh karena itu, sinyal perdagangan strategi berasal dari persilangan rata-rata bergerak jangka pendek dan jangka panjang, dan hubungan antara harga penutupan dan rata-rata bergerak keluar.
Keuntungan dari strategi ini adalah:
Sederhana dan mudah diterapkan.
Parameter yang dapat disesuaikan sesuai dengan kondisi pasar yang berbeda.
Rata-rata bergerak menyaring kebisingan dan menangkap tren utama.
Dapat menggabungkan indikator teknis lainnya seperti tren, dukungan / resistensi untuk mengoptimalkan lebih lanjut.
Rasio risiko-balasan yang terkontrol, memiliki mekanisme stop loss.
Risiko adalah:
Cenderung terhadap sinyal palsu di pasar konsolidasi non-trending.
Pengaturan parameter yang tidak benar dapat menyebabkan hilangnya tren atau terlalu banyak perdagangan yang tidak valid.
Penempatan stop loss yang tidak tepat dapat meningkatkan kerugian.
Kegagalan melarikan diri dapat menyebabkan kerugian.
Parameter perlu disesuaikan tepat waktu agar sesuai dengan perubahan pasar.
Solusi termasuk mengoptimalkan parameter, menggabungkan filter lain, menyesuaikan stop, menunggu konfirmasi tren sebelum perdagangan, dll.
Strategi ini dapat ditingkatkan dengan:
Mengembangkan mekanisme penentuan tren dan hanya berdagang setelah konfirmasi tren.
Menambahkan filter seperti volume atau volatilitas ke sinyal filter.
Optimasi dinamis periode rata-rata bergerak.
Mengoptimalkan mekanisme stop loss untuk menggunakan trailing stop.
Menggabungkan dukungan/resistensi dan indikator lain untuk mengkonfirmasi sinyal lebih lanjut.
Mengatur parameter berdasarkan produk yang berbeda dan kerangka waktu.
Secara keseluruhan strategi crossover rata-rata bergerak ini adalah sistem trend berikut yang sederhana dan praktis. Ini dapat disesuaikan dengan kondisi pasar dengan tweaking parameter dan menangkap arah tren utama di pasar tren. Tetapi risiko seperti kesalahan identifikasi tren harus dicatat, dan optimasi konstan diperlukan untuk beradaptasi dengan pasar yang berubah. Secara umum, strategi ini memiliki kelangsungan hidup 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()