Strategi mengikuti tren berbasis Bollinger Bands


Tanggal Pembuatan: 2024-01-15 14:31:21 Akhirnya memodifikasi: 2024-01-15 14:31:21
menyalin: 0 Jumlah klik: 556
1
fokus pada
1617
Pengikut

Strategi mengikuti tren berbasis Bollinger Bands

Ringkasan

Strategi ini menggunakan indikator BollingerBands untuk menentukan tren harga dan melakukan over-sharing saat harga menembus BollingerBands channel. Ini menggabungkan filter linier untuk menentukan arah tren saat terjadinya penembusan, sehingga memutuskan untuk melakukan over-sharing.

Prinsip Strategi

Strategi ini terutama bergantung pada indikator BollingerBands untuk menentukan tren harga dan posisi entry point. BollingerBands terdiri dari tiga garis:

  1. Garis tengah: rata-rata bergerak n hari
  2. Garis atas: bergerak ke atas dengan selisih standar n hari
  3. Garis bawah: bergerak ke bawah dengan selisih standar n hari

Ketika harga dari garis bawah menembus ke atas, dianggap sedang membentuk tren bullish; Ketika harga dari garis atas menembus ke bawah, dianggap sedang membentuk tren bearish. Strategi ini melakukan lebih banyak shorting ketika kedua terobosan ini terjadi.

Secara khusus, logikanya adalah:

  1. Ketika harga close out menembus garis bawah dari Bands, lakukan over entry
  2. Ketika harga penutupan dari Bands upline menembus downline, melakukan short entry

Untuk menyaring breakout palsu, masukkan penilaian rata-rata. Ini akan memicu masuk hanya jika harga penutupan menembus Bands dan juga menembus rata-rata.

Exponential Moving Average digunakan sebagai indikator rata-rata.

Secara umum, strategi ini menilai bahwa tren akan pecah dengan cara berikut:

  1. Buat sinyal lebih banyak: harga penutupan menembus garis Bands && harga penutupan menembus garis rata-rata
  2. Sinyal penutupan: Penutupan harga melewati Bands downline && Penutupan harga melewati median

Setelah masuk, stop loss adalah mengikuti garis tengah. Ketika harga kembali menyentuh garis tengah, keluar dari stop loss.

Analisis Keunggulan

Strategi ini memiliki beberapa keuntungan utama:

  1. BANDs channel memiliki ruang untuk berfluktuasi harga, dan BREAKING CHANNEL mewakili harga mulai membentuk arah baru.
  2. Kombinasi penyaringan linier, menghindari masalah false breakout, dan memastikan masuk hanya ketika ada pergeseran tren yang nyata.
  3. Dengan mekanisme penghentian yang dibangun, penghentian aktif terjadi ketika harga kembali ke garis tengah Bands, yang secara efektif mengendalikan risiko.
  4. Strategi logis yang sederhana dan jelas, mudah dipahami dan diterapkan, sesuai dengan strategi algoritmik untuk trading kuantitatif.
  5. Dengan menggunakan Bands channel dan Average Line Indicator, tidak perlu memprediksi harga, berdasarkan bukti setelah kejadian untuk menilai tren, pengukuran kembali lebih efektif.

Analisis risiko

Meskipun ada beberapa keuntungan dari strategi ini, ada risiko berikut:

  1. Bands parameter yang tidak tepat dapat menyebabkan peningkatan frekuensi perdagangan dan risiko perdagangan. Jika parameter yang terlalu sensitif, akan menghasilkan sejumlah besar palsu terobosan menyebabkan sistem sering membuka posisi.
  2. Pilihan parameter rata-rata yang tidak tepat juga dapat menyebabkan kehilangan tren yang sebenarnya atau menghasilkan sinyal palsu. Pengaturan parameter perlu diuji dan dioptimalkan berulang kali.
  3. Stop loss bergantung pada garis tengah, mungkin akan meninggalkan pertandingan lebih awal atau memberi harga terlalu banyak ruang untuk kembali. Hal ini dapat menyebabkan kehilangan sebagian besar keuntungan atau meningkatkan risiko kerugian.

Untuk mengontrol risiko tersebut, optimasi dapat dilakukan dengan cara:

  1. Sesuai menyesuaikan parameter Bands untuk meningkatkan lebar saluran dan mengurangi probabilitas false breakout
  2. Uji garis rata-rata dari berbagai jenis dan panjang untuk menemukan kombinasi terbaik
  3. Cobalah metode stop loss lainnya, seperti stop loss yang mengikuti tren atau stop loss yang bergerak secara bertahap

Arah optimasi

Berdasarkan analisis risiko di atas, strategi ini dapat dioptimalkan lebih lanjut dalam hal berikut:

  1. Optimasi parameterDengan metode yang lebih sistematis, seperti algoritma genetik, mencari kombinasi terbaik dari band dan parameter rata-rata, membuat strategi lebih stabil dan menguntungkan.

  2. Optimalisasi Stop Loss: Uji coba berbagai metode stop loss, seperti stop loss ATR, tracking stop loss, dan lain-lain, untuk menentukan mekanisme stop loss yang optimal.

  3. Pengoptimalan filterMencoba untuk menambahkan indikator lain seperti RSI, KD dan lain-lain sebagai kondisi penyaringan tambahan, mengurangi probabilitas sinyal palsu, meningkatkan tingkat keuntungan.

  4. Optimisasi persyaratan masukMenambahkan faktor-faktor lain seperti penilaian tren, VOLUME yang tidak bergerak, pemilihan waktu masuk yang ketat, mengurangi posisi yang tidak perlu.

  5. Pembelajaran Mesin: Mengumpulkan lebih banyak data historis, memodelkan dengan model pembelajaran mendalam seperti LSTM, RNN, dan lain-lain, dan menggunakan AI untuk menentukan titik masuk dan keluar terbaik.

  6. Manajemen dinamika risiko dan keuntunganDengan menambahkan stop loss dan stop loss dengan persentase tetap, meningkatkan stop loss setelah target keuntungan, dan mengelola risiko dan keuntungan secara dinamis.

Dengan mengoptimalkan beberapa aspek di atas, indikator-indikator seperti stabilitas, tingkat pengembalian, dan kemampuan pengendalian risiko dari strategi ini dapat ditingkatkan secara menyeluruh, sehingga menjadi strategi algoritmik yang dapat diperdagangkan di tempat nyata.

Meringkaskan

Secara keseluruhan, strategi pelacakan tren BollingerBands yang menggunakan indikator Bands dan rata-rata untuk menilai tren harga, masuk saat titik titik kritis, adalah jenis strategi pelacakan tren. Ini memiliki keunggulan seperti kejelasan penilaian, logika ringkas, mudah untuk diterapkan, dan juga ada beberapa optimasi parameter, cara penghentian kerugian, dan lain-lain.

Kode Sumber Strategi
/*backtest
start: 2023-12-15 00:00:00
end: 2024-01-14 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//VERSION =================================================================================================================
//@version=5
// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// This strategy is intended to study.
// It can also be used to signal a bot to open a deal by providing the Bot ID, email token and trading pair in the strategy settings screen.
// As currently written, this strategy uses a Bollinger Bands for trend folling, you can use a EMA as a filter.
//Autor Credsonb (M4TR1X_BR)

//▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
//STRATEGY ================================================================================================================

strategy(title = 'BT-Bollinger Bands - Trend Following',
         shorttitle = 'BBTF',
         overlay = true )


//▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// CONFIG =================================================================================================================

// TIME INPUTS
usefromDate = input.bool(defval = true, title = 'Start date', inline = '0', group = "Time Filters")
initialDate = input(defval = timestamp('01 Jan 2022 00:00 UTC'), title = '', inline = "0",group = 'Time Filters',tooltip="This start date is in the time zone of the exchange ")
usetoDate = input.bool(defval = true, title = 'End date', inline = '1', group = "Time Filters")
finalDate = input(defval = timestamp('31 Dec 2029 23:59 UTC'), title = '', inline = "1",group = 'Time Filters',tooltip="This end date is in the time zone of the exchange")

// TIME LOGIC 
inTradeWindow = true

// ENABLE LONG SHORT OPTIONS
string entrygroup ='Long/Short Options ==================================='
checkboxLong = input.bool(defval=true, title="Enable Long Entrys",group=entrygroup)
checkboxShort = input.bool(defval=true, title="Enable Short Entrys",group=entrygroup)


// BOLLINGER BANDS INPUTS ==================================================================================================
string bbgroup ='Bollinger Bands ======================================'
bbLength = input.int(defval=20,title='BB Length', minval=1, step=5, group=bbgroup)
bbStddev = input.float(defval=2, title='BB StdDev', minval=0.5, group=bbgroup)

//BOLLINGER BANDS LOGIC
[bbMiddle, bbUpper, bbLower] = ta.bb(close, bbLength, bbStddev)


// MOVING AVERAGES INPUTS ================================================================================================
string magroup =  'Moving Average ======================================='
useEma = input.bool(defval = true, title = 'Moving Average Filter',inline='', group= magroup,tooltip='This will enable or disable Exponential Moving Average Filter on Strategy')
emaType=input.string (defval='Ema',title='Type',options=['Ema','Sma'],inline='', group= magroup)
emaSource = input.source(defval=close,title="  Source",inline="", group= magroup)
emaLength = input.int(defval=100,title="Length",minval=0,inline='', group= magroup)

// MOVING AVERAGE LOGIC
float ema = emaType=='Ema'? ta.ema(emaSource,emaLength): ta.sma(emaSource,emaLength)

// BOT MESSAGES
string msgroup='Alert Message For Bot ================================'
messageEntry = input.string("", title="Strategy Entry Message",group=msgroup)
messageExit  =input.string("",title="Strategy Exit Message",group=msgroup)
messageClose = input.string("", title="Strategy Close Message",group=msgroup)




// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// POSITIONS =============================================================================================================

//VERIFY IF THE BUY FILTERS ARE ON OR OFF 
bool emaFilterBuy = useEma? (close > ema):(close >= ema) or (close <= ema)                      

//LONG / SHORT POSITIONS LOGIC
bool openLongPosition  = (close[1] < bbUpper) and (close > bbUpper)   and (emaFilterBuy)
bool openShortPosition = (close[1] > bbLower) and (close < bbLower) and (emaFilterBuy)
//bool closeLongPosition = (close > bbMiddle)
//bool closeShortPosition= (close < bbLower)


// CHEK OPEN POSITONS =====================================================================================================
// open signal when not already into a position
bool validOpenLongPosition = openLongPosition and strategy.opentrades.size(strategy.opentrades - 1) <= 0
bool longIsActive = validOpenLongPosition or strategy.opentrades.size(strategy.opentrades - 1) > 0

bool validOpenShortPosition = openShortPosition and strategy.opentrades.size(strategy.opentrades - 1) <= 0
bool shortIsActive = validOpenShortPosition or strategy.opentrades.size(strategy.opentrades - 1) < 0

longEntryPoint = high
if (openLongPosition) and (inTradeWindow) and (checkboxLong)
    strategy.entry(id = 'Long Entry', direction = strategy.long, stop = longEntryPoint, alert_message=messageEntry)

if not (openLongPosition)
    strategy.cancel('Long Entry')

//submit exit orders for trailing take profit price 
if (longIsActive) and (inTradeWindow)
    strategy.exit(id = 'Long Exit',  stop=bbMiddle, alert_message=messageExit)

//if (closeLongPosition)
   // strategy.close(id = 'Long Entry', alert_message=messageClose)
      

shortEntryPoint = low 
if (openShortPosition) and (inTradeWindow) and (checkboxShort)
    strategy.entry(id = 'Short Entry', direction = strategy.short, stop = shortEntryPoint, alert_message=messageEntry)

if not(openShortPosition)
    strategy.cancel('Short Entry')

if (shortIsActive)
    strategy.exit(id = 'Short Exit',  stop = bbMiddle, alert_message=messageExit)

//if (closeShortPosition)
    //strategy.close(id = 'Short Close', alert_message=messageClose)

// ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
// PLOTS ===============================================================================================================

// TRADE WINDOW ========================================================================================================
bgcolor(color = inTradeWindow ? color.new(#089981,90):na, title = 'Time Window')

// EMA/SMA 
var emafilterColor = color.new(color.white, 0)
plot(series=useEma? ema:na, title = 'EMA Filter', color = emafilterColor, linewidth = 2, style = plot.style_line)

// BOLLINGER BANDS
plot(series=bbUpper, title = "Upper Band", color = color.aqua)//, display = display.none)
plot(series=bbMiddle, title = "MA Band", color = color.red)//, display = display.none)
plot(series=bbLower, title = "Lower Band", color = color.aqua)//, display = display.none)

// PAINT BARS COLORS
bool bulls = (close[1] < bbUpper[1]) and (close > bbUpper)
bool bears = (close[1] > bbLower [1]) and (close < bbLower)
neutral_color = color.new(color.black, 100)
barcolors = bulls ? color.green : bears ? color.red : neutral_color
barcolor(barcolors)

// ======================================================================================================================