Tài nguyên đang được tải lên... tải...

Phân tích chiến lược Fibonacci Bollinger Bands thích nghi

Tác giả:ChaoZhang, Ngày: 2025-01-06 16:41:48
Tags:ATRBBSMAFIB

img

Tổng quan

Chiến lược này là một hệ thống giao dịch sáng tạo kết hợp chuỗi Fibonacci và Bollinger Bands. Nó thay thế các trình nhân sai lệch chuẩn truyền thống của Bollinger Bands bằng tỷ lệ Fibonacci (1.618, 2.618, 4.236), tạo ra một hệ thống đánh giá biến động giá độc đáo. Chiến lược bao gồm các tính năng quản lý giao dịch toàn diện, bao gồm cài đặt dừng lỗ / lấy lợi nhuận và bộ lọc cửa sổ thời gian giao dịch, làm cho nó rất thực tế và linh hoạt.

Nguyên tắc chiến lược

Các tín hiệu giao dịch được tạo ra khi giá vượt qua các dải Fibonacci được người dùng chọn. Cụ thể, tín hiệu dài được kích hoạt khi giá thấp nằm dưới và giá cao nằm trên dải mua mục tiêu; tín hiệu ngắn được kích hoạt khi giá thấp nằm dưới và giá cao nằm trên dải bán mục tiêu.

Ưu điểm chiến lược

  1. Khả năng thích nghi mạnh mẽ: Điều chỉnh chiều rộng băng thông một cách năng động thông qua ATR, thích nghi tốt hơn với các điều kiện thị trường khác nhau
  2. Độ linh hoạt cao: Người dùng có thể chọn các dải Fibonacci khác nhau làm tín hiệu giao dịch dựa trên phong cách giao dịch của họ
  3. Quản lý rủi ro toàn diện: Các chức năng lấy lợi nhuận / dừng lỗ và lọc thời gian tích hợp để kiểm soát rủi ro hiệu quả
  4. Nhận thức trực quan: Mức độ minh bạch khác nhau của các khu vực dải giúp các nhà giao dịch hiểu cấu trúc thị trường
  5. Logic tính toán rõ ràng: Sử dụng các kết hợp chỉ số kỹ thuật cổ điển, dễ hiểu và duy trì

Rủi ro chiến lược

  1. Rủi ro phá vỡ sai: Giá có thể ngay lập tức quay trở lại sau khi phá vỡ, tạo ra các tín hiệu sai
  2. Độ nhạy của các tham số: Các lựa chọn tỷ lệ Fibonacci khác nhau ảnh hưởng đáng kể đến hiệu suất chiến lược
  3. Tùy thuộc thời gian: Khi cửa sổ giao dịch được bật, có thể bỏ lỡ cơ hội giao dịch quan trọng
  4. Sự phụ thuộc vào môi trường thị trường: Có thể tạo ra tín hiệu quá mức trong các thị trường khác nhau

Hướng dẫn tối ưu hóa chiến lược

  1. Cơ chế xác nhận tín hiệu: đề xuất thêm các chỉ số khối lượng hoặc động lực để xác nhận đột phá
  2. Tối ưu hóa tham số động: Tự động điều chỉnh tỷ lệ Fibonacci dựa trên biến động thị trường
  3. Bộ lọc môi trường thị trường: Thêm chức năng xác định xu hướng, sử dụng các tham số khác nhau trong các điều kiện thị trường khác nhau
  4. Hệ thống cân nhắc tín hiệu: Thiết lập phân tích nhiều khung thời gian để cải thiện độ tin cậy tín hiệu
  5. Tối ưu hóa quản lý vị trí: Điều chỉnh kích thước vị trí một cách năng động dựa trên sự biến động của thị trường và sức mạnh tín hiệu

Tóm lại

Chiến lược này kết hợp sáng tạo các công cụ phân tích kỹ thuật cổ điển bằng cách tối ưu hóa các dải Bollinger truyền thống với trình tự Fibonacci. Ưu điểm chính của nó nằm trong khả năng thích nghi và linh hoạt, nhưng phải chú ý đến lựa chọn tham số và khả năng tương thích môi trường thị trường. Chiến lược có tiềm năng cải tiến đáng kể thông qua việc thêm các chỉ số xác nhận bổ sung và tối ưu hóa các cơ chế tạo tín hiệu.


/*backtest
start: 2019-12-23 08:00:00
end: 2025-01-04 08:00:00
period: 1d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
// © sapphire_edge 

// # ========================================================================= #
// #                  
// #        _____                   __    _              ______    __         
// #      / ___/____ _____  ____  / /_  (_)_______     / ____/___/ /___ ____ 
// #      \__ \/ __ `/ __ \/ __ \/ __ \/ / ___/ _ \   / __/ / __  / __ `/ _ \
// #     ___/ / /_/ / /_/ / /_/ / / / / / /  /  __/  / /___/ /_/ / /_/ /  __/
// #    /____/\__,_/ .___/ .___/_/ /_/_/_/   \___/  /_____/\__,_/\__, /\___/ 
// #              /_/   /_/                                     /____/       
// #                                      
// # ========================================================================= #

strategy(shorttitle="⟡Sapphire⟡ FiboBands Strategy", title="[Sapphire] Fibonacci Bollinger Bands Strategy", initial_capital= 50000, currency= currency.USD,default_qty_value = 1,commission_type= strategy.commission.cash_per_contract,overlay= true )

// # ========================================================================= #
// #                       // Settings Menu //
// # ========================================================================= #

// --------------------    Main Settings    -------------------- //
groupFiboBands = "FiboBands"
length = input.int(20, minval = 1, title = 'Length', group=groupFiboBands)
src = input(close, title = 'Source', group=groupFiboBands)
offset = input.int(0, 'Offset', minval = -500, maxval = 500, group=groupFiboBands)

fibo1 = input(defval = 1.618, title = 'Fibonacci Ratio 1', group=groupFiboBands)
fibo2 = input(defval = 2.618, title = 'Fibonacci Ratio 2', group=groupFiboBands)
fibo3 = input(defval = 4.236, title = 'Fibonacci Ratio 3', group=groupFiboBands)

fiboBuy = input.string(options = ['Fibo 1', 'Fibo 2', 'Fibo 3'], defval = 'Fibo 1', title = 'Fibonacci Buy', group=groupFiboBands)
fiboSell = input.string(options = ['Fibo 1', 'Fibo 2', 'Fibo 3'], defval = 'Fibo 1', title = 'Fibonacci Sell', group=groupFiboBands)

showSignals = input.bool(true, title="Show Signals", group=groupFiboBands)
signalOffset = input.int(5, title="Signal Vertical Offset", group=groupFiboBands)

// --------------------    Trade Management Inputs    -------------------- //
groupTradeManagement = "Trade Management"
useProfitPerc    = input.bool(false, title="Enable Profit Target", group=groupTradeManagement)
takeProfitPerc  = input.float(1.0, title="Take Profit (%)", step=0.1, group=groupTradeManagement)
useStopLossPerc    = input.bool(false, title="Enable Stop Loss", group=groupTradeManagement)
stopLossPerc    = input.float(1.0, title="Stop Loss (%)", step=0.1, group=groupTradeManagement)

// --------------------    Time Filter Inputs    -------------------- //
groupTimeOfDayFilter = "Time of Day Filter"
useTimeFilter1  = input.bool(false, title="Enable Time Filter 1", group=groupTimeOfDayFilter)
startHour1      = input.int(0, title="Start Hour (24-hour format)", minval=0, maxval=23, group=groupTimeOfDayFilter)
startMinute1    = input.int(0, title="Start Minute", minval=0, maxval=59, group=groupTimeOfDayFilter)
endHour1        = input.int(23, title="End Hour (24-hour format)", minval=0, maxval=23, group=groupTimeOfDayFilter)
endMinute1      = input.int(45, title="End Minute", minval=0, maxval=59, group=groupTimeOfDayFilter)
closeAtEndTimeWindow = input.bool(false, title="Close Trades at End of Time Window", group=groupTimeOfDayFilter)

// --------------------    Trading Window    -------------------- //
isWithinTradingWindow(startHour, startMinute, endHour, endMinute) =>
    nyTime            = timestamp("America/New_York", year, month, dayofmonth, hour, minute)
    nyHour            = hour(nyTime)
    nyMinute          = minute(nyTime)
    timeInMinutes     = nyHour * 60 + nyMinute
    startInMinutes    = startHour * 60 + startMinute
    endInMinutes      = endHour * 60 + endMinute
    timeInMinutes    >= startInMinutes and timeInMinutes <= endInMinutes

timeCondition =  (useTimeFilter1 ? isWithinTradingWindow(startHour1, startMinute1, endHour1, endMinute1) : true)

// Check if the current bar is the last one within the specified time window
isEndOfTimeWindow() =>
    nyTime            = timestamp("America/New_York", year, month, dayofmonth, hour, minute)
    nyHour            = hour(nyTime)
    nyMinute          = minute(nyTime)
    timeInMinutes     = nyHour * 60 + nyMinute
    endInMinutes      = endHour1 * 60 + endMinute1
    timeInMinutes == endInMinutes

// Logic to close trades if the time window ends
if timeCondition and closeAtEndTimeWindow and isEndOfTimeWindow()
    strategy.close_all(comment="Closing trades at end of time window")

// # ========================================================================= #
// #                       // Calculations //
// # ========================================================================= #

sma = ta.sma(src, length)
atr = ta.atr(length)

ratio1 = atr * fibo1
ratio2 = atr * fibo2
ratio3 = atr * fibo3

upper3 = sma + ratio3
upper2 = sma + ratio2
upper1 = sma + ratio1

lower1 = sma - ratio1
lower2 = sma - ratio2
lower3 = sma - ratio3

// # ========================================================================= #
// #                       // Signal Logic //
// # ========================================================================= #

// --------------------    Entry Logic    -------------------- //
targetBuy = fiboBuy == 'Fibo 1' ? upper1 : fiboBuy == 'Fibo 2' ? upper2 : upper3
buy = low < targetBuy and high > targetBuy

// --------------------    User-Defined Exit Logic    -------------------- //
targetSell = fiboSell == 'Fibo 1' ? lower1 : fiboSell == 'Fibo 2' ? lower2 : lower3
sell = low < targetSell and high > targetSell

// # ========================================================================= #
// #                       // Strategy Management //
// # ========================================================================= #

// --------------------    Trade Execution Flags    -------------------- //
var bool buyExecuted = false
var bool sellExecuted = false

float labelOffset = ta.atr(14) * signalOffset

// --------------------    Buy Logic    -------------------- //
if buy and timeCondition 
    if useProfitPerc or useStopLossPerc
        strategy.entry("Buy", strategy.long, stop=(useStopLossPerc ? close * (1 - stopLossPerc / 100) : na), limit=(useProfitPerc ? close * (1 + takeProfitPerc / 100) : na))
    else
        strategy.entry("Buy", strategy.long)

    if showSignals and not buyExecuted
        buyExecuted := true  
        sellExecuted := false  
        label.new(bar_index, high - labelOffset, "◭", style=label.style_label_up, color = color.rgb(119, 0, 255, 20), textcolor=color.white)

// --------------------    Sell Logic    -------------------- //
if sell and timeCondition
    if useProfitPerc or useStopLossPerc
        strategy.entry("Sell", strategy.short, stop=(useStopLossPerc ? close * (1 + stopLossPerc / 100) : na), limit=(useProfitPerc ? close * (1 - takeProfitPerc / 100) : na))
    else
        strategy.entry("Sell", strategy.short)

    if showSignals and not sellExecuted
        sellExecuted := true 
        buyExecuted := false  
        label.new(bar_index, low + labelOffset, "⧩", style=label.style_label_down, color = color.rgb(255, 85, 0, 20), textcolor=color.white)



// # ========================================================================= #
// #                         // Plots and Charts //
// # ========================================================================= #

plot(sma, style = plot.style_line, title = 'Basis', color = color.new(color.orange, 0), linewidth = 2, offset = offset)

upp3 = plot(upper3, title = 'Upper 3', color = color.new(color.teal, 90), offset = offset)
upp2 = plot(upper2, title = 'Upper 2', color = color.new(color.teal, 60), offset = offset)
upp1 = plot(upper1, title = 'Upper 1', color = color.new(color.teal, 30), offset = offset)

low1 = plot(lower1, title = 'Lower 1', color = color.new(color.teal, 30), offset = offset)
low2 = plot(lower2, title = 'Lower 2', color = color.new(color.teal, 60), offset = offset)
low3 = plot(lower3, title = 'Lower 3', color = color.new(color.teal, 90), offset = offset)

fill(upp3, low3, title = 'Background', color = color.new(color.teal, 95))


Có liên quan

Thêm nữa