Bollinger Bands Trend Mengikut Strategi

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

img

Ringkasan

Strategi ini dinamakan Bollinger Bands Trend Following Strategy. Ia menggunakan penunjuk Bollinger Bands untuk menentukan trend harga dan masuk panjang atau pendek apabila harga keluar dari saluran Bollinger Bands. Ia menggabungkan penapis purata bergerak untuk menilai arah trend apabila pecah, dengan itu memutuskan antara entri panjang dan pendek.

Prinsip-prinsip

Strategi ini bergantung terutamanya pada penunjuk Bollinger Bands untuk menentukan trend harga dan titik masuk.

  1. Garis tengah: purata bergerak n hari
  2. Garis atas: penyimpangan standard n hari ke atas
  3. Garis bawah: penyimpangan standard n hari ke bawah

Apabila harga pecah ke atas dari garisan bawah melalui garisan atas, trend menaik dikenal pasti. Apabila harga pecah ke bawah dari garisan atas melalui garisan bawah, trend menurun telah bermula. Strategi memasuki panjang atau pendek pada kejadian kedua-dua jenis pecah ini.

Secara khusus, logik strategi adalah:

  1. Masuk panjang apabila dekat pecah ke atas dari garis bawah Bands.
  2. Masuk pendek apabila dekat pecah ke bawah dari garis atas Bands.

Untuk mengelakkan pecah palsu, penapis purata bergerak ditambahkan.

Di sini purata bergerak eksponen digunakan sebagai penunjuk.

Ringkasnya, kriteria untuk menentukan trend breakout adalah:

  1. Isyarat panjang: Penutupan pecah Garis atas && Penutupan pecah purata bergerak
  2. Isyarat pendek: Penutupan pecah Garis bawah && Penutupan pecah purata bergerak

Selepas masuk, stop loss mengikuti garisan tengah. keluar apabila harga menyentuh garisan tengah lagi.

Analisis Kekuatan

Kekuatan utama strategi ini termasuk:

  1. Menangkap trend baru yang terbentuk oleh penembusan garisan tengah. saluran Bands menyediakan ruang untuk turun naik harga, isyarat penembusan permulaan arah baru.
  2. Elakkan pecah palsu melalui penapis purata bergerak, memastikan kemasukan hanya pada pembalikan trend sebenar.
  3. Mekanisme stop loss terbina dalam dengan mengesan garis tengah, mengawal risiko dengan berkesan.
  4. Logik yang mudah dan jelas, mudah difahami dan dilaksanakan, sesuai untuk strategi perdagangan algo.
  5. Menggunakan saluran Band dan penunjuk purata bergerak, tidak perlu meramalkan harga, mengenal pasti trend berdasarkan bukti selepas fakta.

Analisis Risiko

Walaupun kelebihan, strategi ini juga membawa risiko berikut:

  1. Parameter Bands yang tidak betul boleh meningkatkan kekerapan perdagangan dan risiko. Tetapan yang terlalu sensitif boleh menyebabkan pecah palsu yang berlebihan dan omzet sistem yang tinggi.
  2. Pemilihan parameter purata bergerak yang tidak mencukupi boleh menyebabkan tren sebenar hilang atau menghasilkan isyarat palsu. Penyesuaian parameter melalui ujian dan pengoptimuman berulang diperlukan.
  3. Stop loss bergantung pada garisan tengah, mungkin keluar lebih awal atau membenarkan terlalu banyak ruang retracement. Ini boleh menyebabkan kehilangan kebanyakan keuntungan atau peningkatan risiko kerugian.

Untuk mengawal risiko di atas, pengoptimuman berikut boleh dilakukan:

  1. Sesuaikan parameter Bands dengan betul, meningkatkan lebar saluran untuk mengurangkan kebarangkalian pecah palsu.
  2. Uji jenis dan panjang purata bergerak yang berbeza untuk mencari kombinasi yang optimum.
  3. Cuba kaedah stop loss yang lain, contohnya, stop loss trailing atau tahap stop loss progresif.

Arahan pengoptimuman

Berdasarkan analisis risiko, pengoptimuman lanjut boleh dilakukan dalam bidang berikut:

  1. Pengoptimuman Parameter: Gunakan kaedah yang lebih sistematik seperti algoritma genetik untuk mencari kombinasi parameter optimum untuk Band dan purata bergerak, untuk menjadikan strategi lebih stabil dan menguntungkan.

  2. Hentikan Peningkatan Kerugian: Uji teknik stop loss yang berbeza seperti berhenti ATR, berhenti menyusul dan lain-lain, untuk menentukan mekanisme berhenti yang terbaik.

  3. Pengoptimuman Penapis: Cuba menambah penunjuk lain seperti RSI, KD dll sebagai penapis tambahan, untuk mengurangkan kebarangkalian isyarat palsu dan meningkatkan kadar keuntungan.

  4. Kriteria kemasukan Optimum: Tambah pertimbangan lain seperti keadaan trend, VOLUME yang tidak normal dan lain-lain untuk memilih masa kemasukan dengan ketat, mengelakkan kemasukan yang tidak perlu.

  5. Pembelajaran Mesin: Mengumpul lebih banyak data sejarah untuk membina LSTM, RNN dan model pembelajaran mendalam yang lain, untuk membolehkan masa masuk dan keluar terbaik yang dikuasakan oleh AI.

  6. Pengurusan risiko-balasan dinamik: Menggabungkan berhenti nisbah tetap, sasaran keuntungan meningkat selepas mencapai tahap keuntungan tertentu dan lain-lain untuk mengawal risiko pembayaran secara dinamik.

Melalui pengoptimuman dalam bidang di atas, metrik utama seperti kestabilan, keuntungan, keupayaan penyesuaian risiko dapat ditingkatkan secara komprehensif, mengubah strategi menjadi algoritma tahap pengeluaran yang sesuai untuk perdagangan langsung.

Kesimpulan

Kesimpulannya, Bollinger Bands Trend Following Strategy mengenal pasti trend harga menggunakan penunjuk Bands dan purata bergerak, memasuki titik pecah utama. Ia mempunyai kelebihan logik yang jelas, kesederhanaan, kemudahan pelaksanaan sementara juga mempunyai bidang untuk penambahbaikan seperti penyesuaian parameter, mekanisme stop loss. Penyempurnaan lanjut seperti pengoptimuman parameter, peningkatan stop loss, integrasi pembelajaran mesin dapat mengubahnya menjadi sistem perdagangan algo yang kukuh 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 lanjut