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.
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:
Pergi panjang apabila dekat > band atas, pergi pendek apabila dekat < band bawah.
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.
Gunakan kuantiti tetap untuk setiap perdagangan.
Menggunakan saiz kedudukan pecahan tetap. Meningkatkan saiz kedudukan dengan jumlah tetap apabila memenuhi nisbah keuntungan tetap, mengurangkan saiz apabila kerugian.
Kelebihan strategi ini:
Menggunakan saluran Bollinger Bands untuk menentukan arah trend dan pembalikan perdagangan, mengelakkan kebanyakan whipsaws dan meningkatkan kadar kemenangan.
Purata bergerak adalah isyarat mengambil keuntungan / berhenti rugi yang boleh dipercayai, kunci dalam kebanyakan keuntungan.
Kuantiti tetap adalah mudah dan mudah dilaksanakan, tidak memerlukan pengiraan yang rumit.
Ukuran kedudukan pecahan tetap meningkatkan keuntungan sementara mengawal risiko dengan penyesuaian kedudukan.
Risiko strategi ini:
Bollinger Bands boleh menghasilkan isyarat yang salah, menyebabkan kerugian perdagangan terhadap trend.
Kelemahan purata bergerak boleh menyebabkan keuntungan yang tidak mencukupi.
Kuantiti tetap tidak dapat disesuaikan dengan keadaan pasaran, risiko saiz kedudukan yang lebih besar / kurang.
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.
Strategi ini boleh ditingkatkan dari aspek berikut:
Mengoptimumkan Bollinger Bands parameter seperti n dan m untuk meningkatkan ketepatan.
Tambah penunjuk lain seperti MACD, KD untuk mengelakkan isyarat yang salah.
Mengubah kuantiti tetap kepada kedudukan dinamik berdasarkan keadaan pasaran.
Nisbah penyesuaian saiz kedudukan yang lebih rendah dalam saiz kedudukan pecahan untuk melengkung ekuiti yang lancar.
Tambah strategi stop loss seperti stop loss bergerak, stop loss pecah untuk mengawal risiko.
Pengoptimuman parameter untuk mencari kombinasi parameter yang optimum.
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))