Bollinger Bands Reversal Oscillation Trend Strategi

Penulis:ChaoZhang, Tanggal: 2023-10-31 14:30:45
Tag:

img

Gambaran umum

Ini adalah strategi tren osilasi pembalikan berdasarkan saluran Bollinger Bands. Ini menggunakan saluran atas dan bawah Bollinger Bands untuk menentukan tren, dan mencari peluang pembalikan ketika harga mendekati batas saluran.

Logika Strategi

Strategi ini menggunakan Bollinger Bands sebagai indikator teknis utama. Bollinger Bands terdiri dari moving average periode n dan deviasi band atas/bawah. Band atas = MA periode n + m * deviasi standar periode n, band bawah = MA periode n - m * deviasi standar periode n. n dan m adalah parameter.

Ketika harga mendekati band atas, itu menunjukkan tren naik tetapi dapat berbalik pada puncak. Ketika harga mendekati band bawah, itu menunjukkan tren turun tetapi dapat berbalik di bagian bawah. Pemecahan Band Bollinger yang efektif dapat menandakan potensi pembalikan.

Aturan perdagangan khusus adalah:

  1. Pergi panjang ketika dekat > band atas, pergi pendek ketika dekat < band bawah.

  2. Gunakan rata-rata bergerak periode n sebagai sinyal profit taking dan stop loss. tutup panjang ketika close break di bawah MA, tutup pendek ketika close break di atas MA.

  3. Gunakan jumlah tetap untuk setiap perdagangan.

  4. Menggunakan ukuran posisi pecahan tetap. Meningkatkan ukuran posisi dengan jumlah tetap ketika memenuhi rasio keuntungan tetap, mengurangi ukuran ketika kerugian.

Analisis Keuntungan

Keuntungan dari strategi ini:

  1. Menggunakan saluran Bollinger Bands untuk menentukan arah tren dan pembalikan perdagangan, menghindari sebagian besar whipsaws dan meningkatkan tingkat kemenangan.

  2. Rata-rata bergerak adalah sinyal profit taking/stop loss yang dapat diandalkan, mengunci sebagian besar keuntungan.

  3. Jumlah tetap sederhana dan mudah diterapkan, tidak perlu perhitungan yang rumit.

  4. Ukuran posisi pecahan tetap memperluas keuntungan sementara mengendalikan risiko dengan penyesuaian posisi.

Analisis Risiko

Risiko dari strategi ini:

  1. Bollinger Bands dapat menghasilkan sinyal yang salah, menyebabkan kerugian perdagangan melawan tren.

  2. Keterlambatan rata-rata bergerak dapat menyebabkan pengambilan keuntungan yang tidak cukup.

  3. Jumlah tetap tidak dapat beradaptasi dengan kondisi pasar, risiko over/under position sizing.

  4. Penyesuaian ukuran posisi yang agresif dalam metode pecahan tetap dapat memperluas kerugian.

Solusi: Optimalkan parameter Bollinger Bands untuk meningkatkan akurasi sinyal. Tambahkan indikator lain untuk menentukan tren. Kurangi ukuran kuantitas tetap. Kurangi rasio penyesuaian ukuran posisi dalam metode ukuran posisi pecahan.

Arah Peningkatan

Strategi dapat ditingkatkan dari aspek berikut:

  1. Mengoptimalkan Bollinger Bands parameter seperti n dan m untuk meningkatkan akurasi.

  2. Tambahkan indikator lain seperti MACD, KD untuk menghindari sinyal yang salah.

  3. Ubah kuantitas tetap ke posisi dinamis berdasarkan kondisi pasar.

  4. Rasio penyesuaian ukuran posisi yang lebih rendah dalam ukuran posisi pecahan ke kurva ekuitas yang halus.

  5. Tambahkan strategi stop loss seperti stop loss bergerak, stop loss breakout untuk mengendalikan risiko.

  6. Optimasi parameter untuk menemukan kombinasi parameter yang optimal.

Ringkasan

Ringkasnya, ini adalah strategi pembalikan Bollinger Bands yang khas. Ini mengidentifikasi titik pembalikan oleh Bollinger Bands, menetapkan profit taking/stop loss dengan moving average, mengendalikan risiko dengan kuantitas tetap dan ukuran posisi pecahan. Sebagai strategi pembalikan, secara teoritis menghindari beberapa whipsaws dan meningkatkan profitabilitas dibandingkan dengan strategi Bollinger Bands tradisional. Namun, kekurangan dalam Bollinger Bands, moving average memerlukan optimasi lebih lanjut dan manajemen risiko untuk aplikasi praktis yang kuat.


/*backtest
start: 2023-09-30 00:00:00
end: 2023-10-30 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © gsanson66


//This strategy uses the well-known Bollinger Bands Indicator
//@version=5
strategy("BOLLINGER BANDS BACKTESTING", shorttitle="BB BACKTESTING", overlay=true, initial_capital=1000, default_qty_type=strategy.cash, default_qty_value=950, commission_type=strategy.commission.percent, commission_value=0.18)


//----------------------------------------FUNCTIONS---------------------------------------//

//@function Displays text passed to `txt` when called.
debugLabel(txt, color) =>
    label.new(bar_index, high, text = txt, color=color, style = label.style_label_lower_right, textcolor = color.black, size = size.small)

//@function which looks if the close date of the current bar falls inside the date range
inBacktestPeriod(start, end) => (time >= start) and (time <= end)


//---------------------------------------USER INPUTS--------------------------------------//

//Technical parameters
bbLength = input.int(defval=20, minval=1, title="BB Length", group="Technical Parameters")
mult = input.float(defval=2, minval=0.1, title="Standard Deviation Multipler", group="Technical Parameters")
smaLength = input.int(defval=20, minval=1, title="SMA Exit Signal Length", group="Technical Parameters")
//Money Management
fixedRatio = input.int(defval=400, minval=1, title="Fixed Ratio Value ($)", group="Money Management")
increasingOrderAmount = input.int(defval=200, minval=1, title="Increasing Order Amount ($)", group="Money Management")
//Backtesting period
startDate = input(title="Start Date", defval=timestamp("1 Jan 2020 00:00:00"), group="Backtesting Period")
endDate = input(title="End Date", defval=timestamp("1 July 2024 00:00:00"), group="Backtesting Period")


//----------------------------------VARIABLES INITIALISATION-----------------------------//
strategy.initial_capital = 50000
//Exit SMA
smaExit = ta.sma(close, smaLength)
//BB Calculation
basis = ta.sma(close, bbLength)
dev = mult * ta.stdev(close, bbLength)
upperBB = basis + dev
lowerBB = basis - dev
//Money management
equity = strategy.equity - strategy.openprofit
var float capital_ref = strategy.initial_capital
var float cashOrder = strategy.initial_capital * 0.95
//Backtesting period
bool inRange = na


//------------------------------CHECKING SOME CONDITIONS ON EACH SCRIPT EXECUTION-------------------------------//

//Checking if the date belong to the range
inRange := true

//Checking performances of the strategy
if equity > capital_ref + fixedRatio
    spread = (equity - capital_ref)/fixedRatio
    nb_level = int(spread)
    increasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder + increasingOrder
    capital_ref := capital_ref + nb_level*fixedRatio
if equity < capital_ref - fixedRatio
    spread = (capital_ref - equity)/fixedRatio
    nb_level = int(spread)
    decreasingOrder = nb_level * increasingOrderAmount
    cashOrder := cashOrder - decreasingOrder
    capital_ref := capital_ref - nb_level*fixedRatio

//Checking if we close all trades in case where we exit the backtesting period
if strategy.position_size!=0 and not inRange
    strategy.close_all()
    debugLabel("END OF BACKTESTING PERIOD : we close the trade", color=color.rgb(116, 116, 116))


//-----------------------------------EXIT SIGNAL------------------------------//

if strategy.position_size > 0 and close < smaExit
    strategy.close("Long")
if strategy.position_size < 0 and close > smaExit
    strategy.close("Short")


//----------------------------------LONG/SHORT CONDITION---------------------------//

//Long Condition
if close > upperBB and inRange
    qty = cashOrder/close
    strategy.entry("Long", strategy.long, qty)
//Short Condition
if close < lowerBB and inRange
    qty = cashOrder/close
    strategy.entry("Short", strategy.short, qty)


//---------------------------------PLOTTING ELEMENT----------------------------------//

plot(smaExit, color=color.orange)
upperBBPlot = plot(upperBB, color=color.blue)
lowerBBPlot = plot(lowerBB, color=color.blue)
fill(upperBBPlot, lowerBBPlot, title = "Background", color=strategy.position_size>0 ? color.rgb(0, 255, 0, 90) : strategy.position_size<0 ? color.rgb(255, 0, 0, 90) : color.rgb(33, 150, 243, 95))


Lebih banyak