
Strategi ini menggabungkan indikator Ernesto’s Elastic Vibration, Ernesto’s Cycle, Ernesto’s Momentary Trend Line, dan Ernesto’s Spearman Level Related Coefficient Indicator untuk membentuk strategi perdagangan kuantitatif yang mencakup semua aspek dari tren, getaran, momentum, dan karakteristik harga. Strategi ini dikenal sebagai Strategi Komposit Indikator Gelombang Kuantitatif.
Kebijakan ini didasarkan pada empat indikator utama:
Pertama, indikator Elastic Vibration Index, yang mendapatkan garis sinyal setelah dihaluskan melalui rata-rata indeks, dapat menilai arah dan intensitas tren saat ini. Kedua, indikator Elastic Vibration Index, dapat secara efektif mengidentifikasi titik rendah siklus siklus dan menentukan apakah tren utama telah berbalik.
Secara khusus, empat persyaratan masuk dari strategi ini adalah: garis sinyal indikator gesekan yang elegan dan garis sinyal indikator siklus bergerak ke atas pada saat yang sama; garis asal ke atas menembus garis siklus; garis asal lebih tinggi dari garis tren instan yang naik; koefisien korelasi skala Spielman adalah positif.
Kondisi keluar lebih sederhana, hanya ketika garis asli melewati garis tren sesaat.
Kondisi kosong sama dengan kondisi banyak, hanya dengan membalikkan kondisi penghakiman.
Keuntungan terbesar dari strategi ini adalah kombinasi indikator yang tepat, yang dapat secara efektif memanfaatkan keunggulan masing-masing indikator, saling memverifikasi, menghindari false positives, sehingga menyaring banyak kebisingan, dan membuat sinyal lebih dapat diandalkan.
Secara khusus, indikator getaran elegan dapat menentukan arah dan kekuatan tren, indikator siklus dapat menentukan titik balik siklus, garis tren seketika dapat menentukan tren jangka pendek, koefisien relevan tingkat Spielman dapat menentukan hubungan kuantitas-harga. Kombinasi dari keempatnya, dapat menilai secara menyeluruh karakteristik pasar dalam tren, siklus, volume, dan kuantitas-harga, sehingga menghasilkan sinyal perdagangan yang sangat andal.
Selain itu, strategi ini hanya dengan garis tengah sebagai obyek referensi, menghindari gangguan dari kebisingan pasar jangka pendek, dapat mengurangi perdagangan yang tidak perlu. Selain itu, sinyal strategi jarang, aturan keluar sederhana, dapat mengurangi frekuensi perdagangan secara signifikan, dan menghindari masalah perdagangan berlebihan.
Risiko terbesar dari strategi ini adalah kurangnya mekanisme stop loss. Tidak dapat berhenti tepat waktu ketika pasar mengalami perubahan drastis, dapat menyebabkan peningkatan kerugian. Selain itu, kurangnya filter tambahan, seperti filter sistem marginal dan indikator energi, dapat menyebabkan tingkat perdagangan positif palsu.
Untuk mengurangi risiko ini, Anda dapat mengatur stop loss penghindaran, yang secara otomatis berhenti ketika kerugian melebihi persentase tertentu. Selain itu, Anda juga dapat bergabung dengan indikator momentum seperti MACD untuk verifikasi kedua, untuk menghindari risiko yang ditimbulkan oleh false breakout.
Kebijakan ini dapat dioptimalkan dalam beberapa hal:
Masukkan Stop Loss Keamanan. Berdasarkan data retrospeksi sejarah, perhitungkan penarikan maksimum dan atur Stop Loss yang sesuai.
Menambahkan filter. Menambahkan indikator MACD, Brin dan lain-lain untuk melakukan pemfilteran multi-lapisan, untuk mengurangi sinyal palsu.
Dengan kombinasi lebih banyak periode waktu. Saat ini hanya ada satu set parameter, lebih banyak parameter periode dapat diperkenalkan, menggunakan metode verifikasi multi-aksara waktu, meningkatkan stabilitas.
Parameter penyesuaian dinamis. Modul pengoptimalan parameter ditambahkan untuk menyesuaikan parameter indikator secara dinamis sesuai dengan kondisi pasar yang berbeda, sehingga strategi lebih adaptif.
Arbitrage multi-varietas: menerapkan strategi untuk berbagai varietas, mencari peluang untuk melakukan arbitrage, dan mengendalikan risiko lebih lanjut.
Strategi ini menggunakan kombinasi cerdas dari empat indikator utama Enler, untuk membentuk strategi perdagangan yang mencakup semua aspek untuk menilai tren, siklus, momentum, dan harga kuantitatif. Ini memiliki kemampuan yang luar biasa untuk memfilter kebisingan dan menghasilkan sinyal berkualitas tinggi. Namun, kurangnya penyaringan stop loss dan indikator tambahan membuatnya berisiko. Dengan menambahkan stop loss, filter, dan lebih banyak periode waktu, strategi ini dapat dioptimalkan secara efektif, sehingga lebih stabil dan dapat diandalkan.
/*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')