Strategi Terobosan Saluran Dinamis

Penulis:ChaoZhangTanggal: 2024-02-27 15:15:07
Tag:

img

Gambaran umum

Strategi ini menggunakan indikator Saluran Keltner, dikombinasikan dengan garis rata-rata bergerak, untuk menetapkan harga beli dan jual break-out dinamis untuk mencapai operasi break-through low-buy-high-sell.

Prinsip Strategi

  1. Menghitung median saluran: Gunakan rata-rata bergerak eksponensial untuk menghitung median harga saluran
  2. Menghitung bandwidth saluran: Gunakan rata-rata bergerak dari volatilitas sebenarnya, rata-rata volatilitas sebenarnya atau amplitudo harga untuk menghitung bandwidth saluran
  3. Saluran rel atas dan bawah: Median ± N kali lebar pita saluran
  4. Perintah masuk: Ketika harga menyentuh rel atas, atur harga beli terobosan dan tunggu terobosan; ketika harga menyentuh rel bawah, atur harga jual terobosan dan tunggu terobosan
  5. Perintah keluar: Stop loss ketika harga jatuh kembali ke median setelah membeli, atau ketika harga tertinggi melebihi harga masuk; Stop loss ketika harga bangkit kembali ke median setelah menjual, atau ketika harga terendah lebih rendah dari harga masuk

Analisis Keuntungan

  1. Menggunakan saluran dinamis dapat dengan cepat menangkap perubahan tren pasar
  2. Menggunakan median membantu menilai arah tren harga
  3. N kali pengaturan bandwidth membuat rentang saluran wajar untuk menghindari penyesuaian posisi yang sering
  4. Menggunakan mekanisme terobosan sesuai dengan teori tren dan mengikuti tren
  5. Menetapkan kondisi stop loss mengontrol risiko secara ketat

Analisis Risiko

  1. Pilihan metode untuk menghitung garis median akan mempengaruhi efek pencocokan rentang saluran dan harga
  2. N multiples yang terlalu besar atau kecil akan mempengaruhi tingkat pengembalian strategi
  3. Penjualan dan pembelian terobosan cenderung membentuk sinyal palsu dan harus benar-benar dihentikan

Arahan Optimasi

  1. Coba metode perhitungan garis median yang berbeda untuk menemukan parameter optimal
  2. Uji nilai N yang berbeda untuk menemukan pengganda optimal
  3. Tingkatkan amplitudo untuk menghindari sinyal palsu.
  4. Mengoptimalkan logika stop loss untuk mengontrol kerugian tunggal secara ketat

Ringkasan

Strategi keseluruhan menggunakan metode ilmiah dan wajar untuk menilai tren harga dan arah melalui indikator saluran dinamis, menetapkan parameter yang wajar untuk menangkap sinyal terobosan, mencapai pembelian rendah-penjualan tinggi, dan mendapatkan keuntungan berlebih. Pada saat yang sama, terus-menerus mengoptimalkan risiko strategi sehingga dapat berjalan stabil di berbagai pasar.


/*backtest
start: 2024-01-27 00:00:00
end: 2024-02-26 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy(title="Keltner Strategy", overlay=true)
length = input.int(20, minval=1)
mult = input.float(2.0, "Multiplier")
src = input(close, title="Source")
exp = input(true, "Use Exponential MA")
BandsStyle = input.string("Average True Range", options = ["Average True Range", "True Range", "Range"], title="Bands Style")
atrlength = input(10, "ATR Length")
esma(source, length)=>
	s = ta.sma(source, length)
	e = ta.ema(source, length)
	exp ? e : s
ma = esma(src, length)
rangema = BandsStyle == "True Range" ? ta.tr(true) : BandsStyle == "Average True Range" ? ta.atr(atrlength) : ta.rma(high - low, length)
upper = ma + rangema * mult
lower = ma - rangema * mult
crossUpper = ta.crossover(src, upper)
crossLower = ta.crossunder(src, lower)
bprice = 0.0
bprice := crossUpper ? high+syminfo.mintick : nz(bprice[1])
sprice = 0.0
sprice := crossLower ? low -syminfo.mintick : nz(sprice[1])
crossBcond = false
crossBcond := crossUpper ? true
     : na(crossBcond[1]) ? false : crossBcond[1]
crossScond = false
crossScond := crossLower ? true
     : na(crossScond[1]) ? false : crossScond[1]
cancelBcond = crossBcond and (src < ma or high >= bprice )
cancelScond = crossScond and (src > ma or low <= sprice )
if (cancelBcond)
	strategy.cancel("KltChLE")
if (crossUpper)
	strategy.entry("KltChLE", strategy.long, stop=bprice, comment="KltChLE")
if (cancelScond)
	strategy.cancel("KltChSE")
if (crossLower)
	strategy.entry("KltChSE", strategy.short, stop=sprice, comment="KltChSE")

Lebih banyak