Strategi Gabungan Penunjuk Osilasi Kuantitatif

Penulis:ChaoZhang, Tarikh: 2024-02-27 16:46:42
Tag:

img

Ringkasan

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 trend, goyangan, momentum dan ciri harga & jumlah.

Prinsip Strategi

Strategi ini menggunakan 4 penunjuk utama untuk penilaian.

Pertama, Ehlers Elegant Oscillator, di mana perbezaan antara garisan asal dan garis isyarat yang dihaluskan oleh purata bergerak eksponensial dapat menentukan arah dan kekuatan trend semasa. Kedua, Ehlers Decycler, yang dapat dengan berkesan mengenal pasti titik terendah kitaran dan menentukan sama ada trend utama berbalik. Seterusnya, Ehlers Instantaneous Trendline mengesan purata bergerak pantas untuk menilai arah trend jangka pendek. Akhirnya, Ehlers Spearman Rank Correlation Coefficient menilai hubungan harga-volume, yang dapat menapis secara berkesan pecah palsu.

Khususnya, empat syarat kemasukan untuk strategi adalah: garis isyarat Elegant Oscillator dan garis isyarat Decycler secara serentak melanggar di atas 0; garis asal melanggar di atas garis Decycler; garis asal lebih tinggi daripada Instantaneous Trendline yang meningkat; dan Gabungan Korrelasi Rank Spearman positif.

Keadaan keluar jauh lebih mudah: keluar apabila garis asal jatuh di bawah Instantaneous Trendline.

Syarat pendek adalah sama dengan syarat panjang, hanya terbalik.

Analisis Kelebihan

Kelebihan terbesar strategi ini terletak pada gabungan penunjuk yang sesuai, yang dapat secara berkesan memanfaatkan kekuatan setiap penunjuk, saling mengesahkan, mengelakkan positif palsu, menapis banyak bunyi bising, dan menghasilkan isyarat yang lebih boleh dipercayai.

Secara khusus, Elegant Oscillator boleh menilai arah trend dan kekuatan, Decycler boleh menilai titik perubahan kitaran, Instantaneous Trendline boleh menilai trend jangka pendek, dan Spearman Rank menilai hubungan harga-volume.

Di samping itu, dengan hanya harga jangka menengah sebagai rujukan, strategi ini mengelakkan gangguan dari bunyi bising pasaran jangka pendek dan mengurangkan perdagangan pembalikan yang tidak perlu.

Analisis Risiko

Risiko terbesar strategi ini adalah kekurangan mekanisme stop loss. Dalam kes pergerakan pasaran yang ganas, ketidakupayaan untuk menghentikan kerugian tepat pada masanya boleh membawa kepada kerugian yang lebih besar. Ia juga tidak mempunyai penapis tambahan seperti Saluran Donchian dan penunjuk tenaga yang boleh membawa kepada beberapa tahap perdagangan positif palsu.

Untuk mengurangkan risiko ini, stop loss perlindungan boleh ditetapkan untuk menghentikan kerugian secara automatik apabila kerugian melebihi tahap tertentu.

Arahan pengoptimuman

Strategi ini boleh dioptimumkan dalam aspek berikut:

  1. Tambahkan mekanisme pengurusan risiko stop loss. Hitung pengeluaran sejarah maksimum untuk menetapkan tahap stop loss yang sesuai.

  2. Tambah lebih banyak penapis. Tambah penunjuk seperti MACD, Bollinger Bands untuk penapis yang lebih untuk mengurangkan isyarat palsu.

  3. Masukkan lebih banyak bingkai masa. Pada masa ini hanya satu set parameter yang digunakan. Lebih banyak bingkai masa boleh ditambah untuk pengesahan pelbagai bingkai masa untuk meningkatkan kestabilan.

  4. Tambahkan pengoptimuman parameter untuk menyesuaikan parameter indikator secara dinamik berdasarkan keadaan pasaran yang berubah untuk meningkatkan kesesuaian.

  5. Arbitraj cross-aset: Menggunakan strategi pada aset yang berbeza untuk mencari peluang arbitrase untuk mengawal risiko dengan lebih baik.

Kesimpulan

Strategi ini dengan bijak menggabungkan 4 penunjuk Ehlers utama untuk membentuk strategi yang menilai trend, kitaran, momentum dan jumlah harga dalam semua aspek. Ia mempunyai keupayaan penapisan bunyi yang luar biasa dan dapat menghasilkan isyarat berkualiti tinggi. Tetapi kekurangan kerugian berhenti dan penapisan penunjuk tambahan mendedahkannya kepada beberapa risiko. Dengan menambah kerugian berhenti, penapis, lebih banyak kerangka masa dan lain-lain, ia dapat dioptimumkan dengan berkesan untuk kestabilan dan kebolehpercayaan 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')



Lebih lanjut