Strategi penunjuk pembukaan berkuasa berbilang dimensi pakar kuantitatif


Tarikh penciptaan: 2024-01-19 14:55:03 Akhirnya diubah suai: 2024-01-19 14:55:03
Salin: 0 Bilangan klik: 699
1
fokus pada
1617
Pengikut

Strategi penunjuk pembukaan berkuasa berbilang dimensi pakar kuantitatif

Gambaran keseluruhan

Strategi ini menggunakan kombinasi pelbagai indikator kekuatan seperti Aroon, MA, BB, Williams,% R, ADX dan lain-lain dalam pelbagai kitaran yang berbeza, untuk membentuk indikator kekuatan berbilang dimensi, yang dapat membuka posisi yang cekap apabila trendnya jelas.

Prinsip Strategi

Strategi ini memberi isyarat untuk membuka kedudukan yang kuat melalui gabungan beberapa indikator berikut:

  1. Indeks Aroon: Mengira harga tertinggi dan terendah dalam tempoh tertentu, membentuk indikator goyah, dan menilai arah trend melalui gabungan indikator Aroon dari beberapa tempoh Length.

  2. Garis purata MA: mengira garis purata MA untuk tempoh pendek dan jangka panjang untuk menentukan titik perubahan trend.

  3. BB Binary: Isyarat untuk menjual apabila harga melepasi Binary.

  4. Indikator Williams %R: Indikator ini membentuk penyimpangan di kawasan overbought dan oversold sebagai isyarat untuk membuka kedudukan.

  5. Indeks pergerakan arah purata ADX: menilai kekuatan trend, ADX menghasilkan isyarat bukaan kedudukan apabila lebih tinggi daripada kedudukan tertentu.

Pelbagai penunjuk di atas, melalui parameter Panjang Tempoh yang berbeza, membentuk sistem penghakiman berbilang dimensi, apabila trend lebih jelas, beberapa penunjuk dapat membentuk isyarat pembukaan kedudukan yang kuat.

Termasuklah syarat-syarat pembelian:

  1. Aroon_1 di bawah 85
  2. Apabila MA rata-rata membentuk garpu
  3. Williams %R kurang daripada -99
  4. ADX lebih tinggi daripada 14
  5. Aroon_2 lebih tinggi daripada -39.

Apabila 3 daripada 5 syarat pembelian di atas dipenuhi, ia menghasilkan isyarat pembelian yang kuat.

Terdapat 5 syarat jual, apabila 3 daripadanya dipenuhi, ia akan menghasilkan isyarat jual.

Oleh itu, strategi ini menggunakan gabungan pelbagai petunjuk yang berbeza untuk menghasilkan isyarat bukaan posisi yang kuat dengan kepastian tinggi apabila trend jelas.

Analisis kelebihan

Kelebihan terbesar strategi ini adalah kombinasi pelbagai dimensi isyarat penunjuk, yang mengurangkan kemungkinan isyarat salah yang disebabkan oleh satu penunjuk, dan dengan itu dapat menghasilkan isyarat pembukaan kedudukan yang berkualiti tinggi apabila trend lebih jelas, yang merupakan kelebihan utama strategi ini.

Kelebihan lain ialah:

  1. Dengan penyesuaian parameter, ia dapat menyesuaikan diri dengan ciri-ciri pasaran yang berbeza

  2. Penetapan parameter penunjuk adalah saintifik, parameter yang lebih tinggi

  3. Menerima kombinasi pelbagai kitaran masa, meningkatkan ketepatan penilaian

  4. Struktur kod jelas, mudah difahami dan digunakan semula

Analisis risiko

Strategi ini juga mempunyai risiko:

  1. Kombinasi pelbagai indikator meningkatkan kualiti penghakiman, tetapi juga meningkatkan kerumitan strategi dan memperluas risiko terlalu optimum

  2. Tetapan parameter tidak 100 peratus sempurna dan mungkin tidak berfungsi dalam pasaran tertentu

  3. Terdapat ruang untuk pengoptimuman dalam cara penyenaraian indeks, dan logik penyenaraian boleh diperhalusi lagi

  4. Peluang untuk penyesuaian jangka pendek mungkin terlepas

Penyelesaian:

  1. Peningkatan kebolehpercayaan sampel, parameter ujian

  2. Menyesuaikan beberapa parameter untuk memenuhi lebih banyak pasaran

  3. Mengoptimumkan cara penggabungan penunjuk untuk meningkatkan kualiti penilaian

  4. Memperingkat parameter indeks dengan tepat, meningkatkan tangkapan untuk penyesuaian jangka pendek

Arah pengoptimuman

Arahan pengoptimuman utama dalam strategi ini adalah pengoptimuman cara pengintegrasian petunjuk, terutamanya:

  1. Tambah lebih banyak jenis penunjuk untuk membentuk hutan penunjuk, meningkatkan lagi ketepatan penilaian

  2. Pengaturan parameter penunjuk yang dioptimumkan supaya dapat menyesuaikan diri dengan perubahan pasaran secara automatik

  3. Menggunakan kaedah pembelajaran mesin dan lain-lain untuk mencari penyelesaian integrasi metrik yang optimum secara automatik

  4. Meningkatkan strategi henti kerugian untuk mengawal risiko

  5. Menggabungkan indikator sentimen dan lain-lain untuk menilai suhu pasaran, parameter penyesuaian dinamik

Dengan mengintegrasikan lebih banyak petunjuk, parameter pengoptimuman automatik, dan penyelesaian integrasi, terdapat ruang untuk meningkatkan kualiti penghakiman dan ketangguhan strategi ini.

ringkaskan

Kelebihan terbesar strategi ini adalah integrasi saintifik pelbagai petunjuk, membentuk isyarat membuka kedudukan yang kuat, dan kesan yang ketara apabila trend jelas. Terdapat banyak ruang untuk pengoptimuman strategi ini, dengan memperkenalkan lebih banyak petunjuk, dan pengoptimuman pintar parameter dan cara integrasi, strategi ini boleh menjadi strategi perdagangan kuantitatif yang sangat kuat.

Kod sumber strategi
/*backtest
start: 2023-12-19 00:00:00
end: 2024-01-18 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title="Aroon+Williams+MA2+ADX+Aroon Str.", shorttitle="Aroon+Williams+MA2+ADX+Aroon Str.", overlay=true)
//https://cafe.naver.com/watchbot/1945
//<<빙썸 매각 기념>> 바이낸스 이오스 복합지표	

//Aroon_1
length_1 = input(264, minval=1, title="Length Aroon_1")
upper_1 = 100 * (highestbars(high, length_1+1) + length_1)/length_1
lower_1 = 100 * (lowestbars(low, length_1+1) + length_1)/length_1
midp_1 = 0
oscillator_1 = upper_1 - lower_1
//osc_1 = plot(oscillator_1, color=red)

//Aroon_2
length_2 = input(72, minval=1, title="Length Aroon_2")
upper_2 = 100 * (highestbars(high, length_2+1) + length_2)/length_2
lower_2 = 100 * (lowestbars(low, length_2+1) + length_2)/length_2
midp_2 = 0
oscillator_2 = upper_2 - lower_2
//osc_2 = plot(oscillator_2, color=red)

//Aroon_3
length_3 = input(137, minval=1, title="Length Aroon_3")
upper_3 = 100 * (highestbars(high, length_3+1) + length_3)/length_3
lower_3 = 100 * (lowestbars(low, length_3+1) + length_3)/length_3
midp_3 = 0
oscillator_3 = upper_3 - lower_3
//osc_3 = plot(oscillator_3, color=red)

//Aroon_4
length_4 = input(62, minval=1, title="Length Aroon_4")
upper_4 = 100 * (highestbars(high, length_4+1) + length_4)/length_4
lower_4 = 100 * (lowestbars(low, length_4+1) + length_4)/length_4
midp_4 = 0
oscillator_4 = upper_4 - lower_4
//osc_4 = plot(oscillator_4, color=red)

//Ma double
short_ma_1 = sma(close, 9)
long_ma_1 = sma(close, 21)
// plot(short_ma_1, color = red)
// plot(long_ma_1, color = green)
// plot(cross(short_ma_1, long_ma_1) ? short_ma_1 : na, style = cross, linewidth = 4)

short_ma_2 = sma(close, 9)
long_ma_2 = sma(close, 21)
// plot(short_ma_2, color = red)
// plot(long_ma_2, color = green)
plot(cross(short_ma_2, long_ma_2) ? short_ma_2 : na, transp= 100, title = "ma cross_2", style = cross, linewidth = 4)

//BB
length_bb = input(270, minval=1, title="BB length")
src_bb = input(close, title="Source")
mult_bb = input(2.0, minval=0.001, maxval=50, title="BB mult")
basis_bb = sma(src_bb, length_bb)
dev_bb = mult_bb * stdev(src_bb, length_bb)
upper_bb = basis_bb + dev_bb
lower_bb = basis_bb - dev_bb
// plot(basis_bb, color=red)
// p1 = plot(upper_bb, color=blue)
// p2 = plot(lower_bb, color=blue)
// fill(p1, p2)

//Williams
length_wil = input(130, minval=1, title="Length Williams %R")
upper_wil = highest(length_wil)
lower_wil = lowest(length_wil)
out_wil = 100 * (close - upper_wil) / (upper_wil - lower_wil)
// plot(out_wil)
// band1 = hline(-20)
// band0 = hline(-80)
// fill(band1, band0)



//ADX
adxlen = input(14, title="ADX Smoothing")
dilen = input(145, title="DI Length")
dirmov(len) =>
	up_adx = change(high)
	down_adx = -change(low)
	plusDM = na(up_adx) ? na : (up_adx > down_adx and up_adx > 0 ? up_adx : 0)
    minusDM = na(down_adx) ? na : (down_adx > up_adx and down_adx > 0 ? down_adx : 0)
	truerange = rma(tr, len)
	plus_adx = fixnan(100 * rma(plusDM, len) / truerange)
	minus_adx = fixnan(100 * rma(minusDM, len) / truerange)
	[plus_adx, minus_adx]

adx(dilen, adxlen) =>
	[plus_adx, minus_adx] = dirmov(dilen)
	sum_adx = plus_adx + minus_adx
	adx = 100 * rma(abs(plus_adx - minus_adx) / (sum_adx == 0 ? 1 : sum_adx), adxlen)

sig_adx = adx(dilen, adxlen)

// plot(sig_adx, color=red, title="ADX")


//ADX 2
adxlen_2 = input(14, title="ADX Smoothing")
dilen_2 = input(150, title="DI Length")
dirmov_2(len) =>
	up_adx_2 = change(high)
	down_adx_2 = -change(low)
	plusDM_2 = na(up_adx_2) ? na : (up_adx_2 > down_adx_2 and up_adx_2 > 0 ? up_adx_2 : 0)
    minusDM_2 = na(down_adx_2) ? na : (down_adx_2 > up_adx_2 and down_adx_2 > 0 ? down_adx_2 : 0)
	truerange_2 = rma(tr, len)
	plus_adx_2 = fixnan(100 * rma(plusDM_2, len) / truerange_2)
	minus_adx_2 = fixnan(100 * rma(minusDM_2, len) / truerange_2)
	[plus_adx_2, minus_adx_2]

adx_2(dilen_2, adxlen_2) =>
	[plus_adx_2, minus_adx_2] = dirmov_2(dilen_2)
	sum_adx_2 = plus_adx_2 + minus_adx_2
	adx_2 = 100 * rma(abs(plus_adx_2 - minus_adx_2) / (sum_adx_2 == 0 ? 1 : sum_adx_2), adxlen_2)

sig_adx_2 = adx(dilen_2, adxlen_2)

// plot(sig_adx_2, color=red, title="ADX_2")

//Input Position
//buy position
pos_aroon1 = input(-85, title="Aroon_1 Position Index_Down")
pos_madouble1_short = input(117, title="ma double_1 wma_Short")
pos_madouble1_long =  input(86, title="ma double_1 sma_Long")
pos_wil = input(-99, title="Williams Position Index_Down")
pos_adx= input(14, title="ADX Position Index_Up")
pos_aroon2 = input(-39, title="Aroon_2 Position Index_Up")

//sell position
pos_bb = input(120, title="BB Position Index_Up")
pos_aroon_3 = input(99, title="Aroon_3 Position Index_Up")
pos_madouble2_short= input(88, title="ma double_2 ema_Short")
pos_madouble2_long= input(96, title="ma double_2 sma_Long")
pos_adx_2= input(9, title="ADX_2 Position Index_Up")
pos_aroon_4 = input(35, title="Aroon_4 Position Index_Down")

//Condition
longCondition_aroon_1 = (oscillator_1 <= pos_aroon1)
longCondition_ma2 = (pos_madouble1_short > pos_madouble1_long)
longCondition_wil = (out_wil <= pos_wil)
longCondition_adx = (sig_adx >= pos_adx)
longCondition_aroon_2 = (oscillator_2 >= pos_aroon2)

shortCondition_bb = (close > basis_bb)
shortCondition_aroon_3 = (oscillator_3 >= pos_aroon_3)
shortCondition_ma2 = (pos_madouble2_short < pos_madouble2_long)
shortCondition_adx = (sig_adx_2 >= pos_adx_2)
shortCondition_aroon_4 = (oscillator_4 <= pos_aroon_4)

vl_aroon_1 = 0
vl_ma2 = 0
vl_wil = 0
vl_adx = 0
vl_aroon_2 = 0

if longCondition_aroon_1
    vl_aroon_1 := 1
    
if longCondition_ma2
    vl_ma2 := 3

if longCondition_wil
    vl_wil := 1
    
if longCondition_adx
    vl_adx := -1

if longCondition_aroon_2
    vl_aroon_2 := -1
	

vs_bb = 0
vs_aroon_3 = 0
vs_ma2 = 0
vs_adx = 0
vs_aroon_4 = 0

if shortCondition_bb
    vs_bb := 1

if shortCondition_aroon_3
    vs_aroon_3 := 1
    
if shortCondition_ma2
    vs_ma2 := 3

if shortCondition_adx
    vs_adx := -2

if shortCondition_aroon_4
    vs_aroon_4 := -1

// plotshape(vl_aroon_1, title= "vl_aroon_1", location=location.belowbar, color=green, text="vl_aroon_1")
// plotshape(vl_ma2, title= "vl_ma2", location=location.belowbar, color=green, text="\nvl_ma2")
// plotshape(vl_wil, title= "vl_wil", location=location.belowbar, color=green, text="\n\nvl_wil")
// plotshape(vl_adx, title= "vl_adx", location=location.belowbar, color=green, text="\n\n\nvl_adx")
// plotshape(vl_aroon_2, title= "vl_aroon_2", location=location.belowbar, color=green, text="\n\n\n\nvl_aroon_2")

// plotshape(vs_bb, title= "vs_bb", location=location.abovebar, color=orange, text="vs_bb")
// plotshape(vs_aroon_3, title= "vs_aroon_3", location=location.abovebar, color=orange, text="vs_aroon_3\n")
// plotshape(vs_ma2, title= "vs_ma2", location=location.abovebar, color=orange, text="vs_ma2\n\n")
// plotshape(vs_adx, title= "vs_adx", location=location.abovebar, color=orange, text="vs_adx\n\n\n")
// plotshape(vs_aroon_4, title= "vs_aroon_4", location=location.abovebar, color=orange, text="vs_aroon_4\n\n\n\n")

longCondition = (vl_aroon_1 + vl_ma2 + vl_wil + vl_adx + vl_aroon_2) >= 3 ? true : na
shortCondition = (vs_bb + vs_aroon_3 + vs_ma2 + vs_adx + vs_aroon_4) >= 3 ? true : na

buy = longCondition == 1 ? longCondition : na
sell = shortCondition == 1? shortCondition : na

// plotshape(buy, title= "buy", location=location.bottom, color=green, text="buy")
// plotshape(sell, title= "sell", location=location.top, color=orange, text="sell")


// === BACKTEST RANGE ===
FromMonth = input(defval = 8, title = "From Month", minval = 1, maxval = 12)
FromDay   = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
FromYear  = input(defval = 2018, title = "From Year", minval = 2014)
ToMonth   = input(defval = 12, title = "To Month", minval = 1, maxval = 12)
ToDay     = input(defval = 31, title = "To Day", minval = 1, maxval = 31)
ToYear    = input(defval = 2018, title = "To Year", minval = 2014)

strategy.entry("L", strategy.long, when=(buy))
strategy.close("L", when=(sell))
// strategy.entry("S", strategy.short, when=(sell and (time >= timestamp(FromYear, FromMonth, FromDay, 00, 00)) and (time <= timestamp(ToYear, ToMonth, ToDay, 23, 59))))
// strategy.close("S", when=(buy and (time <= timestamp(ToYear, ToMonth, ToDay, 23, 59))))