Strategi Penembusan Saluran Dinamik

Penulis:ChaoZhang, Tarikh: 2024-02-27 15:15:07
Tag:

img

Ringkasan

Strategi ini menggunakan penunjuk Saluran Keltner, digabungkan dengan garis purata bergerak, untuk menetapkan harga beli dan jual pecah dinamik untuk mencapai operasi terobosan pembelian rendah-penjualan tinggi.

Prinsip Strategi

  1. Mengira median saluran: Gunakan purata bergerak eksponensial untuk mengira median harga saluran
  2. Mengira lebar jalur saluran: Gunakan purata bergerak turun naik sebenar, turun naik sebenar purata atau amplitud harga untuk mengira lebar jalur saluran
  3. Rel atas dan bawah saluran: Median ± N kali lebar jalur saluran
  4. Perintah kemasukan: Apabila harga menyentuh rel atas, tetapkan harga beli terobosan dan tunggu untuk terobosan; apabila harga menyentuh rel bawah, tetapkan harga jual terobosan dan tunggu untuk terobosan
  5. Perintah keluar: Hentikan kerugian apabila harga jatuh kembali ke median selepas membeli, atau apabila harga tertinggi melebihi harga masuk; Hentikan kerugian apabila harga melompat kembali ke median selepas menjual, atau apabila harga terendah lebih rendah daripada harga masuk

Analisis Kelebihan

  1. Menggunakan saluran dinamik boleh dengan cepat menangkap perubahan dalam trend pasaran
  2. Menggunakan median adalah kondusif untuk menilai arah trend harga
  3. N kali tetapan lebar jalur menjadikan julat saluran munasabah untuk mengelakkan pelarasan kedudukan yang kerap
  4. Menggunakan mekanisme terobosan adalah sesuai dengan teori trend dan mengikuti trend
  5. Menetapkan syarat stop loss mengawal risiko dengan ketat

Analisis Risiko

  1. Pilihan kaedah untuk mengira garis median akan mempengaruhi kesan pencocokan julat saluran dan harga
  2. Ganda N yang terlalu besar atau kecil akan mempengaruhi kadar pulangan strategi
  3. Jualan dan pembelian terobosan cenderung membentuk isyarat palsu dan harus dihentikan dengan ketat

Arahan pengoptimuman

  1. Cuba kaedah pengiraan garis median yang berbeza untuk mencari parameter optimum
  2. Uji nilai N yang berbeza untuk mencari pengganda optimum
  3. Meningkatkan amplitudo terobosan untuk mengelakkan isyarat palsu
  4. Mengoptimumkan logik stop loss untuk mengawal kerugian tunggal dengan ketat

Ringkasan

Strategi keseluruhan menggunakan kaedah saintifik dan munasabah untuk menilai trend dan arah harga melalui penunjuk saluran dinamik, menetapkan parameter yang munasabah untuk menangkap isyarat terobosan, mencapai pembelian rendah-penjualan tinggi, dan memperoleh pulangan yang berlebihan. Pada masa yang sama, terus-menerus mengoptimumkan risiko strategi supaya ia dapat berjalan stabil di pelbagai pasaran.


/*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 lanjut