Strategi mengikuti tren berdasarkan indikator momentum kompresi


Tanggal Pembuatan: 2023-11-13 17:46:01 Akhirnya memodifikasi: 2023-11-13 17:46:01
menyalin: 0 Jumlah klik: 883
1
fokus pada
1617
Pengikut

Strategi mengikuti tren berdasarkan indikator momentum kompresi

Ringkasan

Strategi ini didasarkan pada indikator momentum kompresi LazyBear, yang digabungkan dengan Brin Belt dan Keltner Channel, untuk mengidentifikasi bentuk kompresi dan ekspansi yang terbentuk dari saluran terobosan harga, menilai arah tren potensial harga saham, dan menggunakan metode pelacakan tren untuk menentukan arah pembukaan posisi. Keunggulan strategi ini adalah memanfaatkan sepenuhnya kemampuan indikator momentum untuk mengidentifikasi tren potensial, dan mengatur beberapa filter kondisi untuk mengontrol kualitas sinyal perdagangan, yang dapat secara efektif menyaring sinyal perdagangan yang tidak pasti, untuk menghindari terlalu sering perdagangan di seluruh cakram getaran.

Prinsip Strategi

  1. Hitung rata-rata bergerak sederhana dari harga penutupan n hari di rel tengah, rel atas, dan rel bawah di Brin Belt, dengan perbedaan standar harga penutupan n hari ditambah atau dikurangi m kali dari rel atas dan rel bawah.

  2. Hitung garis tengah, garis atas, dan garis bawah dalam saluran Keltner. Garis tengah adalah rata-rata bergerak sederhana dari harga penutupan n hari, garis atas dan bawah adalah rata-rata bergerak sederhana dari gelombang nyata n hari ditambah m kali.

  3. Untuk menentukan apakah harga telah menembus Brin Belt dan Keltner Channel, bentuk kompresi dan ekspansi dibentuk. Kompresi terjadi ketika harga menembus downtrend dari atas, dan ekspansi terjadi ketika harga menembus uptrend dari bawah.

  4. Hitung nilai dari kurva regresi linier, sebagai indikator momentum. Ketika garis momentum melewati 0 untuk sinyal beli, saat melewati 0 untuk sinyal jual.

  5. Sinyal perdagangan akhirnya ditentukan oleh beberapa kondisi, seperti bentuk kompresi ekspansi, arah indikator dinamis, filter rata-rata, dll. Hanya dengan memenuhi semua kondisi, sinyal perdagangan akan dihasilkan dan perdagangan yang salah akan dihindari.

Keunggulan Strategis

  1. Filter ganda menggunakan pita Brin dan saluran Keltner untuk mengidentifikasi bentuk kompresi dan ekspansi berkualitas tinggi.

  2. Indikator momentum dapat menangkap perubahan tren harga tepat waktu, dan saling melengkapi dengan indikator channel.

  3. Memungkinkan Anda untuk masuk lebih awal dan meningkatkan peluang Anda untuk menghasilkan uang.

  4. Menggunakan penilaian multi-kondisi untuk menghindari sering membuka posisi dalam situasi gempa.

  5. Setiap parameter indikator teknis dapat disesuaikan untuk berbagai varietas dan kombinasi parameter.

  6. Anda dapat mengatur periode pengembalian dan mengoptimalkan pengujian untuk periode waktu tertentu.

Risiko Strategis

  1. Strategi untuk mengikuti tren, yang dapat menyebabkan kerugian ketika tren berbalik.

  2. Pengaturan parameter yang tidak tepat dapat menyebabkan frekuensi transaksi yang terlalu tinggi atau kualitas sinyal yang buruk.

  3. “Kami tidak dapat menjamin bahwa kami akan kembali ke masa depan, karena kami bergantung pada uji data historis”.

  4. Tidak mampu menanggapi kejutan pasar dan fluktuasi harga yang disebabkan oleh kejadian mendadak.

  5. Pengaturan jendela waktu deteksi yang tidak tepat dapat menyebabkan overmatch.

Arah optimasi strategi

  1. Optimalkan parameter Brin Belt dan Keltner Channel untuk menemukan kombinasi optimal.

  2. Uji coba penambahan stop loss mobile untuk mengendalikan kerugian maksimum dalam satu transaksi.

  3. Cobalah untuk mengoptimalkan lebih lanjut dalam kombinasi varietas dan siklus tertentu.

  4. Mencari model pembelajaran mesin untuk menilai perubahan tren.

  5. Uji coba berbagai urutan masuk dan strategi manajemen posisi.

  6. Studi tentang cara mengenali sinyal pembalikan tren dan menghentikan kerugian tepat waktu.

Meringkaskan

Strategi ini menggabungkan beberapa indikator teknis untuk menentukan arah tren harga dan melakukan pelacakan tren, memiliki kemampuan adaptasi yang kuat. Dengan penyesuaian parameter dan pemfilteran kondisi ganda, frekuensi perdagangan dapat dikontrol secara efektif dan kualitas sinyal dapat ditingkatkan. Namun, perdagangan reverse dan kejadian yang tidak terduga masih perlu diwaspadai, dapat terus mengeksplorasi sinyal reverse trend dan mekanisme kontrol risiko untuk dioptimalkan, membuat strategi lebih kokoh.

Kode Sumber Strategi
/*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()