
Strategi kitaran rawak Ells adalah strategi perdagangan kuantitatif yang menggunakan indikator kitaran rawak Ells untuk menghasilkan isyarat perdagangan. Strategi ini menggabungkan kelebihan indikator rawak dan indikator kitaran untuk merebut peluang kitaran di pasaran.
Strategi ini mula-mula membina indikator kitaran yang diluruskan, dan kemudian membina nilai indikator rawak berdasarkan indikator tersebut. Penciptaan isyarat perdagangan ditentukan berdasarkan persilangan purata bergerak nilai indikator rawak ini.
Khususnya, kaedah pengiraan indikator kitaran halus adalah:
smooth = (src + 2 * src[1] + 2 * src[2] + src[3]) / 6
Di mana src adalah data harga input, seperti harga penutupan. Indikator ini menggabungkan harga semasa dan harga 3 tempoh masa sebelumnya untuk membina isyarat kitaran yang lancar.
Berdasarkan indikator yang diluruskan, kitaran indikator rawak dapat dikira:
cycle := (1 - .5 * alpha) * (1 - .5 * alpha) *
(smooth - 2 * smooth[1] + smooth[2]) +
2 * (1 - alpha) * cycle[1] -
(1 - alpha) * (1 - alpha) * cycle[2]
Rumus pengiraan ini merangkumi pembahagian dua-kelas untuk isyarat kitaran selepas kelancaran, dan nilai dua kitaran sebelumnya. α adalah faktor kelancaran, yang menyesuaikan berat nilai kitaran baru dan lama.
Akhirnya, berdasarkan indikator kitaran ini, nilai 1 yang berjumlah 0-100 dikira secara rawak dan berdasarkan purata bergerak 10 hari nilai 1 membina nilai isyarat. Isyarat perdagangan dikeluarkan apabila isyarat melintasi atau melintasi purata bergerak isyarat.
Strategi ini menggabungkan penunjuk rawak dan penunjuk kitaran, menggabungkan kelebihan kedua-duanya. Strategi ini dapat menangkap peluang berkala dengan lebih baik dan dengan itu mendapat kesan yang lebih baik daripada strategi trend seperti purata bergerak yang mudah.
Kelebihan utama:
Strategi ini mempunyai risiko utama:
Risiko boleh dikawal dengan cara seperti menetapkan parameter yang dioptimumkan, menetapkan titik henti, dan menggabungkan dengan penapis lain.
Strategi ini juga boleh dioptimumkan dalam beberapa arah:
Strategi kitaran rawak Ells menggabungkan kelebihan indikator rawak dan indikator kitaran, mengawal risiko dengan berkesan melalui reka bentuk isyarat ganda, dan dapat memperoleh hasil yang lebih baik di pasaran yang lebih berkitar-kitar. Dengan pengoptimuman lanjut, strategi ini boleh menjadi strategi perdagangan kuantitatif yang disyorkan.
/*backtest
start: 2024-01-09 00:00:00
end: 2024-01-16 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/
//@version=3
strategy("Ehlers Stochastic Cyber Cycle 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)
src = input(hl2, title = "Source")
alpha = input(.07, title = "Alpha")
lag = input(9, title = "Lag")
smooth = (src + 2 * src[1] + 2 * src[2] + src[3]) / 6
len = input(8, title = "Stochastic len")
cycle = na
if na(cycle[7])
cycle := (src - 2 * src[1] + src[2]) / 4
else
cycle := (1 - .5 * alpha) * (1 - .5 * alpha) * (smooth - 2 * smooth[1] + smooth[2]) + 2 * (1 - alpha) * cycle[1] - (1 - alpha) * (1 - alpha) * cycle[2]
value1 = stoch(cycle, cycle, cycle, len) / 100
value2 = 2 * ((4 * value1 + 3 * value1[1] + 2 * value1[2] + value1[3]) / 10 - 0.5)
signal = value2
oppositeTrade = input(true)
barsSinceEntry = 0
barsSinceEntry := nz(barsSinceEntry[1]) + 1
if strategy.position_size == 0
barsSinceEntry := 0
if (crossover(signal, signal[1]) and not oppositeTrade) or (oppositeTrade and crossunder(signal, signal[1]))
strategy.entry("Long", strategy.long)
barsSinceEntry := 0
if (crossunder(signal, signal[1]) and not oppositeTrade) or (oppositeTrade and crossover(signal, signal[1]))
strategy.entry("Short", strategy.short)
barsSinceEntry := 0
if strategy.openprofit < 0 and barsSinceEntry > 8
strategy.close_all()
barsSinceEntry := 0
plot(0, title="ZeroLine", color=gray)
plotSrc = signal
cyclePlot = plot(plotSrc, title = "CyberCycle", color = blue)
triggerPlot = plot(plotSrc[1], title = "Trigger", color = green)
fill(cyclePlot, triggerPlot, color = plotSrc < plotSrc[1] ? red : lime, transp = 50)