Chiến lược Breakout Double Bollinger Band là một chiến lược giao dịch ngắn hạn sử dụng chỉ số Bollinger Band. Nó sử dụng hai Bollinger Band với các thiết lập tham số khác nhau, nhanh và chậm, để xác định các cơ hội giao dịch khi các dải bị phá vỡ hoặc giảm.
Chiến lược này sử dụng một Bollinger Band nhanh với chiều dài 20 và độ lệch chuẩn 1, và một Bollinger Band chậm với chiều dài 50 và độ lệch chuẩn 1. Khi giá đóng phá vỡ trên dải trên của Bollinger nhanh, một vị trí dài được nhập bằng cách sử dụng giá đóng. Khi giá đóng phá vỡ dưới dải dưới của Bollinger nhanh, một vị trí ngắn được nhập.
Một khi vào vị trí, chiến lược chờ xác nhận thêm bằng cách giá phá vỡ dải trên hoặc dưới của Bollinger chậm. Ngoài ra, chỉ số RSI được sử dụng để xác định hướng xu hướng. Các tín hiệu mua từ các đột phá dải trên chỉ được xem xét khi RSI trên 50.
Sau khi các vị trí được thiết lập, chúng sẽ được đóng khi giá phá vỡ trở lại bên trong các Bollinger Bands nhanh lên hoặc xuống.
Lợi thế chính của Chiến lược Breakout Double Bollinger Band nằm ở khả năng nắm bắt các động thái nhỏ. Bằng cách sử dụng Bollinger Band nhanh để bắt những bước đột phá nhỏ và Bollinger Band chậm để lọc các tín hiệu sai, nó có thể kiếm lợi từ các biến động trong phạm vi thấp. Việc thêm RSI cũng giúp tránh bỏ lỡ những biến đổi xu hướng lớn trong các thị trường dao động.
Hơn nữa, như một chỉ số động lực, Bollinger Band xuất sắc trong việc phát hiện các giai đoạn biến động cao trên thị trường, có lợi cho các chiến lược giao dịch ngắn hạn.
Rủi ro lớn đến từ các tín hiệu giao dịch có thể quá mức được tạo ra bởi thiết lập Bollinger đôi, có thể không lọc tiếng ồn thị trường hiệu quả. Điều này có thể dẫn đến tổn thất tích lũy từ các giao dịch sai. Ngoài ra, khi biến động thấp, chiều rộng của các dải thu hẹp và cơ hội giao dịch giảm.
Để giảm thiểu rủi ro, các thông số của Bollinger Bands có thể được điều chỉnh, sử dụng các băng tần chậm lâu hơn hoặc xác nhận bằng tay các tín hiệu.
Không gian tối ưu hóa chính nằm trong việc điều chỉnh các thông số của Bollinger Bands và RSI. Ví dụ, thử nghiệm các khoảng thời gian khác nhau cho các dải nhanh và chậm để tìm sự kết hợp tối ưu. Hoặc thử các khoảng thời gian RSI khác nhau để xem liệu hiệu suất chiến lược có thể được cải thiện hay không.
Một hướng khác là thêm hoặc sửa đổi logic dừng lỗ. Hiện tại không có cơ chế dừng lỗ, làm tăng rủi ro rút tiền tối đa. Thêm tỷ lệ phần trăm cố định hoặc dừng lỗ sau có thể cải thiện đáng kể số liệu rủi ro-lợi nhuận.
Chiến lược Breakout Double Bollinger Band là một chiến lược giao dịch động lực ngắn hạn nhạy cảm với sự biến động của thị trường. Nó nắm bắt các biến động giá nhỏ trong các thị trường biến động khi các tín hiệu rõ ràng được cung cấp bởi thiết lập Bollinger kép. Tuy nhiên, cần thêm bằng chứng về độ tin cậy. Thông qua điều chỉnh tham số và thêm logic dừng lỗ, có tiềm năng tốt để cải thiện thêm sự ổn định.
/*backtest start: 2022-12-27 00:00:00 end: 2024-01-02 00:00:00 period: 1d basePeriod: 1h 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/ // From "Bitcoin Trading Strategies: Algorithmic Trading Strategies For Bitcoin And Cryptocurrency That Work" by David Hanson. // "Double Bolinger Band Scalping System // Recommended Timeframe: 1 minute or 5 minute // Required Indicators: // - RSI with a length of 14 (default settings) // - Bolinger band #1 settings: Length = 50, stDev = 1 Hide the basis/middle line (basis line not needed for this strategy) // Note: This is the slower bolinger band in the directions // - Bolinger band #2 settings: Length 20, stDev = 1 Hide the basis/middle line (basis line not needed for this strategy) // Note: This is the faster bolinger band in the directions // Enter Long/Buy Trade When: // - RSI is above the level 50 // - A candle closes above the top of the faster bolinger band // Enter a long when a candle then closes above the top of the slower bolinger band, and price is above the top of both bands // Place a stop loss under the low of the entry candle Example of a long trade using this strategy // Exit Long Trade When: A candle closes below the top band of the fast bolinger band // Enter Short/Sell Trade When: // - RSI is below the level 50 // - A candle closes below the bottom of the faster bolinger band // Enter a short when a candle then closes below the bottom of the slower bolinger band, and price is below both bands // Place a stop loss above the high of the entry candle Example of a short trade using this strategy // Exit Short Trade When: Price closes inside the bottom of the faster bolinger band" // © tweakerID //@version=4 strategy("Double Bollinger Strategy", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100, initial_capital=10000, commission_value=0.04, calc_on_every_tick=false, slippage=0) direction = input(0, title = "Strategy Direction", type=input.integer, minval=-1, maxval=1) strategy.risk.allow_entry_in(direction == 0 ? strategy.direction.all : (direction < 0 ? strategy.direction.short : strategy.direction.long)) /////////////////////// STRATEGY INPUTS //////////////////////////////////////// title1=input(true, "-----------------Strategy Inputs-------------------") i_RSI=input(14, title="RSI Length") lengthS = input(45, minval=1, title="Slow BB Band Length") lengthF = input(31, minval=1, title="Fast BB Band Length") /////////////////////// BACKTESTER ///////////////////////////////////////////// title2=input(true, "-----------------General Inputs-------------------") // Backtester General Inputs i_SL=input(true, title="Use Stop Loss and Take Profit") i_SLType=input(defval="Strategy Stop", title="Type Of Stop", options=["Strategy Stop", "Swing Lo/Hi", "ATR Stop"]) i_SPL=input(defval=10, title="Swing Point Lookback") i_PercIncrement=input(defval=1, step=.1, title="Swing Point SL Perc Increment")*0.01 i_ATR = input(14, title="ATR Length") i_ATRMult = input(5, step=.1, title="ATR Multiple") i_TPRRR = input(2, step=.1, title="Take Profit Risk Reward Ratio") TS=input(false, title="Trailing Stop") // Bought and Sold Boolean Signal bought = strategy.position_size > strategy.position_size[1] or strategy.position_size < strategy.position_size[1] // Price Action Stop and Take Profit LL=(lowest(i_SPL))*(1-i_PercIncrement) HH=(highest(i_SPL))*(1+i_PercIncrement) LL_price = valuewhen(bought, LL, 0) HH_price = valuewhen(bought, HH, 0) entry_LL_price = strategy.position_size > 0 ? LL_price : na entry_HH_price = strategy.position_size < 0 ? HH_price : na tp=strategy.position_avg_price + (strategy.position_avg_price - entry_LL_price)*i_TPRRR stp=strategy.position_avg_price - (entry_HH_price - strategy.position_avg_price)*i_TPRRR // ATR Stop ATR=atr(i_ATR)*i_ATRMult ATRLong = ohlc4 - ATR ATRShort = ohlc4 + ATR ATRLongStop = valuewhen(bought, ATRLong, 0) ATRShortStop = valuewhen(bought, ATRShort, 0) LongSL_ATR_price = strategy.position_size > 0 ? ATRLongStop : na ShortSL_ATR_price = strategy.position_size < 0 ? ATRShortStop : na ATRtp=strategy.position_avg_price + (strategy.position_avg_price - LongSL_ATR_price)*i_TPRRR ATRstp=strategy.position_avg_price - (ShortSL_ATR_price - strategy.position_avg_price)*i_TPRRR // Strategy Stop float LongStop = valuewhen(bought,low[1],0)*(1-i_PercIncrement) float ShortStop = valuewhen(bought,high[1],0)*(1+i_PercIncrement) float StratTP = na float StratSTP = na /////////////////////// STRATEGY LOGIC ///////////////////////////////////////// //RSI RSI=rsi(close, i_RSI) //BOLL1 [middleS, upperS, lowerS] = bb(close, lengthS, 1) p1 = plot(upperS, "Slow BB Upper Band", color=color.teal) p2 = plot(lowerS, "Slow BB Lower Band", color=color.teal) fill(p1, p2, title = "Slow BB Background", color=color.blue, transp=95) //BOLL2 [middleF, upperF, lowerF] = bb(close, lengthF, 1) p1F = plot(upperF, "Fast BB Upper Band", color=color.gray) p2F = plot(lowerF, "Fast BB Lower Band", color=color.gray) fill(p1F, p2F, title = "Fast BB Background", color=color.white, transp=95) BUY = bar_index > 40 and (RSI > 50) and (close > upperF) and crossover(close, upperS) SELL = bar_index > 40 and (RSI < 50) and (close < lowerF) and crossunder(close, lowerS) longexit=close < upperF shortexit=close > lowerF //Trading Inputs i_strategyClose=input(true, title="Use Strategy Close Logic") DPR=input(true, "Allow Direct Position Reverse") reverse=input(false, "Reverse Trades") // Entries if reverse if not DPR strategy.entry("long", strategy.long, when=SELL and strategy.position_size == 0) strategy.entry("short", strategy.short, when=BUY and strategy.position_size == 0) else strategy.entry("long", strategy.long, when=SELL) strategy.entry("short", strategy.short, when=BUY) else if not DPR strategy.entry("long", strategy.long, when=BUY and strategy.position_size == 0) strategy.entry("short", strategy.short, when=SELL and strategy.position_size == 0) else strategy.entry("long", strategy.long, when=BUY) strategy.entry("short", strategy.short, when=SELL) if i_strategyClose strategy.close("long", when=longexit) strategy.close("short", when=shortexit) SL= i_SLType == "Swing Lo/Hi" ? entry_LL_price : i_SLType == "ATR Stop" ? LongSL_ATR_price : LongStop SSL= i_SLType == "Swing Lo/Hi" ? entry_HH_price : i_SLType == "ATR Stop" ? ShortSL_ATR_price : ShortStop TP= i_SLType == "Swing Lo/Hi" ? tp : i_SLType == "ATR Stop" ? ATRtp : StratTP STP= i_SLType == "Swing Lo/Hi" ? stp : i_SLType == "ATR Stop" ? ATRstp : StratSTP //TrailingStop dif=(valuewhen(strategy.position_size>0 and strategy.position_size[1]<=0, high,0)) -strategy.position_avg_price trailOffset = strategy.position_avg_price - SL var tstop = float(na) if strategy.position_size > 0 tstop := high- trailOffset - dif if tstop<tstop[1] tstop:=tstop[1] else tstop := na StrailOffset = SSL - strategy.position_avg_price var Ststop = float(na) Sdif=strategy.position_avg_price-(valuewhen(strategy.position_size<0 and strategy.position_size[1]>=0, low,0)) if strategy.position_size < 0 Ststop := low+ StrailOffset + Sdif if Ststop>Ststop[1] Ststop:=Ststop[1] else Ststop := na strategy.exit("TP & SL", "long", limit=TP, stop=TS? tstop : SL, when=i_SL) strategy.exit("TP & SL", "short", limit=STP, stop=TS? Ststop : SSL, when=i_SL) /////////////////////// PLOTS ////////////////////////////////////////////////// plot(i_SL and strategy.position_size > 0 and not TS ? SL : i_SL and strategy.position_size > 0 and TS ? tstop : na , title='SL', style=plot.style_cross, color=color.red) plot(i_SL and strategy.position_size < 0 and not TS ? SSL : i_SL and strategy.position_size < 0 and TS ? Ststop : na , title='SSL', style=plot.style_cross, color=color.red) plot(i_SL and strategy.position_size > 0 ? TP : na, title='TP', style=plot.style_cross, color=color.green) plot(i_SL and strategy.position_size < 0 ? STP : na, title='STP', style=plot.style_cross, color=color.green) // Draw price action setup arrows plotshape(BUY ? 1 : na, style=shape.triangleup, location=location.belowbar, color=color.green, title="Bullish Setup", size=size.auto) plotshape(SELL ? 1 : na, style=shape.triangledown, location=location.abovebar, color=color.red, title="Bearish Setup", size=size.auto)