Strategi Pelacakan Tren Berdasarkan ATR dan Indeks Volatilitas

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

img

Gambaran umum

Strategi ini menggunakan Average True Range (ATR) dan indeks CHOP sebagai indikator teknis utama untuk mengidentifikasi dan melacak tren. Ini masuk ketika indeks menembus rel atas dan bawah, dikombinasikan dengan arah tren sebagai sinyal masuk; dan keluar dengan stop loss atau take profit ketika indeks kembali memasuki area sabuk.

Prinsip Strategi

  1. Gunakan ATR untuk menghitung ukuran kotak dan membangun saluran Renko untuk menentukan arah tren harga.

  2. Menggunakan indeks CHOP untuk menilai apakah pasar cocok untuk perdagangan. Indeks ini menggabungkan harga tertinggi, harga terendah dan ATR. Ketika berada di antara 38.2-61.8, ini menunjukkan volatilitas pasar yang rendah; jika tidak, ini menandakan volatilitas tinggi dan pasar perdagangan yang tidak cocok.

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

  4. Gunakan strategi stop loss/take profit. Ketika harga kembali memasuki area sabuk 38.2-61.8 CHOP, tutup posisi dengan stop loss atau take profit.

Analisis Keuntungan

Strategi ini menggabungkan penilaian tren dan kontrol volatilitas, yang dapat menangkap tren harga dan mengendalikan risiko.

  1. Saluran Renko yang dibangun oleh ATR dapat secara efektif melacak tren harga.

  2. Indeks CHOP menilai tingkat volatilitas pasar untuk menghindari perdagangan yang salah dalam fluktuasi yang keras.

  3. Menggabungkan EMA cepat untuk menentukan arah tren jangka pendek menghindari operasi terbalik.

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

Analisis Risiko

Risiko utama yang dihadapi strategi ini:

  1. Pada pasar sisi, sinyal saluran ATR dan CHOP dapat menghasilkan sinyal yang salah.

  2. Kombinasi indikator teknis tunggal tidak dapat sepenuhnya menghindari kerugian.

  3. Posisi stop loss yang diatur terlalu longgar dapat menyebabkan oversized loss tunggal.

Arah Optimalisasi

Strategi ini dapat dioptimalkan dalam aspek berikut:

  1. Meningkatkan indikator tambahan lainnya untuk menentukan sinyal, seperti pola candlestick, volume dll untuk meningkatkan akurasi sinyal.

  2. Mengoptimalkan parameter ATR dan CHOP untuk menangkap fluktuasi harga dengan lebih baik.

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

  4. Dengan benar melonggarkan stop loss range setelah menentukan tren utama untuk mendapatkan lebih banyak keuntungan dalam tren.

Kesimpulan

Strategi ini mengintegrasikan indikator teknis yang umum digunakan dan sederhana & praktis. Dengan penyesuaian parameter dan optimasi, efek pelacakan yang memuaskan dapat diperoleh. Tetapi masih membutuhkan penilaian manual tren utama dan tidak dapat sepenuhnya otomatis. Ini dapat berfungsi sebagai alat pengambilan keputusan tambahan dan referensi 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 banyak