Chiến lược sóng FiboBuLL dựa trên Bollinger Bands Breakout

Tác giả:ChaoZhang, Ngày: 2023-12-01 14:11:56
Tags:

img

Tổng quan

Chiến lược FiboBuLL Wave được chuyển đổi từ phiên bản lọc của nghiên cứu Bollinger Bands, có thể được tìm thấy dưới trang kịch bản của tôi. Chiến lược đ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.

Bollinger Bands là một chỉ số cổ điển sử dụng trung bình động đơn giản của 20 giai đoạn, cùng với các biểu đồ của các dải trên và dưới cách dải giữa 2 độ lệch chuẩn.

Chiến lược không tính đến bất kỳ thông số nào khác như khối lượng / RSI / Fundamentals vv, vì vậy người dùng phải sử dụng quyết định dựa trên xác nhận từ các chỉ số hoặc cơ bản khác.

Nó hoạt động tốt nhất khi có sự tiếp tục của thanh sau khi giá đóng trên / dưới dải trên / dưới dải dưới. Nó chắc chắn là có lợi để sử dụng chiến lược này hoặc bộ lọc Bollinger Bands cùng với các chỉ số khác để có được cái nhìn ban đầu về vi phạm / thất bại của các dải trên nến đóng trong BB ép hoặc dựa trên biến động.

Chiến lược có thể được sử dụng trên nến Heikin Ashi để phát hiện xu hướng nhưng nến HA không được khuyến cáo cho các mục nhập giao dịch vì chúng không phản ánh giá thực sự của tài sản.

Chiến lược logic

Phong cách cơ bản đằng sau chiến lược FiboBuLL Wave là giao dịch dựa trên sự đột phá của Bollinger Bands. Bollinger Bands bao gồm một dải giữa, dải trên và dải dưới. Dải giữa là một đường trung bình di chuyển đơn giản 21 giai đoạn của giá đóng; Dải trên được tính bằng cách thêm 1 độ lệch chuẩn trên dải giữa, phản ánh phạm vi biến động giá trên; Dải dưới được lấy bằng cách trừ 1 độ lệch chuẩn dưới dải giữa, phản ánh phạm vi chuyển động giá dưới.

Một tín hiệu dài được tạo ra khi giá đóng phá vỡ trên dải trên; Một tín hiệu ngắn được kích hoạt khi giá đóng phá vỡ dưới dải dưới. Sau khi có các vị trí dài hoặc ngắn, các giao dịch hiện có sẽ được đóng khi giá phá vỡ dải đối diện một lần nữa.

Chiến lược này sử dụng hàm barssince để theo dõi sự đột phá của giá so với dải trên và dưới. Một tín hiệu dài được tạo ra khi số thanh kể từ khi đột phá dải trên thấp hơn số thanh của dải dưới. Một tín hiệu ngắn được kích hoạt khi số thanh kể từ khi đột phá dải dưới thấp hơn số thanh của dải trên.

Bằng cách điều chỉnh khoảng thời gian băng tần giữa và các thông số nhân độ lệch chuẩn, độ nhạy của băng tần Bollinger có thể được thay đổi, do đó điều chỉnh thời gian nhập cảnh.

Ưu điểm

Chiến lược FiboBuLL Wave có một số lợi thế:

  1. Logic đơn giản dựa trên BB breakout, dễ hiểu
  2. Nhạy cảm đột phá có thể được kiểm soát bằng cách điều chỉnh các thông số
  3. Các dải BB hiển thị biến động giá và xu hướng
  4. Có thể kết hợp với các chỉ số khác, cải thiện độ chính xác
  5. Áp dụng cho nhiều khung thời gian

Rủi ro

Ngoài ra còn có một số rủi ro cần lưu ý cho chiến lược FiboBuLL Wave:

  1. Có xu hướng tín hiệu sai dựa hoàn toàn vào BB breakout
  2. Không thể xác định động lượng và thời gian sau khi thoát
  3. Không có quy tắc thoát để đảo ngược
  4. Rủi ro cao mà không cần dừng lỗ

Các tối ưu hóa có thể được thực hiện trong các khía cạnh sau:

  1. Thêm bộ lọc sử dụng các chỉ báo khác để tránh tín hiệu sai
  2. Tối ưu hóa các thông số dựa trên dữ liệu lịch sử
  3. Thiết lập stop loss để giới hạn lỗ tối đa
  4. Xem xét thêm các yếu tố đảo ngược để xác định sự bền vững

Cơ hội gia tăng

Các hướng tối ưu hóa chính cho chiến lược FiboBuLL Wave:

  1. Thêm các chỉ số khối lượng ví dụ như đường A / D để tránh đột phá yếu
  2. Kết hợp các chỉ số mua quá mức / bán quá mức, ví dụ như RSI để cải thiện độ chính xác
  3. Tối ưu hóa các thông số như thời gian và độ lệch nhân dựa trên kết quả backtest
  4. Thiết lập dừng lỗ và lấy lợi nhuận để kiểm soát rủi ro và khóa lợi nhuận
  5. Xem xét các bộ lọc xu hướng và đảo ngược để xác định sự kiên trì theo hướng
  6. Kiểm tra các thông số tối ưu trên các sản phẩm và khung thời gian khác nhau

Với những cải tiến trên, sự ổn định và lợi nhuận của chiến lược FiboBuLL Wave có thể được cải thiện đáng kể.

Tóm lại

Chiến lược FiboBuLL Wave sử dụng nguyên tắc cơ bản của Bollinger Bands trong việc xác định các sự đột phá và đảo ngược sang dải giữa để theo dõi biến động giá. Với khái niệm đơn giản và khả năng áp dụng rộng rãi, nó phục vụ như một cách tiếp cận hiệu quả trong việc đo lường biến động thị trường.

Tuy nhiên, chỉ dựa vào breakout có xu hướng tạo ra các tín hiệu sai và whipsaws. Do đó, xác nhận sử dụng khối lượng, xu hướng, chỉ số vv phải được kết hợp để xác định độ tin cậy của breakout, trong khi thực hiện dừng lỗ / lấy lợi nhuận để kiểm soát rủi ro, để tối đa hóa tính hữu ích của chiến lược.

Chiến lược FiboBuLL Wave cung cấp một khuôn khổ cơ bản để thiết kế giao dịch dựa trên hành động giá. Với việc tối ưu hóa liên tục và tích hợp các yếu tố bổ sung, nó có tiềm năng trở thành một công cụ mạnh mẽ trong việc xây dựng các quyết định giao dịch.


/*backtest
start: 2022-11-24 00:00:00
end: 2023-11-30 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
//@FiboBuLL

strategy(shorttitle='FB Wave', title='FiboBuLL Wave (A version of Bollinger Bands Breakout Strategy By Trade Chartist)', overlay=true, pyramiding=1, currency=currency.NONE, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=100)

src = input(close, title='Source')
length = input.int(21, minval=1, title='SMA length')  // 20 for classis Bollinger Bands SMA line (basis)


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

Show = input.string('Both', options=['Longs Only', 'Shorts Only', 'Both'], title='Trade Type')
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 = ta.barssince(long)
S1 = ta.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=color.new(#ff0000, 75), display=display.all, title='Upper Band')
p2 = plot(lower, color=color.new(#008000, 75), display=display.all, 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.new(color.teal, 85), title='Top Fill')  //fill for basis-upper
fill(p, p2, color=color.rgb(217, 161, 161), title='Bottom Fill', transp=85)  //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')


// === INPUT BACKTEST RANGE ===
FromMonth = input.int(defval=1, title='From Month', minval=1, maxval=12)
FromDay = input.int(defval=1, title='From Day', minval=1, maxval=31)
FromYear = input.int(defval=2018, title='From Year', minval=2015)
ToMonth = input.int(defval=1, title='To Month', minval=1, maxval=12)
ToDay = input.int(defval=1, title='To Day', minval=1, maxval=31)
ToYear = input.int(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() =>
    time >= start and time <= finish ? true : false

if window() and (Show == 'Longs Only' or Show == 'Both')
    strategy.entry('AL', direction=strategy.long, when=longSignal)
    strategy.close('LongAL', when=shortSignal, comment='AL KAPA')

if window() and (Show == 'Shorts Only' or Show == 'Both')
    strategy.entry('SAT', direction=strategy.short, when=shortSignal)
    strategy.close('SAT', when=longSignal, comment='SAT KAPA')




















Thêm nữa