Momentum Squeeze Breakout Strategi Pelacakan Tren

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

img

Gambaran umum

Strategi ini didasarkan pada indikator Momentum Squeeze LazyBear, menggabungkan Bollinger Bands dan Saluran Keltner untuk mengidentifikasi price breakout dari kompresi saluran dan ekspansi untuk menentukan arah tren potensial harga, dan mengadopsi pendekatan trend berikut untuk memutuskan arah masuk. Keuntungan dari strategi ini adalah memanfaatkan sepenuhnya kemampuan indikator momentum untuk mengidentifikasi tren potensial, dan mengatur beberapa filter kondisi untuk mengontrol kualitas sinyal yang dapat secara efektif menyaring sinyal yang tidak pasti dan menghindari over-trading selama pasar berkisar.

Logika Strategi

  1. Menghitung band tengah, band atas dan band bawah Bollinger Bands. Band tengah adalah n-hari rata-rata bergerak sederhana dari harga penutupan, band atas dan bawah adalah band tengah ditambah/dikurangi m kali standar deviasi n-hari dari harga penutupan.

  2. Hitung garis tengah, garis atas dan garis bawah Saluran Keltner. garis tengah adalah n-hari rata-rata bergerak sederhana dari harga penutupan, garis atas dan bawah adalah garis tengah ditambah/dikurangi m kali n-hari rata-rata bergerak sederhana dari rentang yang benar.

  3. Tentukan apakah harga pecah melalui band atas atau bawah Bollinger Bands dan Saluran Keltner untuk membentuk pola kompresi dan ekspansi.

  4. Menghitung nilai kurva Regresi Linear sebagai indikator momentum. Upcrossing 0 adalah sinyal beli sementara downcrossing 0 adalah sinyal jual.

  5. Kombinasi pola kompresi/ekspansi, arah momentum, penyaringan rata-rata dan kondisi lain untuk menentukan sinyal perdagangan akhir.

Keuntungan dari Strategi

  1. Menggunakan penyaringan ganda Bollinger Bands dan Keltner Channel untuk mengidentifikasi kualitas kompresi dan pola ekspansi.

  2. Indikator momentum dapat menangkap pembalikan tren harga tepat waktu, melengkapi indikator saluran.

  3. Memungkinkan masuk lebih awal untuk meningkatkan peluang keuntungan.

  4. Adopt multiple condition judgment to avoid over-trading during ranging markets (mengadopsi penilaian bermacam-macam kondisi untuk menghindari over-trading selama pasar yang berbeda).

  5. Parameter indikator teknis dapat disesuaikan, beradaptasi dengan produk dan kombinasi parameter yang berbeda.

  6. Kerangka waktu backtest dapat diatur untuk dioptimalkan selama periode tertentu.

Risiko dari Strategi

  1. Strategi yang mengikuti tren cenderung mengalami kerugian ketika tren berbalik.

  2. Pengaturan parameter yang tidak benar dapat menyebabkan over-trading atau kualitas sinyal yang buruk.

  3. Bergantung pada data historis tidak dapat menjamin pengembalian masa depan yang stabil.

  4. Tidak mampu menangani gejolak pasar dan perubahan harga drastis yang disebabkan oleh peristiwa angsa hitam.

  5. Pengaturan jendela waktu backtest yang tidak benar dapat menyebabkan overfit.

Arahan Optimasi

  1. Mengoptimalkan parameter Bollinger Bands dan Saluran Keltner untuk menemukan kombinasi terbaik.

  2. Uji menambahkan stop loss trailing untuk mengontrol kerugian maksimum per perdagangan.

  3. Cobalah optimasi lebih lanjut untuk produk tertentu dan kombinasi periode/parameter.

  4. Explore integrating machine learning models to judge trend reversals (Menjelajahi mengintegrasikan model pembelajaran mesin untuk menentukan reversal tren).

  5. Uji berbagai urutan entri dan ukuran posisi strategi.

  6. Cari tahu cara mengidentifikasi sinyal pembalikan tren dan keluar tepat waktu.

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 banyak