Strategi ini menggabungkan Ehlers Elegant Oscillator, Ehlers Decycler, Ehlers Instantaneous Trendline dan Ehlers Spearman Rank Correlation Coefficient menjadi satu strategi, membentuk strategi perdagangan kuantitatif yang sepenuhnya menangkap tren, osilasi, momentum dan karakteristik harga & volume.
Strategi ini menggunakan 4 indikator kunci untuk penilaian.
Pertama, Ehlers Elegant Oscillator, di mana perbedaan antara garis asli dan garis sinyal yang dihaluskan oleh rata-rata bergerak eksponensial dapat menentukan arah dan kekuatan tren saat ini. Kedua, Ehlers Decycler, yang dapat secara efektif mengidentifikasi titik rendah siklus dan menentukan apakah tren utama berbalik. Selanjutnya, Ehlers Instantaneous Trendline melacak rata-rata bergerak cepat untuk menilai arah tren jangka pendek. Akhirnya, Koefisien Korrelasi Peringkat Ehlers Spearman menilai hubungan harga-volume, yang dapat secara efektif menyaring pecah palsu.
Secara khusus, empat kondisi masuk untuk strategi ini adalah: garis sinyal Elegant Oscillator dan garis sinyal Decycler secara bersamaan melanggar di atas 0, garis asli melanggar di atas garis Decycler, garis asli lebih tinggi dari Instantaneous Trendline yang meningkat, dan Koefisien Korrelasi Rank Spearman positif.
Kondisi keluar jauh lebih sederhana: keluar ketika garis asli jatuh di bawah Instantaneous Trendline.
Kondisi pendek mirip dengan kondisi panjang, hanya terbalik.
Keuntungan terbesar dari strategi ini terletak pada kombinasi indikator yang tepat, yang dapat secara efektif memanfaatkan kekuatan masing-masing indikator, saling memverifikasi, menghindari positif palsu, menyaring banyak kebisingan, dan menghasilkan sinyal yang lebih andal.
Secara khusus, Elegant Oscillator dapat menilai arah tren dan kekuatan, Decycler dapat menilai titik balik siklus, Instantaneous Trendline dapat menilai tren jangka pendek, dan Spearman Rank menilai hubungan harga-volume.
Selain itu, dengan hanya harga jangka menengah sebagai referensi, strategi ini menghindari gangguan dari kebisingan pasar jangka pendek dan mengurangi perdagangan pembalikan yang tidak perlu.
Risiko terbesar dari strategi ini adalah kurangnya mekanisme stop loss. Dalam hal pergerakan pasar yang ganas, ketidakmampuan untuk menghentikan kerugian tepat waktu dapat menyebabkan kerugian yang lebih besar.
Untuk mengurangi risiko ini, stop loss perlindungan dapat diatur untuk secara otomatis menghentikan kerugian ketika kerugian melebihi tingkat tertentu. Juga, indikator seperti MACD dapat ditambahkan untuk konfirmasi sekunder untuk menghindari risiko dari pecah palsu.
Strategi dapat dioptimalkan dalam aspek berikut:
Tambahkan mekanisme manajemen risiko stop loss.
Tambahkan lebih banyak filter. Tambahkan indikator seperti MACD, Bollinger Bands untuk lebih banyak penyaringan untuk lebih mengurangi sinyal palsu.
Masukkan lebih banyak timeframe. Saat ini hanya satu set parameter yang digunakan. Lebih banyak timeframe dapat ditambahkan untuk verifikasi multi-timeframe untuk meningkatkan stabilitas.
Tambahkan optimasi parameter untuk menyesuaikan parameter indikator secara dinamis berdasarkan perubahan kondisi pasar untuk meningkatkan kemampuan beradaptasi.
Arbitrage lintas aset: menerapkan strategi pada aset yang berbeda untuk mencari peluang arbitrase untuk mengontrol risiko dengan lebih baik.
Strategi ini dengan cerdik menggabungkan 4 indikator Ehlers utama untuk membentuk strategi yang menilai tren, siklus, momentum dan volume harga dalam semua aspek. Ini memiliki kemampuan penyaringan kebisingan yang luar biasa dan dapat menghasilkan sinyal berkualitas tinggi. Tetapi kurangnya stop loss dan penyaringan indikator tambahan mengeksposnya terhadap beberapa risiko. Dengan menambahkan stop loss, filter, lebih banyak kerangka waktu, dll, dapat secara efektif dioptimalkan untuk stabilitas dan keandalan yang lebih tinggi.
/*backtest start: 2024-01-01 00:00:00 end: 2024-01-31 23:59:59 period: 2h basePeriod: 15m exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ // This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/ // © simwai //@version=5 strategy('Ehlers Elegant Oscillator + Ehlers Decycler + Ehlers Instantaneous + Ehlers Spearman Rank', 'Ehlers Combo', overlay=true, margin_long=100, margin_short=100) // -- Inputs -- inp = input(title='Source', defval=close) res = input.timeframe(title='Resolution', defval='') bar = input(title='Allow Bar Color Change?', defval=true) src = inp length = input.int(title='Length', defval=20, minval=2, maxval=300) rmsLength = input.int(title='Rms Length', defval=50, minval=2) decyclerLength = length // -- Calculation -- // Ehlers Elegant Oscillator a1 = math.exp(-1.414 * math.pi / length) b1 = 2 * a1 * math.cos(1.414 * math.pi / length) c2 = b1 c3 = -a1 * a1 c1 = 1 - c2 - c3 deriv = src - nz(src[2]) rms = math.avg(math.pow(deriv, 2), rmsLength) rms := rms != 0 ? math.sqrt(rms) : 0 nDeriv = rms != 0 ? deriv / rms : 0 iFish = nDeriv != 0 ? (math.exp(2 * nDeriv) - 1) / (math.exp(2 * nDeriv) + 1) : 0 ss = 0.0 ss := bar_index < 3 ? 0 : (c1 * ((iFish + nz(iFish[1])) / 2)) + (c2 * nz(ss[1])) + (c3 * nz(ss[2])) ssSig = ta.wma(ss, length) slo = ss - ssSig sig = slo > 0 ? slo > nz(slo[1]) ? 2 : 1 : slo < 0 ? slo < nz(slo[1]) ? -2 : -1 : 0 eoColor = sig > 1 ? color.green : sig > 0 ? color.lime : sig < -1 ? color.maroon : sig < 0 ? color.red : color.black hline(0) plot(ssSig, title='EO', color=eoColor, linewidth=2) // Ehlers Decycler pi = 2 * math.asin(1) twoPiPrd = 2 * pi / decyclerLength alpha = (math.cos(twoPiPrd) + math.sin(twoPiPrd) - 1) / math.cos(twoPiPrd) dec = 0.0 dec := ((alpha / 2) * (src + nz(src[1]))) + ((1 - alpha) * nz(dec[1])) decyclerSig = src > dec ? 1 : src < dec ? -1 : 0 decColor = decyclerSig > 0 ? color.green : decyclerSig < 0 ? color.red : color.black plot(dec, title='Decycler', color=decColor, linewidth=2) // Ehlers Instantaneous Trendline getItrend(src, alpha) => Price = src Smooth = 0.0 ITrend = 0.0 Trigger = 0.0 ITrend := (alpha - alpha * alpha / 4) * Price + .5 * alpha * alpha * Price[1] - (alpha - .75 * alpha * alpha) * Price[2] + 2 * (1 - alpha) * nz(ITrend[1]) - (1 - alpha) * (1 - alpha) * nz(ITrend[2]) if(bar_index < 7) ITrend := (Price + 2 * Price[1] + Price[2]) / 4 Trigger := 2 * ITrend - ITrend[2] [ITrend, Trigger] itrendAlpha = 2 / (length + 1) / 2 [iT, Tr] = getItrend(src, itrendAlpha) iTColor = Tr > iT ? color.aqua : color.maroon plot(iT, 'Instantaneous Trend', iTColor, 2) // Ehlers Spearman Rank priceArray = array.new_float(300, 0.0) rank = array.new_float(300, 0.0) for i = 1 to length array.set(priceArray, i, nz(src[i - 1])) array.set(rank, i, i) for i = 1 to length count = length + 1 - i for j = 1 to length - count if array.get(priceArray, j + 1) < array.get(priceArray, j) tempPrice = array.get(priceArray, j) tempRank = array.get(rank, j) array.set(priceArray, j, array.get(priceArray, j + 1)) array.set(rank, j, array.get(rank, j + 1)) array.set(priceArray, j + 1, tempPrice) array.set(rank, j + 1, tempRank) sum = 0.0 for i = 1 to length sum := sum + math.pow(i - array.get(rank, i), 2) signal = 2 * (0.5 - (1 - ((6 * sum) / (length * (math.pow(length, 2) - 1))))) spearmanSlo = signal - nz(signal[1]) spearmanSig = spearmanSlo > 0 or signal > 0 ? spearmanSlo > nz(spearmanSlo[1]) ? 2 : 1 : spearmanSlo < 0 or signal < 0 ? spearmanSlo < nz(spearmanSlo[1]) ? -2 : -1 : 0 // -- Signals -- bool enterLong = ta.crossover(sig, 0) and ta.crossover(decyclerSig, 0) and ta.crossover(src, dec) and (src > iT) and iT[1] < iT and spearmanSig > 0 bool enterShort = ta.crossunder(sig, 0) and ta.crossunder(decyclerSig, 0) and ta.crossunder(src, dec) and (src < iT) and iT[1] > iT and spearmanSig < 0 bool exitLong = ta.crossunder(src[100], iT) bool exitShort = ta.crossover(src[100], iT) barcolor(bar and strategy.position_size > 0 ? color.green : bar and strategy.position_size < 0 ? color.red : color.gray) // -- Long Exits -- strategy.close('long', when=exitLong and strategy.position_size > 0, comment='EXIT_LONG') // -- Short Exits -- strategy.close('short', when=exitShort and strategy.position_size < 0, comment='EXIT_SHORT') bool isStrategyEntryEnabled = true // -- Long Entries -- if (isStrategyEntryEnabled) strategy.entry('long', strategy.long, when=enterLong, comment='ENTER_LONG') else strategy.order('long', strategy.long, when=enterLong, comment='ENTER_LONG') // -- Short Entries -- if (isStrategyEntryEnabled) strategy.entry('short', strategy.short, when=enterShort, comment='ENTER_SHORT') else strategy.order('short', strategy.short, when=enterShort, comment='ENTER_SHORT')