Strategi Pengesanan Trend Berdasarkan ATR dan Indeks Volatiliti

Penulis:ChaoZhang, Tarikh: 2024-01-04 15:31:34
Tag:

img

Ringkasan

Strategi ini menggunakan Julat Benar Purata (ATR) dan indeks CHOP sebagai penunjuk teknikal utama untuk mengenal pasti dan mengesan trend. Ia memasuki apabila indeks memecahkan rel atas dan bawah, digabungkan dengan arah trend sebagai isyarat kemasukan; dan keluar dengan stop loss atau mengambil keuntungan apabila indeks memasuki semula kawasan tali pinggang.

Prinsip Strategi

  1. Gunakan ATR untuk mengira saiz kotak dan membina saluran Renko untuk menentukan arah trend harga.

  2. Menggunakan indeks CHOP untuk menilai sama ada pasaran sesuai untuk perdagangan. Indeks ini menggabungkan harga tertinggi, harga terendah dan ATR. Apabila ia antara 38.2-61.8, ia menunjukkan turun naik pasaran yang rendah; jika tidak, ia menandakan turun naik yang tinggi dan pasaran perdagangan yang tidak sesuai.

  3. Apabila indeks CHOP memecahkan rel atas 61.8, harga memasuki trend menurun. Jika EMA cepat jangka pendek juga menunjukkan harga memimpin, pergi pendek. Sebaliknya, apabila CHOP memecahkan rel bawah 38.2 dan EMA jangka pendek naik, pergi panjang.

  4. Gunakan strategi stop loss/take profit. Apabila harga kembali memasuki kawasan tali pinggang 38.2-61.8 CHOP, tutup kedudukan dengan stop loss atau ambil keuntungan.

Analisis Kelebihan

Strategi ini menggabungkan penilaian trend dan kawalan turun naik, yang boleh menangkap trend harga dan mengawal risiko.

  1. Saluran Renko yang dibina oleh ATR dapat dengan berkesan mengesan trend harga.

  2. Indeks CHOP menilai kadar turun naik pasaran untuk mengelakkan perdagangan yang salah dalam turun naik yang ganas.

  3. Menggabungkan EMA pantas untuk menentukan arah trend jangka pendek mengelakkan operasi terbalik.

  4. Strategi stop loss/take profit mengawal kerugian tunggal.

Analisis Risiko

Risiko utama yang dihadapi oleh strategi ini:

  1. Dalam pasaran sisi, saluran ATR dan isyarat CHOP boleh menghasilkan isyarat yang salah.

  2. Gabungan satu indikator teknikal tidak dapat mengelakkan sepenuhnya kerugian. campur tangan manual diperlukan untuk menentukan trend utama.

  3. kedudukan stop loss ditetapkan terlalu longgar boleh membawa kepada oversized kerugian tunggal.

Arah pengoptimuman

Strategi ini boleh dioptimumkan dalam aspek berikut:

  1. Meningkatkan penunjuk tambahan lain untuk menentukan isyarat, seperti corak candlestick, jumlah dan lain-lain untuk meningkatkan ketepatan isyarat.

  2. Mengoptimumkan parameter ATR dan CHOP untuk menangkap turun naik harga dengan lebih baik.

  3. Tetapkan kedudukan stop loss/take profit yang dinamik untuk margin keuntungan yang lebih besar dan stop loss yang lebih cepat.

  4. Memudahkan julat stop loss dengan betul selepas menentukan trend utama untuk mendapatkan lebih banyak keuntungan dalam trend.

Kesimpulan

Strategi ini mengintegrasikan penunjuk teknikal yang biasa digunakan dan mudah & praktikal. Dengan penyesuaian parameter dan pengoptimuman, kesan penjejakan yang memuaskan dapat diperoleh. Tetapi ia masih memerlukan penilaian manual mengenai trend utama dan tidak boleh sepenuhnya automatik. Ia boleh berfungsi sebagai alat pengambilan keputusan tambahan dan rujukan untuk strategi lain.


/*backtest
start: 2022-12-28 00:00:00
end: 2024-01-03 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © sharatgbhat

//@version=4
strategy("Weis Chop Strategy", overlay=false, default_qty_type = strategy.percent_of_equity, default_qty_value = 10,max_lines_count = 500, max_labels_count = 500)
maxIdLossPcnt = input(1, "Max Intraday Loss(%)", type=input.float)
// strategy.risk.max_intraday_loss(maxIdLossPcnt, strategy.percent_of_equity)

method = input(defval="ATR", options=["ATR", "Traditional", "Part of Price"], title="Renko Assignment Method")
methodvalue = input(defval=14.0, type=input.float, minval=0, title="Value")
pricesource = input(defval="Close", options=["Close", "Open / Close", "High / Low"], title="Price Source")
useClose = pricesource == "Close"
useOpenClose = pricesource == "Open / Close" or useClose
useTrueRange = input(defval="Auto", options=["Always", "Auto", "Never"], title="Use True Range instead of Volume")
isOscillating = input(defval=false, type=input.bool, title="Oscillating")
normalize = input(defval=false, type=input.bool, title="Normalize")
vol = useTrueRange == "Always" or useTrueRange == "Auto" and na(volume) ? tr : volume
op = useClose ? close : open
hi = useOpenClose ? close >= op ? close : op : high
lo = useOpenClose ? close <= op ? close : op : low

if method == "ATR"
    methodvalue := atr(round(methodvalue))
if method == "Part of Price"
    methodvalue := close / methodvalue

currclose = float(na)
prevclose = nz(currclose[1])
prevhigh = prevclose + methodvalue
prevlow = prevclose - methodvalue
currclose := hi > prevhigh ? hi : lo < prevlow ? lo : prevclose

direction = int(na)
direction := currclose > prevclose ? 1 : currclose < prevclose ? -1 : nz(direction[1])
directionHasChanged = change(direction) != 0
directionIsUp = direction > 0
directionIsDown = direction < 0

barcount = 1
barcount := not directionHasChanged and normalize ? barcount[1] + barcount : barcount
vol := not directionHasChanged ? vol[1] + vol : vol
res = barcount > 1 ? vol / barcount : vol

plot(isOscillating and directionIsDown ? -res : res, style=plot.style_columns, color=directionIsUp ? color.green : color.red, transp=75, linewidth=3, title="Wave Volume")

length = input(14, minval=1)
ci = 100 * log10(sum(atr(1), length) / (highest(length) - lowest(length))) / log10(length)
offset = input(0, "Offset", type = input.integer, minval = -500, maxval = 500)
plot(ci, "CHOP", color=#2962FF, offset = offset)
band1 = hline(61.8, "Upper Band", color=#787B86, linestyle=hline.style_dashed)
band0 = hline(38.2, "Lower Band", color=#787B86, linestyle=hline.style_dashed)
fill(band1, band0, color = color.rgb(33, 150, 243, 90), title = "Background")

MomentumBull = close>ema(close,8)
MomentumBear = close<ema(close,8)
Tradecon = crossunder(ci,61.8)

if (MomentumBull and directionIsUp and Tradecon)
	strategy.entry("Buy", strategy.long)
if (MomentumBear and directionIsDown and Tradecon )
    strategy.entry("Sell", strategy.short)
    strategy.exit("exit","Buy",when=directionIsDown,qty_percent=100,profit=20,loss=10)
    strategy.exit("exit","Sell",when=directionIsUp,qty_percent=100,profit=20,loss=10)
    

Lebih lanjut