Chiến lược giao dịch theo xu hướng nâng cao dựa trên dải Bollinger và mô hình nến

BB ATR RR PSR MA SD WBR
Ngày tạo: 2024-11-27 14:18:33 sửa đổi lần cuối: 2024-11-27 14:18:33
sao chép: 1 Số nhấp chuột: 413
1
tập trung vào
1617
Người theo dõi

Chiến lược giao dịch theo xu hướng nâng cao dựa trên dải Bollinger và mô hình nến

Tổng quan

Đây là một chiến lược theo dõi xu hướng dựa trên phân tích hình dạng Bollinger Bands và Bollinger Graphs. Chiến lược này chủ yếu dựa trên việc quan sát các đặc điểm hình dạng Bollinger Graphs khi giá chạm vào Bollinger Bands, kết hợp với mối quan hệ tỷ lệ của đường dẫn lên xuống với thực thể để đánh giá điểm đảo ngược có thể xảy ra trên thị trường.

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

Lập luận cốt lõi của chiến lược dựa trên một số yếu tố quan trọng sau: đầu tiên, xác định phạm vi biến động giá bằng cách tính toán Bollinger 20 chu kỳ; thứ hai, phân tích tỷ lệ của đường dẫn lên xuống của biểu đồ khi giá chạm vào vùng Bollinger, được coi là tín hiệu đảo ngược tiềm năng khi tỷ lệ vượt quá ngưỡng thiết lập; thứ ba, thiết lập điểm dừng lỗ bằng cách tính toán các ngưỡng hỗ trợ quan trọng và ngưỡng kháng cự; và cuối cùng, tính toán số lượng nắm giữ mỗi giao dịch dựa trên tỷ lệ cố định của tổng tài khoản (%) để quản lý rủi ro.

Lợi thế chiến lược

  1. Kiểm soát rủi ro chính xác: Sử dụng mô hình quản lý rủi ro tỷ lệ cố định để đảm bảo các lỗ hổng rủi ro cho mỗi giao dịch nằm trong phạm vi có thể kiểm soát được
  2. Tính linh hoạt điểm vào: cung cấp nhiều lựa chọn giá vào để thích nghi với phong cách giao dịch khác nhau
  3. Kết hợp các chỉ số kỹ thuật: kết hợp các dải Bollinger Bands với phân tích hình dạng photon để cải thiện độ tin cậy của tín hiệu
  4. Cài đặt dừng lỗ hợp lý: Cài đặt dừng lỗ theo quy luật hoạt động của thị trường thông qua các điểm kháng cự hỗ trợ quan trọng
  5. Quản lý giao dịch hoàn hảo: bao gồm cơ chế hết hạn lệnh, tránh các hoạt động sai lầm do tín hiệu hết hạn

Rủi ro chiến lược

  1. Rủi ro biến động thị trường nhanh chóng: tỷ lệ dẫn có thể tạo ra tín hiệu sai trong thị trường biến động mạnh
  2. Rủi ro quản lý vốn: Mô hình rủi ro tỷ lệ cố định có thể dẫn đến vị trí quá nhỏ trong trường hợp thua lỗ liên tục
  3. Rủi ro thiết lập dừng lỗ: Tính toán mức kháng cự hỗ trợ có thể không chính xác trong một số điều kiện thị trường
  4. Tùy thuộc vào chu kỳ thời gian: chiến lược chủ yếu dựa trên cấp độ mặt trời, có thể bỏ lỡ cơ hội trong khung thời gian nhỏ hơn

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

  1. Tiến hành số lượng giao dịch: có thể tăng độ tin cậy của tín hiệu bằng cách tăng phân tích số lượng giao dịch khi xác nhận tín hiệu
  2. Tối ưu hóa cơ chế dừng lỗ: xem xét việc giới thiệu dừng động, tự động điều chỉnh khoảng cách dừng lỗ theo biến động của thị trường
  3. Thêm bộ lọc môi trường thị trường: thêm các chỉ số cường độ xu hướng, điều chỉnh các tham số chiến lược trong các môi trường thị trường khác nhau
  4. Cải thiện quản lý vị trí: xem xét việc giới thiệu cơ chế quản lý vị trí động, điều chỉnh lỗ hổng rủi ro theo biến động của thị trường
  5. Thêm bộ lọc thời gian: có thể thêm bộ lọc thời gian để tránh giao dịch trong thời gian thị trường biến động lớn

Tóm tắt

Chiến lược này đã xây dựng một hệ thống giao dịch tương đối hoàn hảo bằng cách kết hợp các công cụ phân tích kỹ thuật cổ điển với các phương pháp quản lý rủi ro hiện đại. Điểm mạnh cốt lõi của chiến lược là kiểm soát rủi ro nghiêm ngặt và cơ chế nhập cảnh linh hoạt, nhưng đồng thời cũng cần chú ý đến sự thay đổi của môi trường thị trường và xác minh độ tin cậy của tín hiệu trong ứng dụng thực tế.

Mã nguồn chiến lược
/*backtest
start: 2024-01-01 00:00:00
end: 2024-11-26 00:00:00
period: 12h
basePeriod: 12h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Trade Entry Detector, based on Wick to Body Ratio when price tests Bollinger Bands", overlay=true, default_qty_type=strategy.fixed)

// Input for primary analysis time frame
timeFrame = "D"  // Daily time frame

// Bollinger Band settings
length = input.int(20, title="Bollinger Band Length", minval=1)
mult = input.float(2.0, title="Standard Deviation Multiplier", minval=0.1)
source = input(close, title="Source")

// Entry ratio settings
wickToBodyRatio = input.float(1.0, title="Minimum Wick-to-Body Ratio", minval=0)

// Order Fill Timing Option
fillOption = input.string("Daily Close", title="Order Fill Timing", options=["Daily Close", "Daily Open", "HOD", "LOD"])

// Account and risk settings
accountBalance = 100000  // Account balance in dollars
riskPercentage = 1.0     // Risk percentage per trade
riskAmount = (riskPercentage / 100) * accountBalance // Fixed 1% risk amount

// Request daily data for calculations
dailyHigh = request.security(syminfo.tickerid, timeFrame, high)
dailyLow = request.security(syminfo.tickerid, timeFrame, low)
dailyClose = request.security(syminfo.tickerid, timeFrame, close)
dailyOpen = request.security(syminfo.tickerid, timeFrame, open)

// Calculate Bollinger Bands on the daily time frame
dailyBasis = request.security(syminfo.tickerid, timeFrame, ta.sma(source, length))
dailyDev = mult * request.security(syminfo.tickerid, timeFrame, ta.stdev(source, length))
dailyUpperBand = dailyBasis + dailyDev
dailyLowerBand = dailyBasis - dailyDev

// Calculate the body and wick sizes on the daily time frame
dailyBodySize = math.abs(dailyOpen - dailyClose)
dailyUpperWickSize = dailyHigh - math.max(dailyOpen, dailyClose)
dailyLowerWickSize = math.min(dailyOpen, dailyClose) - dailyLow

// Conditions for a candle with an upper wick or lower wick that touches the Bollinger Bands
upperWickCondition = (dailyUpperWickSize / dailyBodySize >= wickToBodyRatio) and (dailyHigh > dailyUpperBand)
lowerWickCondition = (dailyLowerWickSize / dailyBodySize >= wickToBodyRatio) and (dailyLow < dailyLowerBand)

// Define the swing high and swing low for stop loss placement
var float swingLow = na
var float swingHigh = na

if (ta.pivothigh(dailyHigh, 5, 5))
    swingHigh := dailyHigh[5]

if (ta.pivotlow(dailyLow, 5, 5))
    swingLow := dailyLow[5]

// Determine entry price based on chosen fill option
var float longEntryPrice = na
var float shortEntryPrice = na

if lowerWickCondition
    longEntryPrice := fillOption == "Daily Close" ? dailyClose :
                      fillOption == "Daily Open" ? dailyOpen :
                      fillOption == "HOD" ? dailyHigh : dailyLow

if upperWickCondition
    shortEntryPrice := fillOption == "Daily Close" ? dailyClose :
                       fillOption == "Daily Open" ? dailyOpen :
                       fillOption == "HOD" ? dailyHigh : dailyLow

// Execute the long and short entries with expiration
var int longOrderExpiry = na
var int shortOrderExpiry = na

if not na(longEntryPrice)
    longOrderExpiry := bar_index + 2  // Order expires after 2 days

if not na(shortEntryPrice)
    shortOrderExpiry := bar_index + 2  // Order expires after 2 days

// Check expiration and execute orders
if (longEntryPrice and bar_index <= longOrderExpiry and high >= longEntryPrice)
    longStopDistance = close - nz(swingLow, close)
    longPositionSize = longStopDistance > 0 ? riskAmount / longStopDistance : na
    if (not na(longPositionSize))
        strategy.entry("Long", strategy.long, qty=longPositionSize)
    longEntryPrice := na  // Reset after entry

if (shortEntryPrice and bar_index <= shortOrderExpiry and low <= shortEntryPrice)
    shortStopDistance = nz(swingHigh, close) - close
    shortPositionSize = shortStopDistance > 0 ? riskAmount / shortStopDistance : na
    if (not na(shortPositionSize))
        strategy.entry("Short", strategy.short, qty=shortPositionSize)
    shortEntryPrice := na  // Reset after entry

// Exit logic: hit the opposing Bollinger Band
if (strategy.position_size > 0) // Long position
    strategy.exit("Exit Long", "Long", limit=dailyUpperBand)
else if (strategy.position_size < 0) // Short position
    strategy.exit("Exit Short", "Short", limit=dailyLowerBand)

if (strategy.position_size > 0) // Long position
    strategy.exit("Stop Loss Long", "Long", stop=swingLow)
else if (strategy.position_size < 0) // Short position
    strategy.exit("Stop Loss Short", "Short", stop=swingHigh)

// Plot daily Bollinger Bands and levels on the chosen time frame
plot(dailyUpperBand, color=color.blue, linewidth=1, title="Daily Upper Bollinger Band")
plot(dailyLowerBand, color=color.blue, linewidth=1, title="Daily Lower Bollinger Band")
plot(dailyBasis, color=color.gray, linewidth=1, title="Daily Middle Bollinger Band")