Đây là một chiến lược xu hướng dao động đảo ngược dựa trên kênh Bollinger Bands. Nó sử dụng kênh trên và dưới của Bollinger Bands để xác định xu hướng và tìm kiếm các cơ hội đảo ngược khi giá tiếp cận ranh giới kênh.
Chiến lược này sử dụng Bollinger Bands làm chỉ số kỹ thuật chính. Bollinger Bands bao gồm trung bình động n giai đoạn và sai lệch các dải trên / dưới. Dải trên = MA n giai đoạn + m * sai lệch chuẩn n giai đoạn, dải dưới = MA n giai đoạn - m * sai lệch chuẩn n giai đoạn. n và m là các tham số.
Khi giá tiếp cận dải trên, nó chỉ ra xu hướng tăng nhưng có thể đảo ngược ở đỉnh. Khi giá tiếp cận dải dưới, nó chỉ ra xu hướng giảm nhưng có thể đảo ngược ở đáy. Sự phá vỡ hiệu quả của Bollinger Bands có thể báo hiệu sự đảo ngược tiềm năng.
Các quy tắc giao dịch cụ thể là:
Đi dài khi gần > dải trên, đi ngắn khi gần < dải dưới.
Sử dụng đường trung bình động n thời gian như tín hiệu lấy lợi nhuận và dừng lỗ. Đóng dài khi đóng vỡ dưới MA, đóng ngắn khi đóng vỡ trên MA.
Sử dụng số lượng cố định cho mỗi giao dịch.
Sử dụng định hình kích thước vị trí phân số cố định. Tăng kích thước vị trí bằng số tiền cố định khi đáp ứng tỷ lệ lợi nhuận cố định, giảm kích thước khi mất mát.
Những lợi thế của chiến lược này:
Sử dụng kênh Bollinger Bands để xác định hướng xu hướng và đảo ngược giao dịch, tránh hầu hết các whipsaws và cải thiện tỷ lệ thắng.
Trung bình động là một tín hiệu thu lợi nhuận / dừng lỗ đáng tin cậy, khóa trong hầu hết lợi nhuận.
Số lượng cố định đơn giản và dễ thực hiện, không cần tính toán phức tạp.
Phân tích vị trí phân số cố định mở rộng lợi nhuận trong khi kiểm soát rủi ro bằng cách điều chỉnh vị trí.
Những rủi ro của chiến lược này:
Bollinger Bands có thể tạo ra các tín hiệu không chính xác, gây ra tổn thất giao dịch chống lại xu hướng.
Sự chậm trễ của trung bình động có thể dẫn đến việc thu lợi nhuận không đủ.
Số lượng cố định không thể thích nghi với điều kiện thị trường, rủi ro về kích thước vị trí quá/dưới.
Điều chỉnh kích thước vị trí mạnh mẽ trong phương pháp phân số cố định có thể làm tăng tổn thất.
Giải pháp: Tối ưu hóa các thông số Bollinger Bands để cải thiện độ chính xác tín hiệu. Thêm các chỉ số khác để xác định xu hướng. Giảm kích thước số lượng cố định. Tỷ lệ điều chỉnh kích thước vị trí thấp hơn trong phương pháp kích thước vị trí phân số.
Chiến lược có thể được cải thiện từ các khía cạnh sau:
Tối ưu hóa các thông số Bollinger Bands như n và m để tăng độ chính xác.
Thêm các chỉ số khác như MACD, KD để tránh tín hiệu sai.
Thay đổi số lượng cố định sang định vị năng động dựa trên điều kiện thị trường.
Tỷ lệ điều chỉnh kích thước vị trí thấp hơn trong kích thước vị trí phân số để đường cong vốn chủ sở hữu trơn tru.
Thêm các chiến lược dừng lỗ như dừng lỗ di chuyển, dừng lỗ đột phá để kiểm soát rủi ro.
Tối ưu hóa tham số để tìm kết hợp tham số tối ưu.
Nói tóm lại, đây là một chiến lược đảo ngược Bollinger Bands điển hình. Nó xác định các điểm đảo ngược bởi Bollinger Bands, thiết lập lợi nhuận / dừng lỗ bằng đường trung bình động, kiểm soát rủi ro bằng số lượng cố định và kích thước vị trí phân số. Là một chiến lược đảo ngược, về mặt lý thuyết, nó tránh một số whipsaws và cải thiện lợi nhuận so với các chiến lược Bollinger Bands truyền thống. Tuy nhiên, các khuyết điểm trong Bollinger Bands, đường trung bình động đòi hỏi tối ưu hóa hơn nữa và quản lý rủi ro cho ứng dụng thực tế mạnh mẽ.
/*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))