Bollinger Bands Reversal Oscillation Trend Strategi

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

img

Ringkasan

Ini adalah strategi trend goyangan pembalikan berdasarkan saluran Bollinger Bands. Ia menggunakan saluran atas dan bawah Bollinger Bands untuk menentukan trend, dan mencari peluang pembalikan apabila harga mendekati sempadan saluran.

Logika Strategi

Strategi ini menggunakan Bollinger Bands sebagai penunjuk teknikal utama. Bollinger Bands terdiri daripada purata bergerak n-periode dan penyimpangan band atas/bawah. Band atas = MA n-periode + m * penyimpangan standard n-periode, band bawah = MA n-periode - m * penyimpangan standard n-periode. n dan m adalah parameter.

Apabila harga mendekati band atas, ia menunjukkan trend menaik tetapi mungkin berbalik pada puncak. Apabila harga mendekati band bawah, ia menunjukkan trend menurun tetapi mungkin berbalik di bahagian bawah. Penembusan Band Bollinger yang berkesan boleh menandakan potensi pembalikan.

Peraturan perdagangan khusus ialah:

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

  2. Menggunakan purata bergerak n-periode sebagai isyarat mengambil keuntungan dan berhenti kerugian. Tutup panjang apabila tutup pecah di bawah MA, tutup pendek apabila tutup pecah di atas MA.

  3. Gunakan kuantiti tetap untuk setiap perdagangan.

  4. Menggunakan saiz kedudukan pecahan tetap. Meningkatkan saiz kedudukan dengan jumlah tetap apabila memenuhi nisbah keuntungan tetap, mengurangkan saiz apabila kerugian.

Analisis Kelebihan

Kelebihan strategi ini:

  1. Menggunakan saluran Bollinger Bands untuk menentukan arah trend dan pembalikan perdagangan, mengelakkan kebanyakan whipsaws dan meningkatkan kadar kemenangan.

  2. Purata bergerak adalah isyarat mengambil keuntungan / berhenti rugi yang boleh dipercayai, kunci dalam kebanyakan keuntungan.

  3. Kuantiti tetap adalah mudah dan mudah dilaksanakan, tidak memerlukan pengiraan yang rumit.

  4. Ukuran kedudukan pecahan tetap meningkatkan keuntungan sementara mengawal risiko dengan penyesuaian kedudukan.

Analisis Risiko

Risiko strategi ini:

  1. Bollinger Bands boleh menghasilkan isyarat yang salah, menyebabkan kerugian perdagangan terhadap trend.

  2. Kelemahan purata bergerak boleh menyebabkan keuntungan yang tidak mencukupi.

  3. Kuantiti tetap tidak dapat disesuaikan dengan keadaan pasaran, risiko saiz kedudukan yang lebih besar / kurang.

  4. Penyesuaian saiz kedudukan yang agresif dalam kaedah pecahan tetap boleh meningkatkan kerugian.

Penyelesaian: Mengoptimumkan parameter Bollinger Bands untuk meningkatkan ketepatan isyarat. Tambah penunjuk lain untuk menentukan trend. Mengurangkan saiz kuantiti tetap. Nisbah pelarasan saiz kedudukan yang lebih rendah dalam kaedah ukuran kedudukan pecahan.

Arahan Penambahbaikan

Strategi ini boleh ditingkatkan dari aspek berikut:

  1. Mengoptimumkan Bollinger Bands parameter seperti n dan m untuk meningkatkan ketepatan.

  2. Tambah penunjuk lain seperti MACD, KD untuk mengelakkan isyarat yang salah.

  3. Mengubah kuantiti tetap kepada kedudukan dinamik berdasarkan keadaan pasaran.

  4. Nisbah penyesuaian saiz kedudukan yang lebih rendah dalam saiz kedudukan pecahan untuk melengkung ekuiti yang lancar.

  5. Tambah strategi stop loss seperti stop loss bergerak, stop loss pecah untuk mengawal risiko.

  6. Pengoptimuman parameter untuk mencari kombinasi parameter yang optimum.

Ringkasan

Ringkasnya, ini adalah strategi pembalikan Bollinger Bands biasa. Ia mengenal pasti titik pembalikan oleh Bollinger Bands, menetapkan mengambil keuntungan / menghentikan kerugian dengan purata bergerak, mengawal risiko dengan kuantiti tetap dan saiz kedudukan pecahan. Sebagai strategi pembalikan, secara teori ia mengelakkan beberapa whipsaws dan meningkatkan keuntungan berbanding dengan strategi Bollinger Bands tradisional. Walau bagaimanapun, kelemahan dalam Bollinger Bands, purata bergerak memerlukan pengoptimuman dan pengurusan risiko yang lebih lanjut untuk aplikasi praktikal yang kukuh.


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