Sumber daya yang dimuat... Pemuatan...

Bollinger Bands Trend Mengikuti Strategi

Penulis:ChaoZhang, Tanggal: 2024-01-15 14:31:21
Tag:

img

Gambaran umum

Strategi ini disebut Bollinger Bands Trend Following Strategy. Ini menggunakan indikator Bollinger Bands untuk menentukan tren harga dan masuk panjang atau pendek ketika harga keluar dari saluran Bollinger Bands.

Prinsip-prinsip

Strategi ini terutama bergantung pada indikator Bollinger Bands untuk menentukan tren harga dan titik masuk.

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

Ketika harga pecah ke atas dari garis bawah melalui garis atas, tren bullish diidentifikasi. Ketika harga pecah ke bawah dari garis atas melalui garis bawah, tren bearish telah dimulai. Strategi masuk panjang atau pendek pada terjadinya kedua jenis pecah ini.

Secara khusus, logika strategi adalah:

  1. Masuk panjang ketika dekat pecah keluar ke atas dari garis bawah Bands.
  2. Masuk pendek ketika dekat putus ke bawah dari garis atas Bands.

Untuk menghindari kebocoran palsu, filter rata-rata bergerak ditambahkan.

Di sini Rata-rata Gerak Eksponensial digunakan sebagai indikator.

Singkatnya, kriteria untuk menentukan trend breakout adalah:

  1. Sinyal panjang: Tutup keluar Band garis atas && Tutup keluar rata-rata bergerak
  2. Sinyal pendek: Tutup keluar Band garis bawah && Tutup keluar rata-rata bergerak

Setelah masuk, stop loss melacak garis tengah. keluar ketika harga menyentuh garis tengah lagi.

Analisis Kekuatan

Kekuatan utama dari strategi ini meliputi:

  1. Catch tren baru yang terbentuk oleh garis tengah breakout. saluran Bands memberikan ruang untuk fluktuasi harga, sinyal breakout awal arah baru.
  2. Hindari pecah palsu melalui filter rata-rata bergerak, memastikan entri hanya pada pembalikan tren yang sebenarnya.
  3. Mekanisme stop loss internal dengan melacak garis tengah, secara efektif mengendalikan risiko.
  4. Logika yang sederhana dan jelas, mudah dimengerti dan diimplementasikan, cocok untuk strategi perdagangan algo.
  5. Menggunakan saluran Bands dan indikator rata-rata bergerak, tidak perlu memprediksi harga, mengidentifikasi tren berdasarkan bukti setelah fakta.

Analisis Risiko

Meskipun ada keuntungan, strategi ini juga membawa risiko berikut:

  1. Parameter Bands yang tidak tepat dapat meningkatkan frekuensi perdagangan dan risiko.
  2. Pemilihan parameter rata-rata bergerak yang tidak memadai dapat menyebabkan hilangnya tren aktual atau menghasilkan sinyal palsu.
  3. Stop loss bergantung pada garis tengah, mungkin keluar lebih awal atau memungkinkan terlalu banyak ruang retracement.

Untuk mengendalikan risiko di atas, optimasi berikut dapat dilakukan:

  1. Sesuaikan parameter Bands dengan benar, meningkatkan lebar saluran untuk mengurangi kemungkinan pecah palsu.
  2. Uji jenis dan panjang rata-rata bergerak yang berbeda untuk menemukan kombinasi yang optimal.
  3. Cobalah metode stop loss lainnya, misalnya trailing stop loss atau progressive stop loss levels.

Arahan Optimasi

Berdasarkan analisis risiko, optimasi lebih lanjut dapat dilakukan di bidang berikut:

  1. Optimasi Parameter: Gunakan metode yang lebih sistematis seperti algoritma genetik untuk menemukan kombinasi parameter optimal untuk Band dan moving average, untuk membuat strategi lebih stabil dan menguntungkan.

  2. Optimasi Stop Loss: Uji teknik stop loss yang berbeda seperti ATR stop, trailing stop dll, untuk menentukan mekanisme stop terbaik.

  3. Optimasi Filter: Coba tambahkan indikator lain seperti RSI, KD dll sebagai filter tambahan, untuk menurunkan probabilitas sinyal palsu dan meningkatkan tingkat profitabilitas.

  4. Optimasi Kriteria Masuk: Tambahkan pertimbangan lain seperti kondisi tren, volume abnormal dll untuk memilih waktu masuk secara ketat, menghindari entri yang tidak perlu.

  5. Pembelajaran Mesin: Mengumpulkan lebih banyak data historis untuk membangun LSTM, RNN dan model pembelajaran mendalam lainnya, sehingga memungkinkan waktu masuk dan keluar terbaik yang didukung AI.

  6. Manajemen risiko-imbalan yang dinamis: Menggabungkan berhenti rasio tetap, target keuntungan lonjakan setelah mencapai tingkat keuntungan tertentu dll untuk secara dinamis mengendalikan risiko-payoff.

Melalui optimasi di bidang di atas, metrik kunci seperti stabilitas, profitabilitas, kemampuan penyesuaian risiko dapat ditingkatkan secara komprehensif, mengubah strategi menjadi algoritma tingkat produksi yang cocok untuk perdagangan langsung.

Kesimpulan

Kesimpulannya, Bollinger Bands Trend Following Strategy mengidentifikasi tren harga menggunakan indikator Bands dan moving average, memasuki titik-titik penting. Ini memiliki pro logika yang jelas, kesederhanaan, kemudahan implementasi sementara juga memiliki area untuk perbaikan seperti pengaturan parameter, mekanisme stop loss. penyempurnaan lebih lanjut seperti optimasi parameter, peningkatan stop loss, integrasi pembelajaran mesin dapat mengubahnya menjadi sistem perdagangan algo yang kuat dan stabil.


/*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)

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


Lebih banyak