
Strategi ini menggabungkan Indeks Elastic Vibration, Indeks Siklus, Indeks Trend Line Instant, dan Indeks Faktor Berkaitan Tingkat Spellman untuk membentuk strategi perdagangan kuantitatif yang merangkumi trend, getaran, momentum dan ciri-ciri harga kuantitatif. Strategi ini dikenali sebagai Strategi Komposit Indeks Vibrasi Kuantitatif.
Kaedah ini menggunakan empat penunjuk utama.
Pertama, indikator Ernesse Elegant Vibration, yang mendapat garis isyarat selepas rata-rata indeks diluruskan, dengan perbezaan dari garis asal dapat menentukan arah dan kekuatan trend semasa. Kedua, indikator Ernesse Cyclical, yang dapat mengenal pasti tahap rendah kitaran kitaran secara berkesan, untuk menentukan sama ada trend utama telah berbalik.
Khususnya, empat syarat kemasukan strategi adalah: garis isyarat indikator goyah yang elegan dan garis isyarat indikator pusingan bergerak ke atas secara serentak; garis asal ke atas menembusi garis pusingan; garis asal lebih tinggi daripada garis trend seketika yang naik; dan faktor berkaitan peringkat Spielman adalah positif.
Keadaan keluar adalah lebih mudah, hanya apabila garis asal melintasi garis trend seketika.
Syarat kosong adalah sama dengan syarat banyak, hanya dengan membalikkan syarat penghakiman.
Kelebihan utama strategi ini adalah bahawa kombinasi indikator yang betul dapat memanfaatkan kelebihan setiap indikator dengan berkesan, saling mengesahkan, mengelakkan positif palsu, dan dengan itu menyaring banyak bunyi bising, menjadikan isyarat lebih dipercayai.
Khususnya, penunjuk goyah elegan dapat menentukan arah dan kekuatan trend, penunjuk kitaran dapat menentukan titik perubahan kitaran, garis trend seketika dapat menentukan trend jangka pendek, faktor berkaitan skala Spielman dapat menentukan hubungan kuantiti harga. Kombinasi keempatnya dapat menilai ciri pasaran secara menyeluruh dalam trend, kitaran, momentum dan kuantiti harga, sehingga menghasilkan isyarat perdagangan yang sangat boleh dipercayai.
Selain itu, strategi ini hanya merujuk kepada garis tengah, mengelakkan gangguan bunyi pasaran jangka pendek, dan dapat mengurangkan perdagangan yang tidak perlu. Pada masa yang sama, isyarat strategi jarang berlaku, dan peraturan keluarannya mudah, dapat mengurangkan frekuensi perdagangan dengan ketara, dan mengelakkan masalah perdagangan berlebihan.
Risiko terbesar dalam strategi ini adalah kekurangan mekanisme hentian kerugian. Tidak dapat menghentikan kerugian dalam masa yang tepat apabila pasaran berubah secara mendadak, yang boleh menyebabkan kerugian meluas. Selain itu, kekurangan penapis tambahan, seperti penapis sistem marginal dan penunjuk tenaga, yang boleh menyebabkan tahap perdagangan palsu positif.
Untuk mengurangkan risiko ini, anda boleh menetapkan titik hentian perlindungan, yang secara automatik berhenti apabila kerugian melebihi peratusan tertentu. Di samping itu, anda juga boleh menyertakan indikator momentum seperti MACD untuk verifikasi kedua, untuk mengelakkan risiko yang disebabkan oleh penembusan palsu.
Kaedah ini boleh dioptimumkan dalam beberapa aspek:
Menyertai mekanisme hentian bahaya. Berdasarkan data pengkajian semula sejarah, pengurangan maksimum dikira dan titik hentian yang sesuai ditetapkan.
Menambah penapis. Menambah penapis kepada MACD, Brin dan lain-lain untuk penapisan berlapis untuk mengurangkan isyarat palsu.
Gabungan lebih banyak kitaran masa. Pada masa ini hanya ada satu set parameter, lebih banyak parameter kitaran boleh diperkenalkan, menggunakan kaedah pengesahan multi-sumbu masa, meningkatkan kestabilan.
Parameter penyesuaian dinamik. Modul pengoptimuman parameter ditambah, menyesuaikan parameter penunjuk secara dinamik mengikut keadaan pasaran yang berbeza, menjadikan strategi lebih mudah disesuaikan.
Arbitrage pelbagai jenis: menerapkan strategi untuk pelbagai jenis, mencari peluang untuk melakukan arbitrage, untuk mengawal risiko lebih lanjut.
Strategi ini menggunakan kombinasi yang bijak empat indikator utama Enler, membentuk strategi perdagangan yang menilai trend, kitaran, momentum dan harga kuantitatif. Ia mempunyai keupayaan yang baik untuk menapis bunyi bising dan menghasilkan isyarat berkualiti tinggi. Tetapi kekurangan penapis stop loss dan penapis indikator tambahan menjadikannya berisiko. Dengan menambah stop loss, penapis, lebih banyak kitaran masa, dan lain-lain, ia boleh dioptimumkan dengan berkesan, menjadikan strategi lebih stabil dan boleh dipercayai.
/*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')