Strategi Pengesanan Trend Trend Squeeze

Penulis:ChaoZhang, Tarikh: 2023-11-13 17:46:01
Tag:

img

Ringkasan

Strategi ini berdasarkan pada penunjuk Squeeze Momentum LazyBear, menggabungkan Bollinger Bands dan Saluran Keltner untuk mengenal pasti penembusan harga dari mampatan saluran dan pengembangan untuk menentukan arah trend berpotensi harga, dan mengamalkan pendekatan trend berikut untuk memutuskan arah kemasukan.

Logika Strategi

  1. Hitung band tengah, band atas dan band bawah Bollinger Bands. Band tengah adalah purata bergerak mudah n hari harga penutupan, band atas dan bawah adalah band tengah tambah / tolak m kali deviasi standard n hari harga penutupan.

  2. Hitung garis tengah, garis atas dan garis bawah Saluran Keltner. Garis tengah adalah purata bergerak mudah n hari harga penutupan, garis atas dan bawah adalah garis tengah tambah / tolak m kali purata bergerak mudah n hari julat sebenar.

  3. Tentukan sama ada harga pecah melalui jalur atas atau bawah Bollinger Bands dan Saluran Keltner untuk membentuk corak mampatan dan pengembangan. mampatan terbentuk apabila harga pecah melalui jalur bawah, sementara pengembangan terbentuk apabila harga pecah melalui jalur atas.

  4. Mengira nilai kurva Regresi Linear sebagai penunjuk momentum. Upcrossing 0 adalah isyarat beli manakala downcrossing 0 isyarat jual.

  5. Menggabungkan corak mampatan / pengembangan, arah momentum, penapisan purata dan keadaan lain untuk menentukan isyarat perdagangan akhir. Isyarat hanya dicetuskan apabila semua syarat dipenuhi untuk mengelakkan perdagangan yang buruk.

Kelebihan Strategi

  1. Menggunakan penapisan ganda Bollinger Bands dan Saluran Keltner untuk mengenal pasti corak mampatan dan pengembangan kualiti.

  2. Indikator momentum boleh menangkap perubahan trend harga tepat pada masanya, melengkapkan penunjuk saluran.

  3. Membolehkan kemasukan awal untuk meningkatkan peluang keuntungan.

  4. Adopt multiple condition judgment to avoid over-trading during ranging markets. Adopt multiple condition judgment to avoid over-trading during ranging markets.

  5. Parameter penunjuk teknikal boleh disesuaikan, menyesuaikan diri dengan produk dan kombinasi parameter yang berbeza.

  6. Rangka masa ujian belakang boleh ditetapkan untuk mengoptimumkan tempoh tertentu.

Risiko Strategi

  1. Strategi yang mengikuti trend cenderung mengalami kerugian apabila trend berbalik.

  2. Tetapan parameter yang tidak betul boleh menyebabkan perdagangan berlebihan atau kualiti isyarat yang buruk.

  3. Bergantung pada data sejarah tidak dapat menjamin pulangan masa depan yang stabil.

  4. Tidak dapat menangani pergolakan pasaran dan perubahan harga yang teruk disebabkan oleh peristiwa black swan.

  5. Tetapan tetingkap masa backtest yang tidak betul boleh membawa kepada pemasangan berlebihan.

Arahan pengoptimuman

  1. Mengoptimumkan parameter Bollinger Bands dan Saluran Keltner untuk mencari kombinasi terbaik.

  2. Uji menambah stop loss untuk mengawal kerugian maksimum setiap perdagangan.

  3. Cuba pengoptimuman lanjut untuk produk tertentu dan kombinasi tempoh / parameter.

  4. meneroka integrasi model pembelajaran mesin untuk menentukan pembalikan trend.

  5. Uji urutan kemasukan yang berbeza dan strategi ukuran kedudukan.

  6. Penyelidikan bagaimana untuk mengenal pasti isyarat pembalikan trend dan keluar pada waktunya.

Ringkasan

By customizing parameters and using multiple condition filters, it can effectively control trading frequency and improve signal quality. But reversal trades and black swan events should still be watched out for. Further exploring trend reversal signals and risk control mechanisms can be done to make the strategy more robust.


/*backtest
start: 2022-11-06 00:00:00
end: 2023-11-12 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//Strategy based on LazyBear Squeeze Momentum Indicator
//I added some custom feature and filters
//
// @author LazyBear
// List of all my indicators:
// https://docs.google.com/document/d/15AGCufJZ8CIUvwFJ9W-IKns88gkWOKBCvByMEvm5MLo/edit?usp=sharing
// v2 - fixed a typo, where BB multipler was always stuck at 1.5. [Thanks @ucsgears]
//
strategy(shorttitle = "SQZMOM_LB", title="Strategy for Squeeze Momentum Indicator [LazyBear]", overlay=false, calc_on_every_tick=true, pyramiding=0,default_qty_type=strategy.percent_of_equity,default_qty_value=100,currency=currency.USD)

length = input(14, title="BB Length")
mult = input(2.0,title="BB MultFactor")
lengthKC=input(16, title="KC Length")
multKC = input(1.5, title="KC MultFactor")
 
useTrueRange = input(true, title="Use TrueRange (KC)", type=bool)

//FILTERS
useExtremeOrders  = input(false, title="Early entry on momentum change", type=bool)
useMomAverage = input(false, title="Filter for Momenutum value", type=bool)
MomentumMin = input(20, title="Min for momentum")

// Calculate BB
src = close
basis = sma(src, length)
dev = mult * stdev(src, length)
upperBB = basis + dev
lowerBB = basis - dev
 
// Calculate KC
ma = sma(src, lengthKC)
range = useTrueRange ? tr : (high - low)
rangema = sma(range, lengthKC)
upperKC = ma + rangema * multKC
lowerKC = ma - rangema * multKC
 
sqzOn  = (lowerBB > lowerKC) and (upperBB < upperKC)
sqzOff = (lowerBB < lowerKC) and (upperBB > upperKC)
noSqz  = (sqzOn == false) and (sqzOff == false)
 
val = linreg(src  -  avg(avg(highest(high, lengthKC), lowest(low, lengthKC)),sma(close,lengthKC)), lengthKC,0)
 
bcolor = iff( val > 0,            iff( val > nz(val[1]), lime, green),            iff( val < nz(val[1]), red, maroon))
scolor = noSqz ? blue : sqzOn ? black : aqua
plot(val, color=bcolor, style=histogram, linewidth=4)
plot(0, color=scolor, style=cross, linewidth=2)

//LOGIC
//momentum filter
filterMom=useMomAverage?abs(val)>(MomentumMin/100000)?true:false:true

//standard condition
longCondition = scolor[1]!=aqua and scolor==aqua and bcolor==lime and filterMom
exitLongCondition = bcolor==green and not useExtremeOrders
shortCondition = scolor[1]!=aqua and scolor==aqua and bcolor==red and filterMom
exitShortCondition = bcolor==maroon and not useExtremeOrders

//early entry
extremeLong= useExtremeOrders and scolor==aqua and bcolor==maroon and bcolor[1]!=bcolor[0] and filterMom
exitExtLong = scolor==black or bcolor==red
extremeShort = useExtremeOrders and scolor==aqua and bcolor==green and bcolor[1]!=bcolor[0] and filterMom
exitExtShort = scolor==black or bcolor==lime

//STRATEGY

strategy.entry("SQ_Long", strategy.long, when = longCondition)
strategy.close("SQ_Long",when = exitLongCondition )

strategy.entry("SQ_Long_Ext", strategy.long, when = extremeLong)
strategy.close("SQ_Long_Ext",when = exitExtLong)
//strategy.exit("exit Long", "SQ_Long", when = exitLongCondition)

strategy.entry("SQ_Short", strategy.short, when = shortCondition)
strategy.close("SQ_Short",when = exitShortCondition)

strategy.entry("SQ_Short_Ext", strategy.short, when = extremeShort)
strategy.close("SQ_Short_Ext",when = exitExtShort)
//strategy.exit("exit Short", "SQ_Short", when = exitShortCondition)



// // === Backtesting Dates === thanks to Trost

// testPeriodSwitch = input(true, "Custom Backtesting Dates")
// testStartYear = input(2018, "Backtest Start Year")
// testStartMonth = input(1, "Backtest Start Month")
// testStartDay = input(1, "Backtest Start Day")
// testStartHour = input(0, "Backtest Start Hour")
// testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
// testStopYear = input(2018, "Backtest Stop Year")
// testStopMonth = input(12, "Backtest Stop Month")
// testStopDay = input(14, "Backtest Stop Day")
// testStopHour = input(23, "Backtest Stop Hour")
// testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
// testPeriod() =>
//     time >= testPeriodStart and time <= testPeriodStop ? true : false
// isPeriod = testPeriodSwitch == true ? testPeriod() : true
// // === /END

// if not isPeriod
//     strategy.cancel_all()
//     strategy.close_all()
        



Lebih lanjut