Strategi ini didasarkan pada indikator Ehlers Fisher Stochastic Relative Vigor Index yang diusulkan oleh John Ehlers dalam bukunya
Strategi ini pertama-tama menghitung harga penutupan - harga pembukaan, yang merupakan tubuh candlestick. Kemudian menghitung harga tinggi - harga rendah, yang merupakan bayangan candlestick. Dengan mengambil jumlah dan rata-rata dari kedua bagian ini masing-masing, ia mendapatkan momentum saham. Kemudian dengan membagi momentum dengan volatilitas saham, ia mendapatkan Relative Vigor Index (RVI).
Selanjutnya, rumus Ehlers Fisher diterapkan pada RVI untuk mendapatkan nilai sinyal. Ini akan panjang ketika sinyal melintasi trigger, dan akan pendek ketika sinyal melintasi di bawah trigger. Selain itu, stop loss tetap dan trailing stop loss diimplementasikan untuk mengendalikan risiko.
Strategi ini mengintegrasikan karakteristik momentum dan indikator stokastik saham, yang dapat secara efektif menentukan kekuatan relatif di pasar. Desain indikator Ehlers Fisher dapat mengurangi dampak kebisingan dan menghasilkan sinyal perdagangan yang relatif dapat diandalkan. Indeks vigor mencerminkan kualitas tren dan volatilitas saham itu sendiri, menjadikannya indikator dinamis.
Dibandingkan dengan menggunakan satu indikator momentum atau indikator stokastik, strategi ini menggabungkan indikator dan model secara organik, yang dapat meningkatkan kualitas sinyal.
Strategi ini terutama bergantung pada indikator Ehlers Fisher. Ketika ada perubahan drastis di pasar, parameter indikator perlu dioptimalkan untuk beradaptasi dengan lingkungan baru. Jika parameter ditetapkan dengan tidak benar, itu dapat menghasilkan sinyal yang salah atau sinyal tertinggal.
Selain itu, ada beberapa tingkat risiko penyesuaian kurva intrinsik dalam strategi itu sendiri. Jika lingkungan pasar dalam backtesting dan perdagangan langsung berubah secara signifikan, kinerja strategi dapat menyimpang secara besar-besaran. Dalam hal ini, parameter strategi perlu disesuaikan dan aturan perdagangan memerlukan optimalisasi untuk menyesuaikan dengan kondisi pasar baru.
Strategi ini dapat dioptimalkan lebih lanjut dalam aspek berikut:
Mengoptimalkan parameter indikator Ehlers Fisher untuk sensitivitas yang lebih tinggi atau penyaringan kebisingan.
Model indikator dengan algoritma pembelajaran mesin seperti LSTM untuk menghasilkan sinyal perdagangan yang lebih dapat diandalkan.
Menggabungkan indikator volatilitas pasar seperti ATR untuk menyesuaikan jarak stop loss secara dinamis.
Tambahkan dukungan untuk model multi-faktor, menggabungkan indikator teknis dan fundamental lainnya untuk meningkatkan kualitas sinyal.
Mengoptimalkan logika posisi terbuka/tutup dengan kriteria entry/exit dinamis.
Strategi ini memanfaatkan indikator Ehlers Fisher Stochastic RVI untuk menentukan tren dan kekuatan pasar, dan menetapkan mekanisme stop loss yang wajar untuk mengendalikan risiko. Dibandingkan dengan indikator tunggal, strategi ini menggabungkan beberapa indikator dan model secara organik, yang dapat menyaring kebisingan dan memberikan sinyal berkualitas tinggi. Masih ada ruang untuk peningkatan kinerja strategi melalui optimasi parameter, fusi model, penyesuaian adaptif dan sarana lainnya.
/*backtest start: 2022-12-15 00:00:00 end: 2023-12-21 00:00:00 period: 1d basePeriod: 1h exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}] */ //@version=3 strategy("Ehlers Fisher Stochastic Relative Vigor Index Strategy", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100.0, pyramiding = 1, commission_type = strategy.commission.percent, commission_value = 0.1) p = input(10, title = "Length") FisherStoch(src, len) => val1 = stoch(src, src, src, len) / 100 val2 = (4 * val1 + 3 * val1[1] + 2 * val1[2] + val1[3]) / 10 FisherStoch = 0.5 * log((1 + 1.98 * (val2 - 0.5)) / (1 - 1.98 * (val2 - 0.5))) / 2.64 CO = close - open HL = high - low value1 = (CO + 2 * CO[1] + 2 * CO[2] + CO[3]) / 6 value2 = (HL + 2 * HL[1] + 2 * HL[2] + HL[3]) / 6 num = sum(value1, p) denom = sum(value2, p) RVI = denom != 0 ? num / denom : 0 signal = FisherStoch(RVI, p) trigger = signal[1] oppositeTrade = input(true) barsSinceEntry = 0 barsSinceEntry := nz(barsSinceEntry[1]) + 1 if strategy.position_size == 0 barsSinceEntry := 0 if ((crossover(signal, trigger) and not oppositeTrade) or (oppositeTrade and crossunder(signal, trigger))) and abs(signal) > 2 / 2.64 strategy.entry("Long", strategy.long) barsSinceEntry := 0 if ((crossunder(signal, trigger) and not oppositeTrade) or (oppositeTrade and crossover(signal, trigger))) and abs(signal) > 2 / 2.64 strategy.entry("Short", strategy.short) barsSinceEntry := 0 if strategy.openprofit < 0 and barsSinceEntry > 8 strategy.close_all() barsSinceEntry := 0 hline(0, title="ZeroLine", color=gray) signalPlot = plot(signal, title = "Signal", color = blue) triggerPlot = plot(trigger, title = "Trigger", color = green) fill(signalPlot, triggerPlot, color = signal < trigger ? red : lime, transp = 50)