Strategi dwi laser mencari trend panjang dan pendek


Tarikh penciptaan: 2023-11-06 10:01:42 Akhirnya diubah suai: 2023-11-06 10:01:42
Salin: 0 Bilangan klik: 587
1
fokus pada
1617
Pengikut

Strategi dwi laser mencari trend panjang dan pendek

Gambaran keseluruhan

Strategi ini menggunakan tiga petunjuk teknikal yang digunakan untuk menentukan arah trend semasa, menggunakan tiga petunjuk teknikal yang digunakan untuk menentukan arah trend semasa, menggunakan tiga petunjuk teknikal yang digunakan untuk menentukan arah trend semasa, menggunakan tiga petunjuk teknikal yang digunakan untuk menentukan arah trend semasa, menggunakan tiga petunjuk teknikal yang digunakan untuk menentukan arah trend semasa, menggunakan tiga petunjuk teknikal yang digunakan untuk menentukan arah trend semasa, menggunakan tiga petunjuk teknikal yang digunakan untuk menentukan arah trend semasa, menggunakan tiga petunjuk teknikal yang digunakan untuk menentukan arah trend semasa, menggunakan tiga petunjuk teknikal yang digunakan untuk menentukan arah trend semasa, menggunakan tiga petunjuk teknikal yang digunakan untuk menentukan arah trend semasa, menggunakan tiga petunjuk teknikal yang digunakan untuk menentukan arah trend semasa, menggunakan tiga petunjuk teknikal yang digunakan untuk menentukan arah trend semasa, menggunakan tiga petunjuk teknikal yang digunakan untuk menentukan arah trend semasa, menggunakan tiga petunjuk teknikal yang digunakan untuk menentukan arah trend semasa, menggunakan tiga petunjuk teknikal yang digunakan untuk menentukan arah trend semasa, dan menggunakan tiga petunjuk teknikal yang digunakan untuk menentukan arah trend semasa.

Prinsip

Strategi ini menggunakan gabungan tiga petunjuk teknikal untuk menilai trend semasa:

  1. SQUEEZE MOMENTUM INDICATOR: Mengira jalur Brin dan Kentner, yang menghasilkan kompresi apabila kedua-duanya bertindih, menandakan perubahan tren yang akan datang. Penunjuk ini kembali ke keadaan kompresi dan kemerosotan kurva pengembalian linear.

  2. RSI VOLUME WEIGHTED: RSI yang dikira dengan berat dagangan, menggunakan garis tengah untuk menilai overbought dan oversold. Penunjuk ini menekankan perubahan dalam jumlah dagangan.

  3. Hentian paras paras paras ((SAR): menilai hubungan harga semasa dengan kedudukan paras paras paras SAR, SAR turun di atas harga, SAR naik di bawah harga.

Strategi menggunakan Brin Belt untuk menentukan arah trend, Kentner Corridor Refine, RSI menilai overbought dan oversold untuk mencari peluang berbalik, SAR menunjukkan masa masuk. Logik spesifiknya adalah seperti berikut:

  1. Hitung Brin Belt, Kenter Corridor, Squeeze Indicator. Apabila Squeeze Compress memasuki tahap persediaan.

  2. RSI diperhitungkan dengan jumlah dagangan bertimbangan. RSI lebih tinggi daripada garis tengah dan lebih rendah daripada garis tengah.

  3. Hitung garis paralisis SAR. SAR naik di bawah harga dan turun di atas harga.

  4. Menggabungkan tiga indikator di atas: Apabila squeeze dikompresi, RSI lebih tinggi daripada garis tengah, SAR menghasilkan isyarat multihead apabila harga berada di bawah; Apabila squeeze dikompresi, RSI lebih rendah daripada garis tengah, SAR menghasilkan isyarat kosong apabila harga di atas.

  5. Apabila isyarat dihasilkan, menilai keputusan keputusan tiga penunjuk pada baris K sebelumnya, dan menghasilkan isyarat masuk jika ia bertentangan dengan penilaian isyarat semasa.

  6. Set Stop Loss Stop Stop selepas masuk, Lacak Stop Loss.

Kelebihan

Strategi ini mempunyai kelebihan berikut:

  1. Indikator Squeeze mengiktiraf perubahan trend dengan tepat, RSI mengiktiraf overbought dan oversold dengan jelas, SAR menunjukkan masa masuk dengan tepat.

  2. Logik penunjuk adalah ringkas, jelas dan mudah difahami.

  3. Pengesahan dengan pelbagai indikator boleh menapis penembusan palsu.

  4. Ia mempunyai mekanisme penghentian kerugian untuk mengunci keuntungan dan mengawal risiko.

  5. Data pengesanan cukup dan boleh dipercayai.

Risiko

Strategi ini mempunyai beberapa risiko:

  1. Logik kemasukan multi-kepala dan kosong adalah sama, dan mungkin menghantar isyarat terbalik pada masa yang sama, yang memerlukan penapisan.

  2. Ketiga-tiga penunjuk menggunakan pengoptimuman parameter dan mungkin terlalu sesuai.

  3. Perdagangan mungkin terlalu kerap, dan anda perlu mengawal jumlah kedudukan anda dengan bijak.

  4. Tetapan stop-loss mungkin terlalu dekat dan mudah untuk ditembusi.

Penyelesaian:

  1. Meningkatkan keputusan penunjuk untuk menentukan kitaran berterusan dan mengelakkan goyah isyarat.

  2. Menggunakan analisis berjalan maju, menyesuaikan parameter untuk mengelakkan overfit.

  3. Tetapkan saiz piramid untuk mengawal jumlah pegangan tunggal.

  4. Uji jarak hentian yang berbeza, optimumkan kedudukan hentian.

Arah pengoptimuman

Strategi ini boleh dioptimumkan dalam beberapa arah:

  1. Optimumkan parameter penunjuk, meningkatkan kestabilan parameter. Anda boleh mempertimbangkan parameter pengoptimuman dinamik.

  2. Menambah logik kawalan kedudukan, seperti besar, kecil, dan rata.

  3. Uji pelbagai kaedah hentian, seperti hentian turun naik, hentian linear, dan kembali ke kedudukan sifar.

  4. Menambah fungsi pengurusan wang, seperti kedudukan tetap, penggunaan dana tetap, dan sebagainya.

  5. Di samping itu, ia juga menggunakan algoritma pembelajaran mesin untuk mewujudkan kemasukan dan keluar yang dinamik.

  6. Meningkatkan mekanisme perlindungan, melakukan lebih banyak perlindungan, dan mengurangkan risiko sistemik di pasaran yang berkaitan.

  7. Ia juga akan mempertimbangkan untuk menambah lebih banyak penunjuk, membina mekanisme pengundian, dan meningkatkan ketepatan penilaian.

ringkaskan

Strategi ini mempunyai pemikiran keseluruhan yang jelas, menggunakan pelbagai indikator untuk menilai arah trend, masuk dengan tajam pada masa kompresi saluran Brin, menghalang risiko pengendalian mekanisme penangguhan, dan merupakan strategi pemantauan trend yang lebih stabil. Dengan pengoptimuman parameter, peningkatan mekanisme kawalan risiko, dapat memperoleh indikator pengukuran dan kesan cakera yang lebih baik.

Kod sumber strategi
/*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)