Strategi Pencari Tren Laser Ganda

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

img

Gambaran umum

Strategi ini menggunakan Bollinger Bands, Keltner Channels dan Adaptive Relative Strength Index untuk menentukan arah tren saat ini, dikombinasikan dengan Parabolic SAR untuk waktu entri. Sinyal perdagangan dihasilkan ketika penilaian dari ketiga indikator ini setuju. Strategi ini terutama menilai arah tren dan memasuki secara tepat waktu ketika tren berubah, bertujuan untuk keuntungan.

Prinsip-prinsip

Strategi ini menggabungkan tiga indikator teknis berikut untuk menentukan tren saat ini:

  1. SQUEEZE Momentum Indicator: Menghitung Bollinger Bands dan Keltner Channels. Ketika dua band tumpang tindih, ia menghasilkan pemeras dan sinyal perubahan tren yang akan datang.

  2. RSI Volume Weighted: Menghitung RSI dengan bobot volume. Menggunakan titik tengah untuk menentukan tingkat overbought/oversold.

  3. SAR Parabolik: Menghakimi lokasi harga saat ini relatif terhadap garis SAR. SAR di atas harga menunjukkan tren menurun sementara SAR di bawah harga menunjukkan tren naik.

Strategi ini menggunakan Bollinger Bands untuk menentukan arah tren, Keltner Channels untuk menyempurnakannya, RSI untuk menemukan peluang pembalikan ketika overbought/oversold, dan SAR untuk waktu masuk.

  1. Menghitung Bollinger Bands, Saluran Keltner, Squeeze indikator.

  2. RSI di atas titik tengah menunjukkan tren naik, di bawah titik tengah tren turun.

  3. Perhitungkan SAR Parabolik. SAR di bawah harga menunjukkan tren naik, di atas harga menunjukkan tren turun.

  4. Gabungkan tiga indikator: ketika tekanan terjadi, RSI naik di atas titik tengah, SAR di bawah harga, sinyal panjang dihasilkan. Ketika tekanan terjadi, RSI turun di bawah titik tengah, SAR di atas harga, sinyal pendek dihasilkan.

  5. Ketika sinyal dipicu, periksa apakah penilaian dari tiga indikator pada bar sebelumnya adalah kebalikan dari sinyal saat ini.

  6. Atur stop loss dan ambil keuntungan setelah masuk, stop loss yang tertinggal.

Keuntungan

Keuntungan dari strategi ini:

  1. Squeeze secara akurat mendeteksi perubahan tren, RSI secara jelas mengidentifikasi tingkat overbought/oversold, SAR secara tepat kali entri.

  2. Logika indikator sederhana dan mudah dipahami.

  3. Konfirmasi dari beberapa indikator membantu menyaring kebocoran palsu.

  4. Stop loss dan take profit mekanisme mengunci keuntungan dan membatasi risiko.

  5. Data backtest yang luas memastikan keandalan.

Risiko

Ada juga beberapa risiko:

  1. Logika entri panjang dan pendek mirip dan dapat menghasilkan sinyal yang bertentangan.

  2. Semua indikator menggunakan optimasi parameter, risiko overfitting.

  3. Frekuensi perdagangan yang tinggi, ukuran posisi membutuhkan kontrol.

  4. Stop loss mungkin terlalu dekat dan mudah dihentikan.

Solusi:

  1. Tambahkan persistensi pemeriksaan pada penilaian indikator untuk menghindari osilasi sinyal.

  2. Gunakan analisis berjalan ke depan untuk menyesuaikan parameter dan mencegah overfitting.

  3. Tetapkan ukuran piramida untuk mengontrol posisi per arah.

  4. Uji rentang stop loss yang berbeda untuk mengoptimalkan harga stop loss.

Arahan Optimasi

Beberapa arah untuk mengoptimalkan strategi:

  1. Optimalkan parameter indikator untuk stabilitas. Pertimbangkan optimasi dinamis.

  2. Tambahkan logika ukuran posisi seperti persentase tetap / sama.

  3. Uji metode stop loss yang berbeda seperti volatilitas atau stop linear, posisi nol, dll.

  4. Tambahkan pengelolaan uang seperti ukuran posisi pecahan tetap.

  5. Gunakan model pembelajaran mesin untuk masuk dan keluar dinamis.

  6. Tambahkan mekanisme lindung nilai dengan mengambil posisi panjang dan pendek untuk mengurangi risiko sistemik yang terkait.

  7. Pertimbangkan lebih banyak indikator dan bangun mekanisme pemungutan suara untuk meningkatkan akurasi.

Kesimpulan

Strategi ini memiliki logika yang jelas untuk menggunakan beberapa indikator untuk menentukan arah tren dan dengan cerdik masuk pada memeras. Stop loss dan mengambil keuntungan mekanisme membatasi risiko. Optimasi parameter dan pengendalian risiko dapat lebih meningkatkan backtest dan hasil hidup. Ini adalah tren yang stabil mengikuti strategi yang cocok untuk tren produk, dan juga dapat bekerja pada jangka waktu yang lebih besar seperti setiap hari. Dengan nilai praktis yang kuat, strategi ini dapat lebih dioptimalkan dalam banyak aspek.


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