Strategi kombinasi indikator osilasi kuantitatif

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

img

Gambaran umum

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.

Prinsip Strategi

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.

Analisis Keuntungan

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.

Analisis Risiko

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.

Arahan Optimasi

Strategi dapat dioptimalkan dalam aspek berikut:

  1. Tambahkan mekanisme manajemen risiko stop loss.

  2. Tambahkan lebih banyak filter. Tambahkan indikator seperti MACD, Bollinger Bands untuk lebih banyak penyaringan untuk lebih mengurangi sinyal palsu.

  3. Masukkan lebih banyak timeframe. Saat ini hanya satu set parameter yang digunakan. Lebih banyak timeframe dapat ditambahkan untuk verifikasi multi-timeframe untuk meningkatkan stabilitas.

  4. Tambahkan optimasi parameter untuk menyesuaikan parameter indikator secara dinamis berdasarkan perubahan kondisi pasar untuk meningkatkan kemampuan beradaptasi.

  5. Arbitrage lintas aset: menerapkan strategi pada aset yang berbeda untuk mencari peluang arbitrase untuk mengontrol risiko dengan lebih baik.

Kesimpulan

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')



Lebih banyak