Chiến lược phá vỡ băng Bollinger gấp đôi

Tác giả:ChaoZhang, Ngày: 2024-01-03 12:06:31
Tags:

img

Tổng quan

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 logic

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.

Phân tích lợi thế

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.

Phân tích rủi ro

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.

Hướng dẫn tối ưu hóa

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.

Kết luậ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)


Thêm nữa