Strategi ini berdasarkan pada penunjuk Squeeze Momentum LazyBear
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.
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.
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.
Mengira nilai kurva Regresi Linear sebagai penunjuk momentum. Upcrossing 0 adalah isyarat beli manakala downcrossing 0 isyarat jual.
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.
Menggunakan penapisan ganda Bollinger Bands dan Saluran Keltner untuk mengenal pasti corak mampatan dan pengembangan kualiti.
Indikator momentum boleh menangkap perubahan trend harga tepat pada masanya, melengkapkan penunjuk saluran.
Membolehkan kemasukan awal untuk meningkatkan peluang keuntungan.
Adopt multiple condition judgment to avoid over-trading during ranging markets. Adopt multiple condition judgment to avoid over-trading during ranging markets.
Parameter penunjuk teknikal boleh disesuaikan, menyesuaikan diri dengan produk dan kombinasi parameter yang berbeza.
Rangka masa ujian belakang boleh ditetapkan untuk mengoptimumkan tempoh tertentu.
Strategi yang mengikuti trend cenderung mengalami kerugian apabila trend berbalik.
Tetapan parameter yang tidak betul boleh menyebabkan perdagangan berlebihan atau kualiti isyarat yang buruk.
Bergantung pada data sejarah tidak dapat menjamin pulangan masa depan yang stabil.
Tidak dapat menangani pergolakan pasaran dan perubahan harga yang teruk disebabkan oleh peristiwa black swan.
Tetapan tetingkap masa backtest yang tidak betul boleh membawa kepada pemasangan berlebihan.
Mengoptimumkan parameter Bollinger Bands dan Saluran Keltner untuk mencari kombinasi terbaik.
Uji menambah stop loss untuk mengawal kerugian maksimum setiap perdagangan.
Cuba pengoptimuman lanjut untuk produk tertentu dan kombinasi tempoh / parameter.
meneroka integrasi model pembelajaran mesin untuk menentukan pembalikan trend.
Uji urutan kemasukan yang berbeza dan strategi ukuran kedudukan.
Penyelidikan bagaimana untuk mengenal pasti isyarat pembalikan trend dan keluar pada waktunya.
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()