Chiến lược Bollinger Bands Standard Deviation Breakout

Tác giả:ChaoZhang, Ngày: 2023-11-21 17:14:04
Tags:

img

Tổng quan

Chiến lược này dựa trên chỉ số Bollinger Bands cổ điển. Nó đi dài khi giá đóng trên dải trên và đi ngắn khi giá đóng dưới dải dưới. Nó thuộc về xu hướng sau chiến lược đột phá.

Chiến lược logic

  1. Mức cơ bản là trung bình di chuyển đơn giản 55 ngày.
  2. Các dải trên và dưới là một độ lệch chuẩn trên và dưới đường cơ bản.
  3. Một tín hiệu dài được tạo ra khi giá đóng trên dải trên.
  4. Một tín hiệu ngắn được tạo ra khi giá đóng dưới dải dưới.
  5. Sử dụng một độ lệch chuẩn thay vì hai độ lệch chuẩn cổ điển làm giảm rủi ro.

Phân tích lợi thế

  1. Sử dụng độ lệch chuẩn thay vì giá trị cố định làm giảm rủi ro.
  2. Trung bình động 55 ngày có thể phản ánh tốt hơn xu hướng trung hạn.
  3. Lưu trộm gần sẽ lọc ra những vụ trốn thoát giả.
  4. Dễ dàng xác định hướng xu hướng thông qua phân tích nhiều khung thời gian.

Phân tích rủi ro

  1. Có xu hướng kiếm được lợi nhuận nhỏ.
  2. Cần phải xem xét tác động của phí giao dịch.
  3. Các tín hiệu thoát hiểm có thể là sự thoát hiểm sai.
  4. Có thể bị mất trượt.

Rủi ro có thể được giảm thiểu bằng cách thiết lập dừng lỗ, xem xét phí giao dịch hoặc thêm bộ lọc chỉ số.

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

  1. Tối ưu hóa các thông số cơ bản để tìm ra đường trung bình động tốt nhất.
  2. Tối ưu hóa kích thước độ lệch chuẩn để tìm các thông số tối ưu.
  3. Thêm các chỉ số âm lượng phụ để đánh giá.
  4. Thêm cơ chế dừng lỗ.

Tóm lại

Lý thuyết tổng thể của chiến lược này là rõ ràng. Nó điều chỉnh rủi ro thông qua chiều rộng băng tần độ lệch chuẩn và tránh breakout sai bằng cách sử dụng breakout gần. Nhưng vẫn cần thiết để ngăn ngừa tổn thất dao động bằng cách sử dụng dừng lỗ, thêm bộ lọc vv


/*backtest
start: 2023-11-13 00:00:00
end: 2023-11-20 00:00:00
period: 1m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

//┌───── •••• ─────┐//
//   TradeChartist  //
//└───── •••• ─────┘//

//Bollinger Bands is a classic indicator that uses a simple moving average of 20 periods along with upper and lower bands that are 2 standard deviations away from the basis line. 
//These bands help visualize price volatility and trend based on where the price is in relation to the bands.

//This Bollinger Bands filter plots a long signal when price closes above the upper band and plots a short signal when price closes below the lower band. 
//It doesn't take into account any other parameters such as Volume/RSI/fundamentals etc, so user must use discretion based on confirmations from another indicator or based on fundamentals.

//This filter's default is 55 SMA and 1 standard deviation, but can be changed based on asset type

//It is definitely worth reading the 22 rules of Bollinger Bands written by John Bollinger. 


strategy(shorttitle="BB Breakout Strategy", title="Bollinger Bands Filter", overlay=true, 
             pyramiding=1, currency=currency.NONE , 
             initial_capital = 10000, default_qty_type = strategy.percent_of_equity, 
             default_qty_value=100, calc_on_every_tick= true, process_orders_on_close=false)

src         = input(close, title = "Source")
length      = input(55, minval=1, title = "SMA length")// 20 for classis Bollinger Bands SMA line (basis)


mult        = input(1., minval=0.236, maxval=2, title="Standard Deviation")//2 for Classic Bollinger Bands //Maxval = 2 as higher the deviation, higher the risk
basis       = sma(src, length)
dev         = mult * stdev(src,length)

CC          = input(true, "Color Bars")


upper       = basis + dev
lower       = basis - dev

//Conditions for Long and Short - Extra filter condition can be used such as RSI or CCI etc.

short       = src<lower// and rsi(close,14)<40
long        = src>upper// and rsi(close,14)>60

L1          = barssince(long)
S1          = barssince(short)

longSignal  = L1<S1 and not (L1<S1)[1]
shortSignal = S1<L1 and not (S1<L1)[1]

//Plots and Fills



////Long/Short shapes with text
// plotshape(S1<L1 and not (S1<L1)[1]?close:na, text = "sᴇʟʟ", textcolor=#ff0100, color=#ff0100, style=shape.triangledown, size=size.small, location=location.abovebar, transp=0, title = "SELL", editable = true)
// plotshape(L1<S1 and not (L1<S1)[1]?close:na, text = "ʙᴜʏ", textcolor = #008000, color=#008000, style=shape.triangleup, size=size.small, location=location.belowbar, transp=0, title = "BUY", editable = true)  


// plotshape(shortSignal?close:na, color=#ff0100, style=shape.triangledown, size=size.small, location=location.abovebar, transp=0, title = "Short Signal", editable = true)
// plotshape(longSignal?close:na, color=#008000, style=shape.triangleup, size=size.small, location=location.belowbar, transp=0, title = "Long Signal", editable = true)  



p1          = plot(upper, color=#ff0000, display=display.all, transp=75, title = "Upper Band")
p2          = plot(lower, color=#008000, display=display.all, transp=75, title = "Lower Band")


p           = plot(basis, color=L1<S1?#008000:S1<L1?#ff0000:na, linewidth=2, editable=false, title="Basis")


fill(p,p1, color=color.teal, transp=85, title = "Top Fill") //fill for basis-upper
fill(p,p2, color=color.orange, transp=85, title = "Bottom Fill")//fill for basis-lower


//Barcolor

bcol        = src>upper?color.new(#8ceb07,0): 
             src<lower?color.new(#ff0000,0):
             src>basis?color.green:
             src<basis?color.red:na


barcolor(CC?bcol:na, editable=false, title = "Color Bars")



// //Alerts ----  // Use 'Once per bar close'

// alertcondition(condition=longSignal, title="Long - BB Filter", message='BB Filter Long @ {{close}}') // Use 'Once per bar close'
// alertcondition(condition=shortSignal, title="Short - BB Filter", message='BB Filter Short @ {{close}}')  // Use 'Once per bar close'

Notestart1 = input(true, "╔═══ Time Range to BackTest ═══╗") 


// === INPUT BACKTEST RANGE ===
FromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
FromDay = input(defval=1, title="From Day", minval=1, maxval=31)
FromYear = input(defval=2018, title="From Year", minval=2015)
ToMonth = input(defval=1, title="To Month", minval=1, maxval=12)
ToDay = input(defval=1, title="To Day", minval=1, maxval=31)
ToYear = input(defval=9999, title="To Year", minval=2010)

// === FUNCTION EXAMPLE === 
start = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)  // backtest finish window
window() =>  // create function "within window of time"
    time >= start and time <= finish ? true : false 

if(window())
    strategy.entry("Long", long=true, when =  longSignal)
    // strategy.close("Long", when = (short and S3==0), comment = "Close Long")

if(window())
    strategy.entry("Short", long=false, when = shortSignal)
    // strategy.close("Short", when = (long and L3==0), comment = "Close Short")



Thêm nữa