Strategi Pencari Trend Laser Berganda

Penulis:ChaoZhang, Tarikh: 2023-11-06 10:01:42
Tag:

img

Ringkasan

Strategi ini menggunakan Bollinger Bands, Saluran Keltner dan Indeks Kekuatan Relatif Adaptif untuk menentukan arah trend semasa, digabungkan dengan Parabolic SAR untuk masa kemasukan. Isyarat perdagangan dihasilkan apabila penghakiman ketiga-tiga penunjuk ini bersetuju. Strategi ini terutamanya menilai arah trend dan memasuki dengan tepat pada masanya apabila trend berubah, bertujuan untuk keuntungan.

Prinsip-prinsip

Strategi ini menggabungkan tiga penunjuk teknikal berikut untuk menentukan trend semasa:

  1. SQUEEZE Momentum Indicator: Mengira Bollinger Bands dan Saluran Keltner. Apabila kedua-dua jalur bertindih, ia menghasilkan pemampatan dan menandakan perubahan trend yang akan datang. Ia mengembalikan status pemampatan dan cerun regresi linear.

  2. RSI Volume Weighted: Mengira RSI yang diberi berat oleh jumlah. Menggunakan titik tengah untuk menentukan tahap overbought / oversold. Ia menekankan perubahan jumlah.

  3. SAR Parabolik: Menghakimi lokasi harga semasa berbanding garis SAR. SAR di atas harga menunjukkan trend menurun sementara SAR di bawah harga menunjukkan trend menaik.

Strategi ini menggunakan Bollinger Bands untuk menentukan arah trend, Saluran Keltner untuk menyempurnakannya, RSI untuk mencari peluang pembalikan apabila overbought / oversold, dan SAR untuk masa kemasukan.

  1. Mengira Bollinger Bands, Saluran Keltner, Squeeze penunjuk.

  2. Mengira RSI berwajaran jumlah. RSI di atas titik tengah menunjukkan trend menaik, di bawah titik tengah trend menurun.

  3. Mengira SAR Parabolik. SAR di bawah harga menunjukkan trend menaik, di atas harga menunjukkan trend menurun.

  4. Gabungkan ketiga-tiga penunjuk: apabila tekanan berlaku, RSI naik ke atas titik tengah, SAR di bawah harga, isyarat panjang dihasilkan. Apabila tekanan berlaku, RSI turun ke bawah titik tengah, SAR di atas harga, isyarat pendek dihasilkan.

  5. Apabila isyarat dicetuskan, periksa sama ada penghakiman tiga penunjuk pada bar sebelumnya adalah bertentangan dengan isyarat semasa.

  6. Tetapkan stop loss dan ambil keuntungan selepas masuk, stop loss yang tertinggal.

Kelebihan

Kelebihan strategi ini:

  1. Gabungan pelbagai penunjuk meningkatkan ketepatan penilaian trend. Squeeze dengan tepat mengesan perubahan trend, RSI dengan jelas mengenal pasti tahap overbought / oversold, SAR dengan tepat kali entri.

  2. Logik penunjuk adalah mudah dan mudah difahami.

  3. Pengesahan pelbagai penunjuk membantu menapis gangguan palsu.

  4. Stop loss dan mengambil keuntungan mekanisme kunci dalam keuntungan dan had risiko.

  5. Data backtest yang luas memastikan kebolehpercayaan.

Risiko

Terdapat juga beberapa risiko:

  1. Logik kemasukan panjang dan pendek adalah sama dan boleh menghasilkan isyarat yang bertentangan.

  2. Semua penunjuk menggunakan pengoptimuman parameter, risiko overfitting.

  3. Frekuensi perdagangan yang tinggi, saiz kedudukan memerlukan kawalan.

  4. Stop loss mungkin terlalu dekat dan mudah dihentikan.

Penyelesaian:

  1. Tambah pemeriksaan kepekatan pada penilaian penunjuk untuk mengelakkan goyangan isyarat.

  2. Gunakan analisis berjalan ke hadapan untuk menyesuaikan parameter dan mengelakkan pemasangan berlebihan.

  3. Tetapkan saiz piramid untuk mengawal kedudukan setiap arah.

  4. Uji pelbagai julat stop loss untuk mengoptimumkan harga stop loss.

Arahan pengoptimuman

Beberapa arah untuk mengoptimumkan strategi:

  1. Mengoptimumkan parameter penunjuk untuk kestabilan.

  2. Tambah logik saiz kedudukan seperti peratusan tetap / sama.

  3. Uji kaedah stop loss yang berbeza seperti turun naik atau berhenti linear, kedudukan nol dll.

  4. Tambah pengurusan wang seperti saiz kedudukan pecahan tetap.

  5. Gunakan model pembelajaran mesin untuk kemasukan dan keluar dinamik.

  6. Tambahkan mekanisme lindung nilai dengan pergi panjang dan pendek untuk mengurangkan risiko sistemik yang berkaitan.

  7. Pertimbangkan lebih banyak penunjuk dan membina mekanisme pengundian untuk meningkatkan ketepatan.

Kesimpulan

Strategi ini mempunyai logik yang jelas menggunakan pelbagai penunjuk untuk menentukan arah trend dan masuk dengan bijak pada memerah. Stop loss dan mengambil keuntungan mekanikal mengehadkan risiko. Pengoptimuman parameter dan kawalan risiko boleh meningkatkan lagi hasil backtest dan hidup.


/*backtest
start: 2023-10-06 00:00:00
end: 2023-11-05 00:00:00
period: 1h
basePeriod: 15m
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/
// © XaviZ

//#####©ÉÉÉɶN###############################################
//####*..´´´´´´,,,»ëN########################################
//###ë..´´´´´´,,,,,,''%©#####################################
//###'´´´´´´,,,,,,,'''''?¶###################################
//##o´´´´´´,,,,,,,''''''''*©#################################
//##'´´´´´,,,,,,,'''''''^^^~±################################
//#±´´´´´,,,,,,,''''''''^í/;~*©####æ%;í»~~~~;==I±N###########
//#»´´´´,,,,,,'''''''''^;////;»¶X/í~~/~~~;=~~~~~~~~*¶########
//#'´´´,,,,,,''''''''^^;////;%I^~/~~/~~~=~~~;=?;~~~~;?ë######
//©´´,,,,,,,''''''''^^~/////X~/~~/~~/~~»í~~=~~~~~~~~~~^;É####
//¶´,,,,,,,''''''''^^^;///;%;~/~~;í~~»~í?~?~~~?I/~~~~?*=íÑ###
//N,,,,,,,'''''''^^^^^///;;o/~~;;~~;£=»í»;IX/=~~~~~~^^^^'*æ##
//#í,,,,,''''''''^^^^^;;;;;o~»~~~~íX//~/»~;í?IíI»~~^/*?'''=N#
//#%,,,'''''''''^^^^^^í;;;;£;~~~//»I»/£X/X/»í*&~~~^^^^'^*~'É#
//#©,,''''''''^^^^^^^^~;;;;&/~/////*X;í;o*í»~=*?*===^'''''*£#
//##&''''''''^^^^^^^^^^~;;;;X=í~~~»;;;/~;í»~»±;^^^^^';=''''É#
//##N^''''''^^^^^^^^^^~~~;;;;/£;~~/»~~»~~///o~~^^^^''''?^',æ#
//###Ñ''''^^^^^^^^^^^~~~~~;;;;;í*X*í»;~~IX?~~^^^^/?'''''=,=##
//####X'''^^^^^^^^^^~~~~~~~~;;íííííí~~í*=~~~~Ií^'''=''''^»©##
//#####£^^^^^^^^^^^~~~~~~~~~~~íííííí~~~~~*~^^^;/''''='',,N###
//######æ~^^^^^^^^~~~~~~~~~~~~~~íííí~~~~~^*^^^'=''''?',,§####
//########&^^^^^^~~~~~~~~~~~~~~~~~~~~~~~^^=^^''=''''?,íN#####
//#########N?^^~~~~~~~~~~~~~~~~~~~~~~~~^^^=^''^?''';í@#######
//###########N*~~~~~~~~~~~~~~~~~~~~~~~^^^*'''^='''/É#########
//##############@;~~~~~~~~~~~~~~~~~~~^^~='''~?'';É###########
//#################É=~~~~~~~~~~~~~~^^^*~'''*~?§##############
//#####################N§£I/~~~~~~»*?~»o§æN##################

//@version=4
strategy(title="M-SQUEEZE", overlay = true)

//study(title="M-SQUEEZE", overlay = true)

src = input(close, "SOURCE", type = input.source)

// ███▓▒░░ VARIABLES ░░▒▓███

var bool longCond = na, var bool shortCond = na
var int CondIni_long0 = 0, var int CondIni_short0 = 0
var int CondIni_long = 0, var int CondIni_short = 0
var float last_open_longCondition = na, var float last_open_shortCondition = na
var int last_longCondition0 = na, var int last_shortCondition0 = na
var int last_longCondition = na, var int last_shortCondition = na
var bool long_tp = na, var bool short_tp = na
var int last_long_tp = na, var int last_short_tp = na
var bool Final_Long_tp = na, var bool Final_Short_tp = na
var bool SMI_longCond = na, var bool SMI_shortCond = na
var bool RSI_longCond = na, var bool RSI_shortCond = na
var bool ADX_longCond = na, var bool ADX_shortCond = na
var bool SAR_longCond = na, var bool SAR_shortCond = na
var bool Final_longCondition0 = na, var bool Final_shortCondition0 = na
var bool Final_longCondition = na, var bool Final_shortCondition = na

// ███▓▒░░ SQUEEZE MOMENTUM INDICATOR ░░▒▓███

Act_SMI = input(true, "SQUEEZE MOMENTUM INDICATOR")
BB_length = input(85, title="BOLLINGER BANDS LENGTH", minval = 1)
BB_mult = input(2.1, title="BOLLINGER BANDS MULTI-FACTOR", minval = 0.1, step = 0.1)
KC_length = input(38, title="KELTNER CHANNEL LENGTH", minval = 1)
KC_mult = input(2.0, title="KELTNER CHANNEL MULTI-FACTOR", minval = 0.1, step = 0.1)

SQUEEZE_M(_src,_BB_length,_BB_mult,_KC_length,_KC_mult)=>

    // Calculate BB
    basis = sma(_src, _BB_length)
    dev = _BB_mult * stdev(_src, _BB_length)
    upperBB = basis + dev
    lowerBB = basis - dev
    // Calculate KC
    ma = sma(src, _KC_length)
    rangema = sma(tr, _KC_length)
    upperKC = ma + rangema * _KC_mult
    lowerKC = ma - rangema * _KC_mult
    // Squeeze
    sqzOn = lowerBB > lowerKC and upperBB < upperKC
    sqzOff = lowerBB < lowerKC and upperBB > upperKC
    nosqz = sqzOn == false and sqzOff == false
    // Linear Regression curve
    val = linreg(_src - avg(avg(highest(high, _KC_length), lowest(low, _KC_length)), sma(close, _KC_length)), _KC_length, 0)
    [nosqz,val]
    
[NOSQZ,VAL] = SQUEEZE_M(src,BB_length,BB_mult,KC_length,KC_mult)

barcolor(iff(VAL > 0, iff(VAL > nz(VAL[1]), color.lime, color.green), iff(VAL < nz(VAL[1]), color.red, color.maroon)))

// ███▓▒░░ SAR ░░▒▓███

Act_SAR = input(true, "PARABOLIC SAR")
Sst = input (0.73, "SAR STAR", step=0.01, minval = 0.01)
Sinc = input (0.5, "SAR INC", step=0.01, minval = 0.01)
Smax = input (0.06, "SAR MAX", step=0.01, minval = 0.01)

SAR = sar(Sst, Sinc, Smax)
plot(SAR, style = plot.style_cross, title = "SAR")

// ███▓▒░░ RSI VOLUME WEIGHTED ░░▒▓███

Act_RSI = input(true, "RSI VOLUME WEIGHTED")
RSI_len = input(22, "RSI LENGHT", minval = 1)
RSI_obos = input(45,title="RSI CENTER LINE", type=input.integer, minval = 1)

WiMA(_src, _length)=> 
    var float MA_s=0.0
    MA_s:=(_src + nz(MA_s[1] * (_length-1)))/_length
    MA_s

RSI_Volume(fv, length)=>	
	up=iff(fv>fv[1],abs(fv-fv[1])*volume,0)
	dn=iff(fv<fv[1],abs(fv-fv[1])*volume,0)
	upt=WiMA(up,length)
	dnt=WiMA(dn,length)
	100*(upt/(upt+dnt))

RSI_V = RSI_Volume(src, RSI_len)

// ███▓▒░░ STRATEGY ░░▒▓███

SMI_longCond := (Act_SMI ? (VAL > 0 and (VAL > nz(VAL[1])) and not NOSQZ) : RSI_longCond) 
RSI_longCond := (Act_RSI ? (RSI_V > RSI_obos) : SAR_longCond)
SAR_longCond := (Act_SAR ? (SAR < close) : SMI_longCond)

SMI_shortCond := (Act_SMI ? (VAL < 0 and (VAL < nz(VAL[1])) and not NOSQZ) : RSI_shortCond) 
RSI_shortCond := (Act_RSI ? (RSI_V < RSI_obos) : SAR_shortCond)
SAR_shortCond := (Act_SAR ? (SAR > close) : SMI_shortCond)

longCond := SMI_longCond and RSI_longCond and SAR_longCond
shortCond := SMI_shortCond and RSI_shortCond and SAR_shortCond

CondIni_long0 := longCond ? 1 : shortCond ? -1 : CondIni_long0[1]
CondIni_short0 := longCond ? 1 : shortCond ? -1 : CondIni_short0[1]

longCondition0 = (longCond and CondIni_long0[1] == -1)
shortCondition0 = (shortCond and CondIni_short0[1] == 1)

CondIni_long := longCond[1] ? 1 : shortCond[1] ? -1 : CondIni_long[1]
CondIni_short := longCond[1] ? 1 : shortCond[1] ? -1 : CondIni_short[1]

longCondition = (longCond[1] and CondIni_long[1] == -1)
shortCondition = (shortCond[1] and CondIni_short[1] == 1)

// ███▓▒░░ ALERTS & SIGNALS ░░▒▓███

plotshape(longCondition, title = "Long Signal", style = shape.triangleup, location = location.belowbar, color = color.blue, transp = 0, size = size.tiny)
plotshape(shortCondition, title = "Short Signal", style = shape.triangledown, location = location.abovebar, color = #FF0000, transp = 0, size = size.tiny)

//alertcondition(longCondition, title="Long Alert", message = "LONG") 
//alertcondition(shortCondition, title="Short Alert", message = "SHORT")

// ███▓▒░░ BACKTESTING ░░▒▓███

testStartYear = input(2018, "BACKTEST START YEAR", minval = 1980, maxval = 2222) 
testStartMonth = input(01, "BACKTEST START MONTH", minval = 1, maxval = 12)
testStartDay = input(01, "BACKTEST START DAY", minval = 1, maxval = 31)
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)
testStopYear = input(2222, "BACKTEST STOP YEAR", minval=1980, maxval = 2222)
testStopMonth = input(12, "BACKTEST STOP MONTH", minval=1, maxval=12)
testStopDay = input(31, "BACKTEST STOP DAY", minval=1, maxval=31)
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, 0, 0)

testPeriod = time >= testPeriodStart and time <= testPeriodStop ? true : false

strategy.entry("Long", strategy.long, when = longCondition0 and testPeriod)
strategy.entry("Short", strategy.short, when = shortCondition0 and testPeriod)


Lebih lanjut